├── client ├── src │ ├── App.css │ ├── main.jsx │ ├── components │ │ ├── Profile.jsx │ │ ├── ViewTaskModal.jsx │ │ ├── CreateTaskModal.jsx │ │ ├── Login.jsx │ │ ├── Register.jsx │ │ ├── UpdateTaskModal.jsx │ │ ├── Navbar.jsx │ │ └── Home.jsx │ └── App.jsx ├── vite.config.js ├── .gitignore ├── README.md ├── .eslintrc.cjs ├── index.html ├── package.json └── public │ └── vite.svg ├── server ├── middlewares │ ├── catchAsyncErrors.js │ ├── auth.js │ └── error.js ├── server.js ├── database │ └── dbConnection.js ├── utils │ └── jwtToken.js ├── routes │ ├── userRouter.js │ └── taskRouter.js ├── package.json ├── models │ ├── taskSchema.js │ └── userSchema.js ├── app.js ├── controller │ ├── taskController.js │ └── userController.js └── package-lock.json └── .gitignore /client/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/middlewares/catchAsyncErrors.js: -------------------------------------------------------------------------------- 1 | export const catchAsyncErrors = (theFunction) => { 2 | return (req, res, next) => { 3 | Promise.resolve(theFunction(req, res, next)).catch(next); 4 | }; 5 | }; 6 | -------------------------------------------------------------------------------- /client/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /client/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React, { createContext, useState } from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App.jsx"; 4 | import "bootstrap/dist/css/bootstrap.min.css"; 5 | 6 | ReactDOM.createRoot(document.getElementById("root")).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | import app from "./app.js"; 2 | import cloudinary from "cloudinary"; 3 | 4 | cloudinary.v2.config({ 5 | cloud_name: process.env.CLOUDINARY_CLIENT_NAME, 6 | api_key: process.env.CLOUDINARY_CLIENT_API, 7 | api_secret: process.env.CLOUDINARY_CLIENT_SECRET, 8 | }); 9 | 10 | app.listen(process.env.PORT, () => { 11 | console.log(`Server Listening on port: ${process.env.PORT}`); 12 | }); 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | /client/node_modules 11 | /server/node_modules 12 | /server/config 13 | dist 14 | dist-ssr 15 | *.local 16 | 17 | # Editor directories and files 18 | .vscode/* 19 | !.vscode/extensions.json 20 | .idea 21 | .DS_Store 22 | *.suo 23 | *.ntvs* 24 | *.njsproj 25 | *.sln 26 | *.sw? 27 | -------------------------------------------------------------------------------- /server/database/dbConnection.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | 3 | export const dbConnection = () => { 4 | mongoose 5 | .connect(process.env.MONGO_URI, { 6 | dbName: "MERN_STACK_TASK_MANAGEMENT", 7 | }) 8 | .then(() => { 9 | console.log("Connected to database!"); 10 | }) 11 | .catch((err) => { 12 | console.log(`Some error occured while connecting to database! : ${err}`); 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /server/utils/jwtToken.js: -------------------------------------------------------------------------------- 1 | export const sendToken = (message, user, res, statusCode) => { 2 | const token = user.getJWTToken(); 3 | const options = { 4 | expires: new Date( 5 | Date.now() + process.env.COOKIE_EXPIRE * 24 * 60 * 60 * 1000 6 | ), 7 | httpOnly: true, 8 | }; 9 | res.status(statusCode).cookie("token", token, options).json({ 10 | success: true, 11 | user, 12 | message, 13 | token, 14 | }); 15 | }; 16 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # React + Vite 2 | 3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. 4 | 5 | Currently, two official plugins are available: 6 | 7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh 8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh 9 | -------------------------------------------------------------------------------- /server/routes/userRouter.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import { 3 | login, 4 | logout, 5 | myProfile, 6 | register, 7 | } from "../controller/userController.js"; 8 | import { isAuthenticated } from "../middlewares/auth.js"; 9 | 10 | const router = express.Router(); 11 | 12 | router.post("/login", login); 13 | router.get("/logout", isAuthenticated, logout); 14 | router.get("/me", isAuthenticated, myProfile); 15 | router.post("/register", register); 16 | 17 | export default router; 18 | -------------------------------------------------------------------------------- /server/middlewares/auth.js: -------------------------------------------------------------------------------- 1 | import ErrorHandler from "./error.js"; 2 | import jwt from "jsonwebtoken"; 3 | import { User } from "../models/userSchema.js"; 4 | import { catchAsyncErrors } from "./catchAsyncErrors.js"; 5 | 6 | export const isAuthenticated = catchAsyncErrors(async (req, res, next) => { 7 | const { token } = req.cookies; 8 | if (!token) { 9 | return next(new ErrorHandler("User is not authenticated!", 400)); 10 | } 11 | const decoded = jwt.verify(token, process.env.JWT_SECRET_KEY); 12 | 13 | req.user = await User.findById(decoded.id); 14 | 15 | next(); 16 | }); 17 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "start": "node server.js", 9 | "dev": "nodemon server.js" 10 | }, 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "bcrypt": "^5.1.1", 15 | "cloudinary": "^2.0.1", 16 | "cookie-parser": "^1.4.6", 17 | "cors": "^2.8.5", 18 | "dotenv": "^16.4.4", 19 | "express": "^4.18.2", 20 | "express-fileupload": "^1.4.3", 21 | "jsonwebtoken": "^9.0.2", 22 | "mongoose": "^8.1.2", 23 | "validator": "^13.11.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /server/routes/taskRouter.js: -------------------------------------------------------------------------------- 1 | import { 2 | createTask, 3 | deleteTask, 4 | getMyTask, 5 | getSingleTask, 6 | updateTask, 7 | } from "../controller/taskController.js"; 8 | import express from "express"; 9 | import { isAuthenticated } from "../middlewares/auth.js"; 10 | 11 | const router = express.Router(); 12 | 13 | router.post("/post", isAuthenticated, createTask); 14 | router.delete("/delete/:id", isAuthenticated, deleteTask); 15 | router.put("/update/:id", isAuthenticated, updateTask); 16 | router.get("/mytask", isAuthenticated, getMyTask); 17 | router.get("/single/:id", isAuthenticated, getSingleTask); 18 | 19 | export default router; 20 | -------------------------------------------------------------------------------- /server/middlewares/error.js: -------------------------------------------------------------------------------- 1 | class ErrorHandler extends Error { 2 | constructor(message, statusCode) { 3 | super(message); 4 | this.statusCode = statusCode; 5 | } 6 | } 7 | 8 | export const errorMiddleware = (err, req, res, next) => { 9 | err.message = err.message || "Internal Server Error"; 10 | err.statusCode = err.statusCode || 500; 11 | 12 | if (err.name === "CastError") { 13 | const message = `${err.path}`; 14 | err = new ErrorHandler(message, 400); 15 | } 16 | 17 | return res.status(err.statusCode).json({ 18 | success: false, 19 | message: err.message, 20 | }); 21 | }; 22 | 23 | export default ErrorHandler; 24 | -------------------------------------------------------------------------------- /server/models/taskSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | 3 | const taskSchema = new mongoose.Schema({ 4 | title: { 5 | type: String, 6 | }, 7 | description: { 8 | type: String, 9 | }, 10 | status: { 11 | type: String, 12 | enum: ["completed", "incomplete"], 13 | default: "incomplete", 14 | }, 15 | archived: { 16 | type: Boolean, 17 | default: false, 18 | }, 19 | createdBy: { 20 | type: mongoose.Schema.ObjectId, 21 | required: true, 22 | }, 23 | createdAt: { 24 | type: Date, 25 | default: Date.now, 26 | }, 27 | }); 28 | 29 | export const Task = mongoose.model("Task", taskSchema); 30 | -------------------------------------------------------------------------------- /client/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:react/recommended', 7 | 'plugin:react/jsx-runtime', 8 | 'plugin:react-hooks/recommended', 9 | ], 10 | ignorePatterns: ['dist', '.eslintrc.cjs'], 11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, 12 | settings: { react: { version: '18.2' } }, 13 | plugins: ['react-refresh'], 14 | rules: { 15 | 'react/jsx-no-target-blank': 'off', 16 | 'react-refresh/only-export-components': [ 17 | 'warn', 18 | { allowConstantExport: true }, 19 | ], 20 | }, 21 | } 22 | -------------------------------------------------------------------------------- /client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React 8 | 9 | 10 |
11 | 12 | 13 | 17 | 18 | 22 | 23 | 27 | 28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "axios": "^1.6.7", 14 | "bootstrap": "^5.3.3", 15 | "react": "^18.2.0", 16 | "react-bootstrap": "^2.10.1", 17 | "react-dom": "^18.2.0", 18 | "react-hot-toast": "^2.4.1", 19 | "react-icons": "^5.0.1", 20 | "react-router-dom": "^6.22.0", 21 | "react-spinners": "^0.13.8" 22 | }, 23 | "devDependencies": { 24 | "@types/react": "^18.2.55", 25 | "@types/react-dom": "^18.2.19", 26 | "@vitejs/plugin-react-swc": "^3.5.0", 27 | "eslint": "^8.56.0", 28 | "eslint-plugin-react": "^7.33.2", 29 | "eslint-plugin-react-hooks": "^4.6.0", 30 | "eslint-plugin-react-refresh": "^0.4.5", 31 | "vite": "^5.1.0" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import dotenv from "dotenv"; 3 | import cookieParser from "cookie-parser"; 4 | import cors from "cors"; 5 | import { dbConnection } from "./database/dbConnection.js"; 6 | import fileUpload from "express-fileupload"; 7 | import { errorMiddleware } from "./middlewares/error.js"; 8 | import userRouter from "./routes/userRouter.js"; 9 | import taskRouter from "./routes/taskRouter.js"; 10 | 11 | const app = express(); 12 | dotenv.config({ path: "./config/config.env" }); 13 | 14 | app.use( 15 | cors({ 16 | origin: [process.env.FRONTEND_URL], 17 | methods: ["GET", "PUT", "DELETE", "POST"], 18 | credentials: true, 19 | }) 20 | ); 21 | 22 | app.use(cookieParser()); 23 | app.use(express.json()); 24 | app.use(express.urlencoded({ extended: true })); 25 | 26 | app.use( 27 | fileUpload({ 28 | useTempFiles: true, 29 | tempFileDir: "/tmp/", 30 | }) 31 | ); 32 | 33 | app.use("/api/v1/user", userRouter); 34 | app.use("/api/v1/task", taskRouter); 35 | 36 | dbConnection(); 37 | 38 | app.use(errorMiddleware); 39 | 40 | export default app; 41 | -------------------------------------------------------------------------------- /client/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/src/components/Profile.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Container, Stack } from "react-bootstrap"; 3 | import { Navigate } from "react-router-dom"; 4 | 5 | const Profile = ({ user, isAuthenticated }) => { 6 | if (!isAuthenticated) { 7 | return ; 8 | } 9 | return ( 10 | <> 11 | 12 |

PROFILE

13 | {user && ( 14 | 15 | 16 | avatar 26 | 27 | 28 |

NAME:

29 |

{user.name}

30 |
31 | 32 |

EMAIL:

33 |

{user.email}

34 |
35 | 36 |

PHONE:

37 |

{user.phone}

38 |
39 |
40 | )} 41 |
42 | 43 | ); 44 | }; 45 | 46 | export default Profile; 47 | -------------------------------------------------------------------------------- /client/src/components/ViewTaskModal.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import React, { useEffect, useState } from "react"; 3 | import { Button, Modal, Stack } from "react-bootstrap"; 4 | import toast from "react-hot-toast"; 5 | 6 | const ViewTaskModal = ({ showViewModal, handleViewModalClose, id }) => { 7 | const [task, setTask] = useState([]); 8 | useEffect(() => { 9 | const getSingleTask = async () => { 10 | await axios 11 | .get(`http://localhost:4000/api/v1/task/single/${id}`, { 12 | withCredentials: true, 13 | }) 14 | .then((res) => { 15 | setTask(res.data.task); 16 | }) 17 | .catch((error) => { 18 | console.log(error.response.data.message); 19 | }); 20 | }; 21 | if (id) { 22 | getSingleTask(); 23 | } 24 | }, [id]); 25 | 26 | return ( 27 | <> 28 | 29 | 30 | View Task 31 | 32 | 33 | 34 |

Title

35 |

{task && task.title}

36 |
37 | 38 |

Description

39 |

{task && task.description}

40 |
41 |
42 | 43 | 46 | 47 |
48 | 49 | ); 50 | }; 51 | 52 | export default ViewTaskModal; 53 | -------------------------------------------------------------------------------- /server/models/userSchema.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | import validator from "validator"; 3 | import bcrypt from "bcrypt"; 4 | import jwt from "jsonwebtoken"; 5 | 6 | const userSchema = new mongoose.Schema({ 7 | name: { 8 | type: String, 9 | required: [true, "Please provide your name!"], 10 | minLength: [3, "Name must contain at least 3 characters!"], 11 | maxLength: [30, "Name cannot exceed 30 characters!"], 12 | }, 13 | email: { 14 | type: String, 15 | required: [true, "Please provide your email!"], 16 | unique: [true, "User already registered!"], 17 | validate: [validator.isEmail, "Please provide valid email!"], 18 | }, 19 | phone: { 20 | type: Number, 21 | required: [true, "Please provide your phone number!"], 22 | }, 23 | password: { 24 | type: String, 25 | required: [true, "Please provide your password!"], 26 | minLength: [8, "Password must contain at least 8 characters!"], 27 | maxLength: [32, "Password cannot exceed 32 characters!"], 28 | select: false, 29 | }, 30 | avatar: { 31 | public_id: { 32 | type: String, 33 | required: true, 34 | }, 35 | url: { 36 | type: String, 37 | required: true, 38 | }, 39 | }, 40 | createdAt: { 41 | type: Date, 42 | default: Date.now, 43 | }, 44 | }); 45 | 46 | userSchema.pre("save", async function () { 47 | if (!this.isModified("password")) { 48 | next(); 49 | } 50 | this.password = await bcrypt.hash(this.password, 10); 51 | }); 52 | 53 | userSchema.methods.comparePassword = async function (enteredPassword) { 54 | return await bcrypt.compare(enteredPassword, this.password); 55 | }; 56 | 57 | userSchema.methods.getJWTToken = function () { 58 | return jwt.sign({ id: this._id }, process.env.JWT_SECRET_KEY, { 59 | expiresIn: process.env.JWT_EXPIRES, 60 | }); 61 | }; 62 | 63 | export const User = mongoose.model("User", userSchema); 64 | -------------------------------------------------------------------------------- /server/controller/taskController.js: -------------------------------------------------------------------------------- 1 | import { catchAsyncErrors } from "../middlewares/catchAsyncErrors.js"; 2 | import ErrorHandler from "../middlewares/error.js"; 3 | import { Task } from "../models/taskSchema.js"; 4 | 5 | export const createTask = catchAsyncErrors(async (req, res, next) => { 6 | const { title, description } = req.body; 7 | const createdBy = req.user._id; 8 | const task = await Task.create({ 9 | title, 10 | description, 11 | createdBy, 12 | }); 13 | res.status(200).json({ 14 | success: true, 15 | task, 16 | message: "Task Created", 17 | }); 18 | }); 19 | export const deleteTask = catchAsyncErrors(async (req, res, next) => { 20 | const { id } = req.params; 21 | const task = await Task.findById(id); 22 | if (!task) { 23 | return next(new ErrorHandler("Task not found!", 400)); 24 | } 25 | await task.deleteOne(); 26 | res.status(200).json({ 27 | success: true, 28 | message: "Task Deleted!", 29 | }); 30 | }); 31 | export const updateTask = catchAsyncErrors(async (req, res, next) => { 32 | const { id } = req.params; 33 | let task = await Task.findById(id); 34 | if (!task) { 35 | return next(new ErrorHandler("Task not found!", 400)); 36 | } 37 | task = await Task.findByIdAndUpdate(id, req.body, { 38 | new: true, 39 | runValidators: true, 40 | useFindAndModify: false, 41 | }); 42 | res.status(200).json({ 43 | success: true, 44 | message: "Task Updated!", 45 | task, 46 | }); 47 | }); 48 | export const getMyTask = catchAsyncErrors(async (req, res, next) => { 49 | const user = req.user._id; 50 | const tasks = await Task.find({ createdBy: user }); 51 | res.status(200).json({ 52 | success: true, 53 | tasks, 54 | }); 55 | }); 56 | export const getSingleTask = catchAsyncErrors(async (req, res, next) => { 57 | const { id } = req.params; 58 | let task = await Task.findById(id); 59 | if (!task) { 60 | return next(new ErrorHandler("Task not found!", 400)); 61 | } 62 | res.status(200).json({ 63 | success: true, 64 | task, 65 | }); 66 | }); 67 | -------------------------------------------------------------------------------- /client/src/components/CreateTaskModal.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import React, { useEffect, useState } from "react"; 3 | import { Button, Modal, Stack } from "react-bootstrap"; 4 | import toast from "react-hot-toast"; 5 | 6 | const CreateTaskModal = ({ 7 | showCreateModal, 8 | handleCreateModalClose, 9 | setTasks, 10 | }) => { 11 | const [title, setTitle] = useState(""); 12 | const [description, setDescription] = useState(""); 13 | 14 | const handleCreateTask = async () => { 15 | await axios 16 | .post( 17 | "http://localhost:4000/api/v1/task/post", 18 | { title, description }, 19 | { 20 | withCredentials: true, 21 | headers: { "Content-Type": "application/json" }, 22 | } 23 | ) 24 | .then((res) => { 25 | toast.success(res.data.message); 26 | setTasks((prevTasks) => [...prevTasks, res.data.task]); 27 | setTitle(""); 28 | setDescription(""); 29 | handleCreateModalClose(); 30 | }) 31 | .catch((error) => { 32 | toast.error(error.response.data.message); 33 | }); 34 | }; 35 | 36 | return ( 37 | <> 38 | 39 | 40 | Create Task 41 | 42 | 43 | 44 | 45 | setTitle(e.target.value)} 50 | /> 51 | 52 |
53 | 54 | 55 | setDescription(e.target.value)} 60 | /> 61 | 62 |
63 | 64 | 67 | 70 | 71 |
72 | 73 | ); 74 | }; 75 | 76 | export default CreateTaskModal; 77 | -------------------------------------------------------------------------------- /client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; 3 | import Home from "./components/Home"; 4 | import Navbar from "./components/Navbar"; 5 | import Register from "./components/Register"; 6 | import { Toaster } from "react-hot-toast"; 7 | import axios from "axios"; 8 | import Login from "./components/Login"; 9 | import Profile from "./components/Profile"; 10 | const App = () => { 11 | const [isAuthenticated, setIsAuthenticated] = useState(false); 12 | const [tasks, setTasks] = useState([]); 13 | const [user, setUser] = useState({}); 14 | const [taskTitle, setTaskTitle] = useState("Tasks"); 15 | 16 | useEffect(() => { 17 | const handleGetUser = async () => { 18 | try { 19 | const { data } = await axios.get( 20 | "http://localhost:4000/api/v1/user/me", 21 | { withCredentials: true } 22 | ); 23 | setIsAuthenticated(true); 24 | setUser(data.user); 25 | } catch (error) { 26 | console.log("USER IS NOT AUTHENTICATED!"); 27 | setIsAuthenticated(false); 28 | setUser({}); 29 | } 30 | }; 31 | handleGetUser(); 32 | }, [isAuthenticated]); 33 | 34 | return ( 35 | <> 36 | 37 | 43 | 44 | 53 | } 54 | /> 55 | 62 | } 63 | /> 64 | 71 | } 72 | /> 73 | } 76 | /> 77 | 78 | 79 | 80 | 81 | ); 82 | }; 83 | 84 | export default App; 85 | -------------------------------------------------------------------------------- /client/src/components/Login.jsx: -------------------------------------------------------------------------------- 1 | import Button from "react-bootstrap/Button"; 2 | import Form from "react-bootstrap/Form"; 3 | import toast from "react-hot-toast"; 4 | import axios from "axios"; 5 | import { useState } from "react"; 6 | import { Container } from "react-bootstrap"; 7 | import { Link, Navigate } from "react-router-dom"; 8 | 9 | function Login({ isAuthenticated, setIsAuthenticated }) { 10 | const [email, setEmail] = useState(""); 11 | const [password, setPassword] = useState(""); 12 | 13 | const handleLogin = async (e) => { 14 | e.preventDefault(); 15 | axios 16 | .post( 17 | "http://localhost:4000/api/v1/user/login", 18 | { email, password }, 19 | { 20 | withCredentials: true, 21 | headers: { "Content-Type": "application/json" }, 22 | } 23 | ) 24 | .then((res) => { 25 | setEmail(""); 26 | setPassword(""); 27 | setIsAuthenticated(true); 28 | toast.success(res.data.message); 29 | }) 30 | .catch((error) => { 31 | console.log(error); 32 | toast.error(error.response.data.message); 33 | }); 34 | }; 35 | if (isAuthenticated) { 36 | return ; 37 | } 38 | return ( 39 | 43 |
44 |

LOGIN

45 | 46 | Email address 47 | setEmail(e.target.value)} 52 | /> 53 | 54 | We'll never share your email with anyone else. 55 | 56 | 57 | 58 | 59 | Password 60 | setPassword(e.target.value)} 65 | /> 66 | 67 | 68 | 69 | Not Registered?{" "} 70 | 71 | REGISTER NOW 72 | 73 | 74 | 75 | 82 |
83 |
84 | ); 85 | } 86 | 87 | export default Login; 88 | -------------------------------------------------------------------------------- /server/controller/userController.js: -------------------------------------------------------------------------------- 1 | import { catchAsyncErrors } from "../middlewares/catchAsyncErrors.js"; 2 | import ErrorHandler from "../middlewares/error.js"; 3 | import { User } from "../models/userSchema.js"; 4 | import cloudinary from "cloudinary"; 5 | import { sendToken } from "../utils/jwtToken.js"; 6 | 7 | export const register = catchAsyncErrors(async (req, res, next) => { 8 | if (!req.files || Object.keys(req.files).length === 0) { 9 | return next(new ErrorHandler("User Avatar Required!", 400)); 10 | } 11 | const { avatar } = req.files; 12 | const allowedFormats = [ 13 | "image/png", 14 | "image/jpeg", 15 | "image/webp", 16 | "image/avif", 17 | ]; 18 | if (!allowedFormats.includes(avatar.mimetype)) { 19 | return next( 20 | new ErrorHandler( 21 | "Please provide avatar in png,jpg,webp or avif format!", 22 | 400 23 | ) 24 | ); 25 | } 26 | const { name, email, phone, password } = req.body; 27 | if (!name || !email || !phone || !password) { 28 | return next(new ErrorHandler("Please fill full form!", 400)); 29 | } 30 | let user = await User.findOne({ email }); 31 | if (user) { 32 | return next(new ErrorHandler("User already exists!", 400)); 33 | } 34 | const cloudinaryResponse = await cloudinary.uploader.upload( 35 | avatar.tempFilePath 36 | ); 37 | if (!cloudinaryResponse || cloudinary.error) { 38 | console.error( 39 | "Cloudinary Error:", 40 | cloudinaryResponse.error || "Unknown cloudinary error!" 41 | ); 42 | } 43 | user = await User.create({ 44 | name, 45 | email, 46 | phone, 47 | password, 48 | avatar: { 49 | public_id: cloudinaryResponse.public_id, 50 | url: cloudinaryResponse.secure_url, 51 | }, 52 | }); 53 | sendToken("User Registered!", user, res, 200); 54 | }); 55 | 56 | export const login = catchAsyncErrors(async (req, res, next) => { 57 | const { email, password } = req.body; 58 | if (!email || !password) { 59 | return next(new ErrorHandler("Please provide email and password!", 400)); 60 | } 61 | const user = await User.findOne({ email }).select("+password"); 62 | if (!user) { 63 | return next(new ErrorHandler("Invalid email or password!", 400)); 64 | } 65 | const isPasswordMatched = await user.comparePassword(password); 66 | if (!isPasswordMatched) { 67 | return next(new ErrorHandler("Invalid email or password!", 400)); 68 | } 69 | sendToken("User Logged In!", user, res, 200); 70 | }); 71 | 72 | export const logout = catchAsyncErrors((req, res, next) => { 73 | res 74 | .status(200) 75 | .cookie("token", "", { 76 | expires: new Date(Date.now()), 77 | httpOnly: true, 78 | }) 79 | .json({ 80 | success: true, 81 | message: "User Logged Out!", 82 | }); 83 | }); 84 | export const myProfile = catchAsyncErrors((req, res, next) => { 85 | const user = req.user; 86 | res.status(200).json({ 87 | success: true, 88 | user, 89 | }); 90 | }); 91 | -------------------------------------------------------------------------------- /client/src/components/Register.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import React, { useState } from "react"; 3 | import toast from "react-hot-toast"; 4 | import Button from "react-bootstrap/Button"; 5 | import Form from "react-bootstrap/Form"; 6 | import { Container } from "react-bootstrap"; 7 | import { Link, Navigate } from "react-router-dom"; 8 | 9 | function Register({ isAuthenticated, setIsAuthenticated }) { 10 | const [name, setName] = useState(""); 11 | const [email, setEmail] = useState(""); 12 | const [password, setPassword] = useState(""); 13 | const [phone, setPhone] = useState(""); 14 | const [avatar, setAvatar] = useState(""); 15 | 16 | const avatarHandler = (e) => { 17 | const file = e.target.files[0]; 18 | setAvatar(file); 19 | }; 20 | 21 | const handleRegister = async (e) => { 22 | e.preventDefault(); 23 | const formData = new FormData(); 24 | formData.append("name", name); 25 | formData.append("email", email); 26 | formData.append("phone", phone); 27 | formData.append("password", password); 28 | formData.append("avatar", avatar); 29 | await axios 30 | .post("http://localhost:4000/api/v1/user/register", formData, { 31 | withCredentials: true, 32 | headers: { "Content-Type": "multipart/form-data" }, 33 | }) 34 | .then((res) => { 35 | setName(""); 36 | setEmail(""); 37 | setPhone(""); 38 | setPassword(""); 39 | setAvatar(""); 40 | setIsAuthenticated(true); 41 | toast.success(res.data.message); 42 | }) 43 | .catch((error) => { 44 | toast.error(error.response.data.message); 45 | }); 46 | }; 47 | if (isAuthenticated) { 48 | return ; 49 | } 50 | return ( 51 | 55 |
56 |

REGISTER

57 | 58 | Name 59 | setName(e.target.value)} 64 | /> 65 | 66 | 67 | 68 | Email 69 | setEmail(e.target.value)} 74 | /> 75 | 76 | 77 | Phone Number 78 | setPhone(e.target.value)} 83 | /> 84 | 85 | 86 | Password 87 | setPassword(e.target.value)} 92 | /> 93 | 94 | 95 | Avatar 96 | 97 | 98 | 99 | 100 | Already Registered?{" "} 101 | 102 | LOGIN 103 | 104 | 105 | 106 | 113 |
114 |
115 | ); 116 | } 117 | 118 | export default Register; 119 | -------------------------------------------------------------------------------- /client/src/components/UpdateTaskModal.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import React, { useEffect, useState } from "react"; 3 | import { Button, Modal, Stack } from "react-bootstrap"; 4 | import toast from "react-hot-toast"; 5 | 6 | const UpdateTaskModal = ({ 7 | showUpdateModal, 8 | handleUpdateModalClose, 9 | id, 10 | setTasks, 11 | }) => { 12 | const [title, setTitle] = useState(""); 13 | const [description, setDescription] = useState(""); 14 | const [status, setStatus] = useState("incomplete"); 15 | const [archived, setArchived] = useState(false); 16 | 17 | useEffect(() => { 18 | const getSingleTask = async () => { 19 | await axios 20 | .get(`http://localhost:4000/api/v1/task/single/${id}`, { 21 | withCredentials: true, 22 | }) 23 | .then((res) => { 24 | setTitle(res.data.task.title); 25 | setDescription(res.data.task.description); 26 | setStatus(res.data.task.status); 27 | setArchived(res.data.task.archived); 28 | }) 29 | .catch((error) => { 30 | console.log(error.response.data.message); 31 | }); 32 | }; 33 | if (id) { 34 | getSingleTask(); 35 | } 36 | }, [id]); 37 | 38 | const handleUpdateTask = async () => { 39 | await axios 40 | .put( 41 | `http://localhost:4000/api/v1/task/update/${id}`, 42 | { 43 | title, 44 | description, 45 | status, 46 | archived, 47 | }, 48 | { 49 | withCredentials: true, 50 | } 51 | ) 52 | .then((res) => { 53 | toast.success(res.data.message); 54 | 55 | setTasks((prevTasks) => { 56 | const updatedTasks = prevTasks.map((task) => { 57 | if (task._id === id) { 58 | return { 59 | ...task, 60 | title, 61 | description, 62 | status, 63 | archived, 64 | }; 65 | } else { 66 | return task; 67 | } 68 | }); 69 | return updatedTasks; 70 | }); 71 | handleUpdateModalClose(); 72 | }) 73 | .catch((error) => { 74 | toast.error(error.response.data.message); 75 | }); 76 | }; 77 | 78 | return ( 79 | <> 80 | 81 | 82 | Update Task 83 | 84 | 85 | 86 | 87 | setTitle(e.target.value)} 92 | /> 93 | 94 |
95 | 96 | 97 | setDescription(e.target.value)} 102 | /> 103 | 104 |
105 | 106 | 107 | 111 | 112 |
113 | 114 | 115 | 122 | 123 |
124 | 125 | 128 | 131 | 132 |
133 | 134 | ); 135 | }; 136 | 137 | export default UpdateTaskModal; 138 | -------------------------------------------------------------------------------- /client/src/components/Navbar.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { useEffect, useState } from "react"; 3 | import { Button, Stack } from "react-bootstrap"; 4 | import Container from "react-bootstrap/Container"; 5 | import Nav from "react-bootstrap/Nav"; 6 | import Navbar from "react-bootstrap/Navbar"; 7 | import NavDropdown from "react-bootstrap/NavDropdown"; 8 | import toast from "react-hot-toast"; 9 | import { Link } from "react-router-dom"; 10 | 11 | function Header({ 12 | setTasks, 13 | setIsAuthenticated, 14 | isAuthenticated, 15 | setTaskTitle, 16 | }) { 17 | const [allTasks, setAllTasks] = useState([]); 18 | // Fetch tasks from the server when the component mounts 19 | useEffect(() => { 20 | fetchTasks(); 21 | }, [isAuthenticated]); 22 | 23 | // Fetch tasks from the server 24 | const fetchTasks = async () => { 25 | try { 26 | const response = await axios.get( 27 | "http://localhost:4000/api/v1/task/mytask", 28 | { withCredentials: true } 29 | ); 30 | setAllTasks(response.data.tasks); 31 | setTasks(response.data.tasks); // Update tasks with fetched tasks 32 | } catch (error) { 33 | console.error("Error fetching tasks:", error); 34 | } 35 | }; 36 | 37 | const handleLogout = async () => { 38 | try { 39 | const { data } = await axios.get( 40 | "http://localhost:4000/api/v1/user/logout", 41 | { withCredentials: "true" } 42 | ); 43 | toast.success(data.message); 44 | setIsAuthenticated(false); 45 | } catch (error) { 46 | toast.error(error.response.data.message); 47 | } 48 | }; 49 | 50 | const filterTasks = (filterType) => { 51 | let filteredTasks = []; 52 | 53 | switch (filterType) { 54 | case "completed": 55 | filteredTasks = allTasks.filter((task) => task.status === "completed"); 56 | setTaskTitle("Completed Tasks"); 57 | break; 58 | case "incomplete": 59 | filteredTasks = allTasks.filter((task) => task.status === "incomplete"); 60 | setTaskTitle("Incomplete Tasks"); 61 | break; 62 | case "archived": 63 | filteredTasks = allTasks.filter((task) => task.archived === true); 64 | setTaskTitle("Archived Tasks"); 65 | break; 66 | case "all": 67 | filteredTasks = allTasks; 68 | setTaskTitle("Tasks"); 69 | break; 70 | default: 71 | filteredTasks = allTasks; 72 | } 73 | setTasks(filteredTasks); 74 | }; 75 | 76 | return ( 77 | 81 | 82 | TASK MANAGER 83 | 84 | 85 | 120 | 121 | 122 | 123 | ); 124 | } 125 | 126 | export default Header; 127 | -------------------------------------------------------------------------------- /client/src/components/Home.jsx: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import React, { useEffect, useState } from "react"; 3 | import { Modal, Button, Card, Stack } from "react-bootstrap"; 4 | import toast from "react-hot-toast"; 5 | import CreateTaskModal from "./CreateTaskModal"; 6 | import UpdateTaskModal from "./UpdateTaskModal"; 7 | import ViewTaskModal from "./ViewTaskModal"; 8 | import { FaEye } from "react-icons/fa"; 9 | import { MdEdit, MdDelete } from "react-icons/md"; 10 | import { Navigate } from "react-router-dom"; 11 | 12 | const Home = ({ isAuthenticated, tasks, setTasks, taskTitle }) => { 13 | const [showCreateModal, setShowCreateModal] = useState(false); 14 | const [showUpdateModal, setShowUpdateModal] = useState(false); 15 | const [showViewModal, setShowViewModal] = useState(false); 16 | const [viewTaskId, setViewTaskId] = useState(null); 17 | const [updatedTaskId, setUpdateTaskId] = useState(null); 18 | 19 | const deleteTask = async (id) => { 20 | await axios 21 | .delete(`http://localhost:4000/api/v1/task/delete/${id}`, { 22 | withCredentials: true, 23 | }) 24 | .then((res) => { 25 | toast.success(res.data.message); 26 | setTasks((prevTasks) => prevTasks.filter((tasks) => tasks._id !== id)); 27 | }) 28 | .catch((error) => { 29 | toast.error(error.response.data.message); 30 | }); 31 | }; 32 | 33 | const handleCreateModalClose = () => setShowCreateModal(false); 34 | const handleUpdateModalClose = () => setShowUpdateModal(false); 35 | const handleViewModalClose = () => setShowViewModal(false); 36 | 37 | const handleCreateModalShow = () => setShowCreateModal(true); 38 | 39 | const handleUpdateModalShow = (id) => { 40 | setUpdateTaskId(id); 41 | setShowUpdateModal(true); 42 | }; 43 | 44 | const handleViewModalShow = (id) => { 45 | setViewTaskId(id); 46 | setShowViewModal(true); 47 | }; 48 | 49 | if (!isAuthenticated) { 50 | return ; 51 | } 52 | 53 | return ( 54 |
55 |
56 |
57 |

{taskTitle}

58 |
59 |
60 | 63 |
64 |
65 |
66 | {tasks && tasks.length > 0 ? ( 67 | tasks.map((task) => ( 68 |
69 | 70 | 71 | 72 | 73 | {task && task.title.length <= 40 74 | ? task.title 75 | : task.title.slice(0, 40) + "..."} 76 | 77 | 78 | {task && task.description.length <= 300 79 | ? task.description 80 | : task.description.slice(0, 300) + "..."} 81 | 82 | 83 | 88 | handleUpdateModalShow(task._id)} 90 | className="fs-3 " 91 | /> 92 | deleteTask(task._id)} 94 | className="fs-3 " 95 | /> 96 | handleViewModalShow(task._id)} 98 | className="fs-3 " 99 | /> 100 | 101 | 102 | 103 |
104 | )) 105 | ) : ( 106 |

YOU DONT HAVE ANY {taskTitle}

107 | )} 108 |
109 | 110 | 115 | 116 | 122 | 123 | 128 |
129 | ); 130 | }; 131 | 132 | export default Home; 133 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcrypt": "^5.1.1", 13 | "cloudinary": "^2.0.1", 14 | "cookie-parser": "^1.4.6", 15 | "cors": "^2.8.5", 16 | "dotenv": "^16.4.4", 17 | "express": "^4.18.2", 18 | "express-fileupload": "^1.4.3", 19 | "jsonwebtoken": "^9.0.2", 20 | "mongoose": "^8.1.2", 21 | "validator": "^13.11.0" 22 | } 23 | }, 24 | "node_modules/@mapbox/node-pre-gyp": { 25 | "version": "1.0.11", 26 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", 27 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", 28 | "dependencies": { 29 | "detect-libc": "^2.0.0", 30 | "https-proxy-agent": "^5.0.0", 31 | "make-dir": "^3.1.0", 32 | "node-fetch": "^2.6.7", 33 | "nopt": "^5.0.0", 34 | "npmlog": "^5.0.1", 35 | "rimraf": "^3.0.2", 36 | "semver": "^7.3.5", 37 | "tar": "^6.1.11" 38 | }, 39 | "bin": { 40 | "node-pre-gyp": "bin/node-pre-gyp" 41 | } 42 | }, 43 | "node_modules/@mongodb-js/saslprep": { 44 | "version": "1.1.4", 45 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", 46 | "integrity": "sha512-8zJ8N1x51xo9hwPh6AWnKdLGEC5N3lDa6kms1YHmFBoRhTpJR6HG8wWk0td1MVCu9cD4YBrvjZEtd5Obw0Fbnw==", 47 | "dependencies": { 48 | "sparse-bitfield": "^3.0.3" 49 | } 50 | }, 51 | "node_modules/@types/webidl-conversions": { 52 | "version": "7.0.3", 53 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 54 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 55 | }, 56 | "node_modules/@types/whatwg-url": { 57 | "version": "11.0.4", 58 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", 59 | "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", 60 | "dependencies": { 61 | "@types/webidl-conversions": "*" 62 | } 63 | }, 64 | "node_modules/abbrev": { 65 | "version": "1.1.1", 66 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 67 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 68 | }, 69 | "node_modules/accepts": { 70 | "version": "1.3.8", 71 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 72 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 73 | "dependencies": { 74 | "mime-types": "~2.1.34", 75 | "negotiator": "0.6.3" 76 | }, 77 | "engines": { 78 | "node": ">= 0.6" 79 | } 80 | }, 81 | "node_modules/agent-base": { 82 | "version": "6.0.2", 83 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 84 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 85 | "dependencies": { 86 | "debug": "4" 87 | }, 88 | "engines": { 89 | "node": ">= 6.0.0" 90 | } 91 | }, 92 | "node_modules/agent-base/node_modules/debug": { 93 | "version": "4.3.4", 94 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 95 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 96 | "dependencies": { 97 | "ms": "2.1.2" 98 | }, 99 | "engines": { 100 | "node": ">=6.0" 101 | }, 102 | "peerDependenciesMeta": { 103 | "supports-color": { 104 | "optional": true 105 | } 106 | } 107 | }, 108 | "node_modules/agent-base/node_modules/ms": { 109 | "version": "2.1.2", 110 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 111 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 112 | }, 113 | "node_modules/ansi-regex": { 114 | "version": "5.0.1", 115 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 116 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 117 | "engines": { 118 | "node": ">=8" 119 | } 120 | }, 121 | "node_modules/aproba": { 122 | "version": "2.0.0", 123 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 124 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 125 | }, 126 | "node_modules/are-we-there-yet": { 127 | "version": "2.0.0", 128 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 129 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 130 | "dependencies": { 131 | "delegates": "^1.0.0", 132 | "readable-stream": "^3.6.0" 133 | }, 134 | "engines": { 135 | "node": ">=10" 136 | } 137 | }, 138 | "node_modules/array-flatten": { 139 | "version": "1.1.1", 140 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 141 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 142 | }, 143 | "node_modules/balanced-match": { 144 | "version": "1.0.2", 145 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 146 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 147 | }, 148 | "node_modules/bcrypt": { 149 | "version": "5.1.1", 150 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", 151 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", 152 | "hasInstallScript": true, 153 | "dependencies": { 154 | "@mapbox/node-pre-gyp": "^1.0.11", 155 | "node-addon-api": "^5.0.0" 156 | }, 157 | "engines": { 158 | "node": ">= 10.0.0" 159 | } 160 | }, 161 | "node_modules/body-parser": { 162 | "version": "1.20.1", 163 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 164 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 165 | "dependencies": { 166 | "bytes": "3.1.2", 167 | "content-type": "~1.0.4", 168 | "debug": "2.6.9", 169 | "depd": "2.0.0", 170 | "destroy": "1.2.0", 171 | "http-errors": "2.0.0", 172 | "iconv-lite": "0.4.24", 173 | "on-finished": "2.4.1", 174 | "qs": "6.11.0", 175 | "raw-body": "2.5.1", 176 | "type-is": "~1.6.18", 177 | "unpipe": "1.0.0" 178 | }, 179 | "engines": { 180 | "node": ">= 0.8", 181 | "npm": "1.2.8000 || >= 1.4.16" 182 | } 183 | }, 184 | "node_modules/brace-expansion": { 185 | "version": "1.1.11", 186 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 187 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 188 | "dependencies": { 189 | "balanced-match": "^1.0.0", 190 | "concat-map": "0.0.1" 191 | } 192 | }, 193 | "node_modules/bson": { 194 | "version": "6.3.0", 195 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.3.0.tgz", 196 | "integrity": "sha512-balJfqwwTBddxfnidJZagCBPP/f48zj9Sdp3OJswREOgsJzHiQSaOIAtApSgDQFYgHqAvFkp53AFSqjMDZoTFw==", 197 | "engines": { 198 | "node": ">=16.20.1" 199 | } 200 | }, 201 | "node_modules/buffer-equal-constant-time": { 202 | "version": "1.0.1", 203 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 204 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 205 | }, 206 | "node_modules/busboy": { 207 | "version": "1.6.0", 208 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 209 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 210 | "dependencies": { 211 | "streamsearch": "^1.1.0" 212 | }, 213 | "engines": { 214 | "node": ">=10.16.0" 215 | } 216 | }, 217 | "node_modules/bytes": { 218 | "version": "3.1.2", 219 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 220 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 221 | "engines": { 222 | "node": ">= 0.8" 223 | } 224 | }, 225 | "node_modules/call-bind": { 226 | "version": "1.0.7", 227 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 228 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 229 | "dependencies": { 230 | "es-define-property": "^1.0.0", 231 | "es-errors": "^1.3.0", 232 | "function-bind": "^1.1.2", 233 | "get-intrinsic": "^1.2.4", 234 | "set-function-length": "^1.2.1" 235 | }, 236 | "engines": { 237 | "node": ">= 0.4" 238 | }, 239 | "funding": { 240 | "url": "https://github.com/sponsors/ljharb" 241 | } 242 | }, 243 | "node_modules/chownr": { 244 | "version": "2.0.0", 245 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 246 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 247 | "engines": { 248 | "node": ">=10" 249 | } 250 | }, 251 | "node_modules/cloudinary": { 252 | "version": "2.0.1", 253 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.0.1.tgz", 254 | "integrity": "sha512-+j5GswtCwjAmLhjs/K26id4Zvh53zL/YWzgyenxgbdXdXmdFM8d5H1FV1sJCkpS77AqylJKBzyztySdILM+F+A==", 255 | "dependencies": { 256 | "lodash": "^4.17.21", 257 | "q": "^1.5.1" 258 | }, 259 | "engines": { 260 | "node": ">=9" 261 | } 262 | }, 263 | "node_modules/color-support": { 264 | "version": "1.1.3", 265 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 266 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 267 | "bin": { 268 | "color-support": "bin.js" 269 | } 270 | }, 271 | "node_modules/concat-map": { 272 | "version": "0.0.1", 273 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 274 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 275 | }, 276 | "node_modules/console-control-strings": { 277 | "version": "1.1.0", 278 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 279 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 280 | }, 281 | "node_modules/content-disposition": { 282 | "version": "0.5.4", 283 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 284 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 285 | "dependencies": { 286 | "safe-buffer": "5.2.1" 287 | }, 288 | "engines": { 289 | "node": ">= 0.6" 290 | } 291 | }, 292 | "node_modules/content-type": { 293 | "version": "1.0.5", 294 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 295 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 296 | "engines": { 297 | "node": ">= 0.6" 298 | } 299 | }, 300 | "node_modules/cookie": { 301 | "version": "0.4.1", 302 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 303 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 304 | "engines": { 305 | "node": ">= 0.6" 306 | } 307 | }, 308 | "node_modules/cookie-parser": { 309 | "version": "1.4.6", 310 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 311 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 312 | "dependencies": { 313 | "cookie": "0.4.1", 314 | "cookie-signature": "1.0.6" 315 | }, 316 | "engines": { 317 | "node": ">= 0.8.0" 318 | } 319 | }, 320 | "node_modules/cookie-signature": { 321 | "version": "1.0.6", 322 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 323 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 324 | }, 325 | "node_modules/cors": { 326 | "version": "2.8.5", 327 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 328 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 329 | "dependencies": { 330 | "object-assign": "^4", 331 | "vary": "^1" 332 | }, 333 | "engines": { 334 | "node": ">= 0.10" 335 | } 336 | }, 337 | "node_modules/debug": { 338 | "version": "2.6.9", 339 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 340 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 341 | "dependencies": { 342 | "ms": "2.0.0" 343 | } 344 | }, 345 | "node_modules/define-data-property": { 346 | "version": "1.1.4", 347 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 348 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 349 | "dependencies": { 350 | "es-define-property": "^1.0.0", 351 | "es-errors": "^1.3.0", 352 | "gopd": "^1.0.1" 353 | }, 354 | "engines": { 355 | "node": ">= 0.4" 356 | }, 357 | "funding": { 358 | "url": "https://github.com/sponsors/ljharb" 359 | } 360 | }, 361 | "node_modules/delegates": { 362 | "version": "1.0.0", 363 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 364 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 365 | }, 366 | "node_modules/depd": { 367 | "version": "2.0.0", 368 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 369 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 370 | "engines": { 371 | "node": ">= 0.8" 372 | } 373 | }, 374 | "node_modules/destroy": { 375 | "version": "1.2.0", 376 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 377 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 378 | "engines": { 379 | "node": ">= 0.8", 380 | "npm": "1.2.8000 || >= 1.4.16" 381 | } 382 | }, 383 | "node_modules/detect-libc": { 384 | "version": "2.0.2", 385 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", 386 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", 387 | "engines": { 388 | "node": ">=8" 389 | } 390 | }, 391 | "node_modules/dotenv": { 392 | "version": "16.4.4", 393 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz", 394 | "integrity": "sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==", 395 | "engines": { 396 | "node": ">=12" 397 | }, 398 | "funding": { 399 | "url": "https://dotenvx.com" 400 | } 401 | }, 402 | "node_modules/ecdsa-sig-formatter": { 403 | "version": "1.0.11", 404 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 405 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 406 | "dependencies": { 407 | "safe-buffer": "^5.0.1" 408 | } 409 | }, 410 | "node_modules/ee-first": { 411 | "version": "1.1.1", 412 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 413 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 414 | }, 415 | "node_modules/emoji-regex": { 416 | "version": "8.0.0", 417 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 418 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 419 | }, 420 | "node_modules/encodeurl": { 421 | "version": "1.0.2", 422 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 423 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 424 | "engines": { 425 | "node": ">= 0.8" 426 | } 427 | }, 428 | "node_modules/es-define-property": { 429 | "version": "1.0.0", 430 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 431 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 432 | "dependencies": { 433 | "get-intrinsic": "^1.2.4" 434 | }, 435 | "engines": { 436 | "node": ">= 0.4" 437 | } 438 | }, 439 | "node_modules/es-errors": { 440 | "version": "1.3.0", 441 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 442 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 443 | "engines": { 444 | "node": ">= 0.4" 445 | } 446 | }, 447 | "node_modules/escape-html": { 448 | "version": "1.0.3", 449 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 450 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 451 | }, 452 | "node_modules/etag": { 453 | "version": "1.8.1", 454 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 455 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 456 | "engines": { 457 | "node": ">= 0.6" 458 | } 459 | }, 460 | "node_modules/express": { 461 | "version": "4.18.2", 462 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 463 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 464 | "dependencies": { 465 | "accepts": "~1.3.8", 466 | "array-flatten": "1.1.1", 467 | "body-parser": "1.20.1", 468 | "content-disposition": "0.5.4", 469 | "content-type": "~1.0.4", 470 | "cookie": "0.5.0", 471 | "cookie-signature": "1.0.6", 472 | "debug": "2.6.9", 473 | "depd": "2.0.0", 474 | "encodeurl": "~1.0.2", 475 | "escape-html": "~1.0.3", 476 | "etag": "~1.8.1", 477 | "finalhandler": "1.2.0", 478 | "fresh": "0.5.2", 479 | "http-errors": "2.0.0", 480 | "merge-descriptors": "1.0.1", 481 | "methods": "~1.1.2", 482 | "on-finished": "2.4.1", 483 | "parseurl": "~1.3.3", 484 | "path-to-regexp": "0.1.7", 485 | "proxy-addr": "~2.0.7", 486 | "qs": "6.11.0", 487 | "range-parser": "~1.2.1", 488 | "safe-buffer": "5.2.1", 489 | "send": "0.18.0", 490 | "serve-static": "1.15.0", 491 | "setprototypeof": "1.2.0", 492 | "statuses": "2.0.1", 493 | "type-is": "~1.6.18", 494 | "utils-merge": "1.0.1", 495 | "vary": "~1.1.2" 496 | }, 497 | "engines": { 498 | "node": ">= 0.10.0" 499 | } 500 | }, 501 | "node_modules/express-fileupload": { 502 | "version": "1.4.3", 503 | "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.3.tgz", 504 | "integrity": "sha512-vRzZo2YELm68DfR/CX8RMXgeK9BTAANxigrKACPjCXFGEzkCt/QWbqaIXP3W61uaX/hLj0CAo3/EVelpSQXkqA==", 505 | "dependencies": { 506 | "busboy": "^1.6.0" 507 | }, 508 | "engines": { 509 | "node": ">=12.0.0" 510 | } 511 | }, 512 | "node_modules/express/node_modules/cookie": { 513 | "version": "0.5.0", 514 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 515 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 516 | "engines": { 517 | "node": ">= 0.6" 518 | } 519 | }, 520 | "node_modules/finalhandler": { 521 | "version": "1.2.0", 522 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 523 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 524 | "dependencies": { 525 | "debug": "2.6.9", 526 | "encodeurl": "~1.0.2", 527 | "escape-html": "~1.0.3", 528 | "on-finished": "2.4.1", 529 | "parseurl": "~1.3.3", 530 | "statuses": "2.0.1", 531 | "unpipe": "~1.0.0" 532 | }, 533 | "engines": { 534 | "node": ">= 0.8" 535 | } 536 | }, 537 | "node_modules/forwarded": { 538 | "version": "0.2.0", 539 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 540 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 541 | "engines": { 542 | "node": ">= 0.6" 543 | } 544 | }, 545 | "node_modules/fresh": { 546 | "version": "0.5.2", 547 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 548 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 549 | "engines": { 550 | "node": ">= 0.6" 551 | } 552 | }, 553 | "node_modules/fs-minipass": { 554 | "version": "2.1.0", 555 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 556 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 557 | "dependencies": { 558 | "minipass": "^3.0.0" 559 | }, 560 | "engines": { 561 | "node": ">= 8" 562 | } 563 | }, 564 | "node_modules/fs-minipass/node_modules/minipass": { 565 | "version": "3.3.6", 566 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 567 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 568 | "dependencies": { 569 | "yallist": "^4.0.0" 570 | }, 571 | "engines": { 572 | "node": ">=8" 573 | } 574 | }, 575 | "node_modules/fs.realpath": { 576 | "version": "1.0.0", 577 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 578 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 579 | }, 580 | "node_modules/function-bind": { 581 | "version": "1.1.2", 582 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 583 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 584 | "funding": { 585 | "url": "https://github.com/sponsors/ljharb" 586 | } 587 | }, 588 | "node_modules/gauge": { 589 | "version": "3.0.2", 590 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 591 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 592 | "dependencies": { 593 | "aproba": "^1.0.3 || ^2.0.0", 594 | "color-support": "^1.1.2", 595 | "console-control-strings": "^1.0.0", 596 | "has-unicode": "^2.0.1", 597 | "object-assign": "^4.1.1", 598 | "signal-exit": "^3.0.0", 599 | "string-width": "^4.2.3", 600 | "strip-ansi": "^6.0.1", 601 | "wide-align": "^1.1.2" 602 | }, 603 | "engines": { 604 | "node": ">=10" 605 | } 606 | }, 607 | "node_modules/get-intrinsic": { 608 | "version": "1.2.4", 609 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 610 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 611 | "dependencies": { 612 | "es-errors": "^1.3.0", 613 | "function-bind": "^1.1.2", 614 | "has-proto": "^1.0.1", 615 | "has-symbols": "^1.0.3", 616 | "hasown": "^2.0.0" 617 | }, 618 | "engines": { 619 | "node": ">= 0.4" 620 | }, 621 | "funding": { 622 | "url": "https://github.com/sponsors/ljharb" 623 | } 624 | }, 625 | "node_modules/glob": { 626 | "version": "7.2.3", 627 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 628 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 629 | "dependencies": { 630 | "fs.realpath": "^1.0.0", 631 | "inflight": "^1.0.4", 632 | "inherits": "2", 633 | "minimatch": "^3.1.1", 634 | "once": "^1.3.0", 635 | "path-is-absolute": "^1.0.0" 636 | }, 637 | "engines": { 638 | "node": "*" 639 | }, 640 | "funding": { 641 | "url": "https://github.com/sponsors/isaacs" 642 | } 643 | }, 644 | "node_modules/gopd": { 645 | "version": "1.0.1", 646 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 647 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 648 | "dependencies": { 649 | "get-intrinsic": "^1.1.3" 650 | }, 651 | "funding": { 652 | "url": "https://github.com/sponsors/ljharb" 653 | } 654 | }, 655 | "node_modules/has-property-descriptors": { 656 | "version": "1.0.2", 657 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 658 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 659 | "dependencies": { 660 | "es-define-property": "^1.0.0" 661 | }, 662 | "funding": { 663 | "url": "https://github.com/sponsors/ljharb" 664 | } 665 | }, 666 | "node_modules/has-proto": { 667 | "version": "1.0.1", 668 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 669 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 670 | "engines": { 671 | "node": ">= 0.4" 672 | }, 673 | "funding": { 674 | "url": "https://github.com/sponsors/ljharb" 675 | } 676 | }, 677 | "node_modules/has-symbols": { 678 | "version": "1.0.3", 679 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 680 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 681 | "engines": { 682 | "node": ">= 0.4" 683 | }, 684 | "funding": { 685 | "url": "https://github.com/sponsors/ljharb" 686 | } 687 | }, 688 | "node_modules/has-unicode": { 689 | "version": "2.0.1", 690 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 691 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 692 | }, 693 | "node_modules/hasown": { 694 | "version": "2.0.1", 695 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", 696 | "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", 697 | "dependencies": { 698 | "function-bind": "^1.1.2" 699 | }, 700 | "engines": { 701 | "node": ">= 0.4" 702 | } 703 | }, 704 | "node_modules/http-errors": { 705 | "version": "2.0.0", 706 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 707 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 708 | "dependencies": { 709 | "depd": "2.0.0", 710 | "inherits": "2.0.4", 711 | "setprototypeof": "1.2.0", 712 | "statuses": "2.0.1", 713 | "toidentifier": "1.0.1" 714 | }, 715 | "engines": { 716 | "node": ">= 0.8" 717 | } 718 | }, 719 | "node_modules/https-proxy-agent": { 720 | "version": "5.0.1", 721 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 722 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 723 | "dependencies": { 724 | "agent-base": "6", 725 | "debug": "4" 726 | }, 727 | "engines": { 728 | "node": ">= 6" 729 | } 730 | }, 731 | "node_modules/https-proxy-agent/node_modules/debug": { 732 | "version": "4.3.4", 733 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 734 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 735 | "dependencies": { 736 | "ms": "2.1.2" 737 | }, 738 | "engines": { 739 | "node": ">=6.0" 740 | }, 741 | "peerDependenciesMeta": { 742 | "supports-color": { 743 | "optional": true 744 | } 745 | } 746 | }, 747 | "node_modules/https-proxy-agent/node_modules/ms": { 748 | "version": "2.1.2", 749 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 750 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 751 | }, 752 | "node_modules/iconv-lite": { 753 | "version": "0.4.24", 754 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 755 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 756 | "dependencies": { 757 | "safer-buffer": ">= 2.1.2 < 3" 758 | }, 759 | "engines": { 760 | "node": ">=0.10.0" 761 | } 762 | }, 763 | "node_modules/inflight": { 764 | "version": "1.0.6", 765 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 766 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 767 | "dependencies": { 768 | "once": "^1.3.0", 769 | "wrappy": "1" 770 | } 771 | }, 772 | "node_modules/inherits": { 773 | "version": "2.0.4", 774 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 775 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 776 | }, 777 | "node_modules/ipaddr.js": { 778 | "version": "1.9.1", 779 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 780 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 781 | "engines": { 782 | "node": ">= 0.10" 783 | } 784 | }, 785 | "node_modules/is-fullwidth-code-point": { 786 | "version": "3.0.0", 787 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 788 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 789 | "engines": { 790 | "node": ">=8" 791 | } 792 | }, 793 | "node_modules/jsonwebtoken": { 794 | "version": "9.0.2", 795 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 796 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 797 | "dependencies": { 798 | "jws": "^3.2.2", 799 | "lodash.includes": "^4.3.0", 800 | "lodash.isboolean": "^3.0.3", 801 | "lodash.isinteger": "^4.0.4", 802 | "lodash.isnumber": "^3.0.3", 803 | "lodash.isplainobject": "^4.0.6", 804 | "lodash.isstring": "^4.0.1", 805 | "lodash.once": "^4.0.0", 806 | "ms": "^2.1.1", 807 | "semver": "^7.5.4" 808 | }, 809 | "engines": { 810 | "node": ">=12", 811 | "npm": ">=6" 812 | } 813 | }, 814 | "node_modules/jsonwebtoken/node_modules/ms": { 815 | "version": "2.1.3", 816 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 817 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 818 | }, 819 | "node_modules/jwa": { 820 | "version": "1.4.1", 821 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 822 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 823 | "dependencies": { 824 | "buffer-equal-constant-time": "1.0.1", 825 | "ecdsa-sig-formatter": "1.0.11", 826 | "safe-buffer": "^5.0.1" 827 | } 828 | }, 829 | "node_modules/jws": { 830 | "version": "3.2.2", 831 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 832 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 833 | "dependencies": { 834 | "jwa": "^1.4.1", 835 | "safe-buffer": "^5.0.1" 836 | } 837 | }, 838 | "node_modules/kareem": { 839 | "version": "2.5.1", 840 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 841 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", 842 | "engines": { 843 | "node": ">=12.0.0" 844 | } 845 | }, 846 | "node_modules/lodash": { 847 | "version": "4.17.21", 848 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 849 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 850 | }, 851 | "node_modules/lodash.includes": { 852 | "version": "4.3.0", 853 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 854 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 855 | }, 856 | "node_modules/lodash.isboolean": { 857 | "version": "3.0.3", 858 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 859 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 860 | }, 861 | "node_modules/lodash.isinteger": { 862 | "version": "4.0.4", 863 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 864 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 865 | }, 866 | "node_modules/lodash.isnumber": { 867 | "version": "3.0.3", 868 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 869 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 870 | }, 871 | "node_modules/lodash.isplainobject": { 872 | "version": "4.0.6", 873 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 874 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 875 | }, 876 | "node_modules/lodash.isstring": { 877 | "version": "4.0.1", 878 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 879 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 880 | }, 881 | "node_modules/lodash.once": { 882 | "version": "4.1.1", 883 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 884 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 885 | }, 886 | "node_modules/lru-cache": { 887 | "version": "6.0.0", 888 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 889 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 890 | "dependencies": { 891 | "yallist": "^4.0.0" 892 | }, 893 | "engines": { 894 | "node": ">=10" 895 | } 896 | }, 897 | "node_modules/make-dir": { 898 | "version": "3.1.0", 899 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 900 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 901 | "dependencies": { 902 | "semver": "^6.0.0" 903 | }, 904 | "engines": { 905 | "node": ">=8" 906 | }, 907 | "funding": { 908 | "url": "https://github.com/sponsors/sindresorhus" 909 | } 910 | }, 911 | "node_modules/make-dir/node_modules/semver": { 912 | "version": "6.3.1", 913 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 914 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 915 | "bin": { 916 | "semver": "bin/semver.js" 917 | } 918 | }, 919 | "node_modules/media-typer": { 920 | "version": "0.3.0", 921 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 922 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 923 | "engines": { 924 | "node": ">= 0.6" 925 | } 926 | }, 927 | "node_modules/memory-pager": { 928 | "version": "1.5.0", 929 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 930 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 931 | }, 932 | "node_modules/merge-descriptors": { 933 | "version": "1.0.1", 934 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 935 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 936 | }, 937 | "node_modules/methods": { 938 | "version": "1.1.2", 939 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 940 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 941 | "engines": { 942 | "node": ">= 0.6" 943 | } 944 | }, 945 | "node_modules/mime": { 946 | "version": "1.6.0", 947 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 948 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 949 | "bin": { 950 | "mime": "cli.js" 951 | }, 952 | "engines": { 953 | "node": ">=4" 954 | } 955 | }, 956 | "node_modules/mime-db": { 957 | "version": "1.52.0", 958 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 959 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 960 | "engines": { 961 | "node": ">= 0.6" 962 | } 963 | }, 964 | "node_modules/mime-types": { 965 | "version": "2.1.35", 966 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 967 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 968 | "dependencies": { 969 | "mime-db": "1.52.0" 970 | }, 971 | "engines": { 972 | "node": ">= 0.6" 973 | } 974 | }, 975 | "node_modules/minimatch": { 976 | "version": "3.1.2", 977 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 978 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 979 | "dependencies": { 980 | "brace-expansion": "^1.1.7" 981 | }, 982 | "engines": { 983 | "node": "*" 984 | } 985 | }, 986 | "node_modules/minipass": { 987 | "version": "5.0.0", 988 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 989 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 990 | "engines": { 991 | "node": ">=8" 992 | } 993 | }, 994 | "node_modules/minizlib": { 995 | "version": "2.1.2", 996 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 997 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 998 | "dependencies": { 999 | "minipass": "^3.0.0", 1000 | "yallist": "^4.0.0" 1001 | }, 1002 | "engines": { 1003 | "node": ">= 8" 1004 | } 1005 | }, 1006 | "node_modules/minizlib/node_modules/minipass": { 1007 | "version": "3.3.6", 1008 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1009 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1010 | "dependencies": { 1011 | "yallist": "^4.0.0" 1012 | }, 1013 | "engines": { 1014 | "node": ">=8" 1015 | } 1016 | }, 1017 | "node_modules/mkdirp": { 1018 | "version": "1.0.4", 1019 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1020 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1021 | "bin": { 1022 | "mkdirp": "bin/cmd.js" 1023 | }, 1024 | "engines": { 1025 | "node": ">=10" 1026 | } 1027 | }, 1028 | "node_modules/mongodb": { 1029 | "version": "6.3.0", 1030 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.3.0.tgz", 1031 | "integrity": "sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==", 1032 | "dependencies": { 1033 | "@mongodb-js/saslprep": "^1.1.0", 1034 | "bson": "^6.2.0", 1035 | "mongodb-connection-string-url": "^3.0.0" 1036 | }, 1037 | "engines": { 1038 | "node": ">=16.20.1" 1039 | }, 1040 | "peerDependencies": { 1041 | "@aws-sdk/credential-providers": "^3.188.0", 1042 | "@mongodb-js/zstd": "^1.1.0", 1043 | "gcp-metadata": "^5.2.0", 1044 | "kerberos": "^2.0.1", 1045 | "mongodb-client-encryption": ">=6.0.0 <7", 1046 | "snappy": "^7.2.2", 1047 | "socks": "^2.7.1" 1048 | }, 1049 | "peerDependenciesMeta": { 1050 | "@aws-sdk/credential-providers": { 1051 | "optional": true 1052 | }, 1053 | "@mongodb-js/zstd": { 1054 | "optional": true 1055 | }, 1056 | "gcp-metadata": { 1057 | "optional": true 1058 | }, 1059 | "kerberos": { 1060 | "optional": true 1061 | }, 1062 | "mongodb-client-encryption": { 1063 | "optional": true 1064 | }, 1065 | "snappy": { 1066 | "optional": true 1067 | }, 1068 | "socks": { 1069 | "optional": true 1070 | } 1071 | } 1072 | }, 1073 | "node_modules/mongodb-connection-string-url": { 1074 | "version": "3.0.0", 1075 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.0.tgz", 1076 | "integrity": "sha512-t1Vf+m1I5hC2M5RJx/7AtxgABy1cZmIPQRMXw+gEIPn/cZNF3Oiy+l0UIypUwVB5trcWHq3crg2g3uAR9aAwsQ==", 1077 | "dependencies": { 1078 | "@types/whatwg-url": "^11.0.2", 1079 | "whatwg-url": "^13.0.0" 1080 | } 1081 | }, 1082 | "node_modules/mongoose": { 1083 | "version": "8.1.2", 1084 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.1.2.tgz", 1085 | "integrity": "sha512-5KMq7k6KmFCIB8/YMKMFsWdsdNkBwuARDRHDRpp5GKC78eT0LwHIaMEKo6gDUg3zBuMoy9OdcM/6f4dkW06C/A==", 1086 | "dependencies": { 1087 | "bson": "^6.2.0", 1088 | "kareem": "2.5.1", 1089 | "mongodb": "6.3.0", 1090 | "mpath": "0.9.0", 1091 | "mquery": "5.0.0", 1092 | "ms": "2.1.3", 1093 | "sift": "16.0.1" 1094 | }, 1095 | "engines": { 1096 | "node": ">=16.20.1" 1097 | }, 1098 | "funding": { 1099 | "type": "opencollective", 1100 | "url": "https://opencollective.com/mongoose" 1101 | } 1102 | }, 1103 | "node_modules/mongoose/node_modules/ms": { 1104 | "version": "2.1.3", 1105 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1106 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1107 | }, 1108 | "node_modules/mpath": { 1109 | "version": "0.9.0", 1110 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 1111 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 1112 | "engines": { 1113 | "node": ">=4.0.0" 1114 | } 1115 | }, 1116 | "node_modules/mquery": { 1117 | "version": "5.0.0", 1118 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 1119 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 1120 | "dependencies": { 1121 | "debug": "4.x" 1122 | }, 1123 | "engines": { 1124 | "node": ">=14.0.0" 1125 | } 1126 | }, 1127 | "node_modules/mquery/node_modules/debug": { 1128 | "version": "4.3.4", 1129 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1130 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1131 | "dependencies": { 1132 | "ms": "2.1.2" 1133 | }, 1134 | "engines": { 1135 | "node": ">=6.0" 1136 | }, 1137 | "peerDependenciesMeta": { 1138 | "supports-color": { 1139 | "optional": true 1140 | } 1141 | } 1142 | }, 1143 | "node_modules/mquery/node_modules/ms": { 1144 | "version": "2.1.2", 1145 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1146 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1147 | }, 1148 | "node_modules/ms": { 1149 | "version": "2.0.0", 1150 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1151 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1152 | }, 1153 | "node_modules/negotiator": { 1154 | "version": "0.6.3", 1155 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1156 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1157 | "engines": { 1158 | "node": ">= 0.6" 1159 | } 1160 | }, 1161 | "node_modules/node-addon-api": { 1162 | "version": "5.1.0", 1163 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 1164 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" 1165 | }, 1166 | "node_modules/node-fetch": { 1167 | "version": "2.7.0", 1168 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1169 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1170 | "dependencies": { 1171 | "whatwg-url": "^5.0.0" 1172 | }, 1173 | "engines": { 1174 | "node": "4.x || >=6.0.0" 1175 | }, 1176 | "peerDependencies": { 1177 | "encoding": "^0.1.0" 1178 | }, 1179 | "peerDependenciesMeta": { 1180 | "encoding": { 1181 | "optional": true 1182 | } 1183 | } 1184 | }, 1185 | "node_modules/node-fetch/node_modules/tr46": { 1186 | "version": "0.0.3", 1187 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1188 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 1189 | }, 1190 | "node_modules/node-fetch/node_modules/webidl-conversions": { 1191 | "version": "3.0.1", 1192 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1193 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 1194 | }, 1195 | "node_modules/node-fetch/node_modules/whatwg-url": { 1196 | "version": "5.0.0", 1197 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1198 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 1199 | "dependencies": { 1200 | "tr46": "~0.0.3", 1201 | "webidl-conversions": "^3.0.0" 1202 | } 1203 | }, 1204 | "node_modules/nopt": { 1205 | "version": "5.0.0", 1206 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1207 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1208 | "dependencies": { 1209 | "abbrev": "1" 1210 | }, 1211 | "bin": { 1212 | "nopt": "bin/nopt.js" 1213 | }, 1214 | "engines": { 1215 | "node": ">=6" 1216 | } 1217 | }, 1218 | "node_modules/npmlog": { 1219 | "version": "5.0.1", 1220 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 1221 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 1222 | "dependencies": { 1223 | "are-we-there-yet": "^2.0.0", 1224 | "console-control-strings": "^1.1.0", 1225 | "gauge": "^3.0.0", 1226 | "set-blocking": "^2.0.0" 1227 | } 1228 | }, 1229 | "node_modules/object-assign": { 1230 | "version": "4.1.1", 1231 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1232 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1233 | "engines": { 1234 | "node": ">=0.10.0" 1235 | } 1236 | }, 1237 | "node_modules/object-inspect": { 1238 | "version": "1.13.1", 1239 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1240 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1241 | "funding": { 1242 | "url": "https://github.com/sponsors/ljharb" 1243 | } 1244 | }, 1245 | "node_modules/on-finished": { 1246 | "version": "2.4.1", 1247 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1248 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1249 | "dependencies": { 1250 | "ee-first": "1.1.1" 1251 | }, 1252 | "engines": { 1253 | "node": ">= 0.8" 1254 | } 1255 | }, 1256 | "node_modules/once": { 1257 | "version": "1.4.0", 1258 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1259 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1260 | "dependencies": { 1261 | "wrappy": "1" 1262 | } 1263 | }, 1264 | "node_modules/parseurl": { 1265 | "version": "1.3.3", 1266 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1267 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1268 | "engines": { 1269 | "node": ">= 0.8" 1270 | } 1271 | }, 1272 | "node_modules/path-is-absolute": { 1273 | "version": "1.0.1", 1274 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1275 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1276 | "engines": { 1277 | "node": ">=0.10.0" 1278 | } 1279 | }, 1280 | "node_modules/path-to-regexp": { 1281 | "version": "0.1.7", 1282 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1283 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1284 | }, 1285 | "node_modules/proxy-addr": { 1286 | "version": "2.0.7", 1287 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1288 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1289 | "dependencies": { 1290 | "forwarded": "0.2.0", 1291 | "ipaddr.js": "1.9.1" 1292 | }, 1293 | "engines": { 1294 | "node": ">= 0.10" 1295 | } 1296 | }, 1297 | "node_modules/punycode": { 1298 | "version": "2.3.1", 1299 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1300 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1301 | "engines": { 1302 | "node": ">=6" 1303 | } 1304 | }, 1305 | "node_modules/q": { 1306 | "version": "1.5.1", 1307 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1308 | "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", 1309 | "engines": { 1310 | "node": ">=0.6.0", 1311 | "teleport": ">=0.2.0" 1312 | } 1313 | }, 1314 | "node_modules/qs": { 1315 | "version": "6.11.0", 1316 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1317 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1318 | "dependencies": { 1319 | "side-channel": "^1.0.4" 1320 | }, 1321 | "engines": { 1322 | "node": ">=0.6" 1323 | }, 1324 | "funding": { 1325 | "url": "https://github.com/sponsors/ljharb" 1326 | } 1327 | }, 1328 | "node_modules/range-parser": { 1329 | "version": "1.2.1", 1330 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1331 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1332 | "engines": { 1333 | "node": ">= 0.6" 1334 | } 1335 | }, 1336 | "node_modules/raw-body": { 1337 | "version": "2.5.1", 1338 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1339 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1340 | "dependencies": { 1341 | "bytes": "3.1.2", 1342 | "http-errors": "2.0.0", 1343 | "iconv-lite": "0.4.24", 1344 | "unpipe": "1.0.0" 1345 | }, 1346 | "engines": { 1347 | "node": ">= 0.8" 1348 | } 1349 | }, 1350 | "node_modules/readable-stream": { 1351 | "version": "3.6.2", 1352 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1353 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1354 | "dependencies": { 1355 | "inherits": "^2.0.3", 1356 | "string_decoder": "^1.1.1", 1357 | "util-deprecate": "^1.0.1" 1358 | }, 1359 | "engines": { 1360 | "node": ">= 6" 1361 | } 1362 | }, 1363 | "node_modules/rimraf": { 1364 | "version": "3.0.2", 1365 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1366 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1367 | "dependencies": { 1368 | "glob": "^7.1.3" 1369 | }, 1370 | "bin": { 1371 | "rimraf": "bin.js" 1372 | }, 1373 | "funding": { 1374 | "url": "https://github.com/sponsors/isaacs" 1375 | } 1376 | }, 1377 | "node_modules/safe-buffer": { 1378 | "version": "5.2.1", 1379 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1380 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1381 | "funding": [ 1382 | { 1383 | "type": "github", 1384 | "url": "https://github.com/sponsors/feross" 1385 | }, 1386 | { 1387 | "type": "patreon", 1388 | "url": "https://www.patreon.com/feross" 1389 | }, 1390 | { 1391 | "type": "consulting", 1392 | "url": "https://feross.org/support" 1393 | } 1394 | ] 1395 | }, 1396 | "node_modules/safer-buffer": { 1397 | "version": "2.1.2", 1398 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1399 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1400 | }, 1401 | "node_modules/semver": { 1402 | "version": "7.6.0", 1403 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 1404 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 1405 | "dependencies": { 1406 | "lru-cache": "^6.0.0" 1407 | }, 1408 | "bin": { 1409 | "semver": "bin/semver.js" 1410 | }, 1411 | "engines": { 1412 | "node": ">=10" 1413 | } 1414 | }, 1415 | "node_modules/send": { 1416 | "version": "0.18.0", 1417 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1418 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1419 | "dependencies": { 1420 | "debug": "2.6.9", 1421 | "depd": "2.0.0", 1422 | "destroy": "1.2.0", 1423 | "encodeurl": "~1.0.2", 1424 | "escape-html": "~1.0.3", 1425 | "etag": "~1.8.1", 1426 | "fresh": "0.5.2", 1427 | "http-errors": "2.0.0", 1428 | "mime": "1.6.0", 1429 | "ms": "2.1.3", 1430 | "on-finished": "2.4.1", 1431 | "range-parser": "~1.2.1", 1432 | "statuses": "2.0.1" 1433 | }, 1434 | "engines": { 1435 | "node": ">= 0.8.0" 1436 | } 1437 | }, 1438 | "node_modules/send/node_modules/ms": { 1439 | "version": "2.1.3", 1440 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1441 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1442 | }, 1443 | "node_modules/serve-static": { 1444 | "version": "1.15.0", 1445 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1446 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1447 | "dependencies": { 1448 | "encodeurl": "~1.0.2", 1449 | "escape-html": "~1.0.3", 1450 | "parseurl": "~1.3.3", 1451 | "send": "0.18.0" 1452 | }, 1453 | "engines": { 1454 | "node": ">= 0.8.0" 1455 | } 1456 | }, 1457 | "node_modules/set-blocking": { 1458 | "version": "2.0.0", 1459 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1460 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 1461 | }, 1462 | "node_modules/set-function-length": { 1463 | "version": "1.2.1", 1464 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", 1465 | "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", 1466 | "dependencies": { 1467 | "define-data-property": "^1.1.2", 1468 | "es-errors": "^1.3.0", 1469 | "function-bind": "^1.1.2", 1470 | "get-intrinsic": "^1.2.3", 1471 | "gopd": "^1.0.1", 1472 | "has-property-descriptors": "^1.0.1" 1473 | }, 1474 | "engines": { 1475 | "node": ">= 0.4" 1476 | } 1477 | }, 1478 | "node_modules/setprototypeof": { 1479 | "version": "1.2.0", 1480 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1481 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1482 | }, 1483 | "node_modules/side-channel": { 1484 | "version": "1.0.5", 1485 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", 1486 | "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", 1487 | "dependencies": { 1488 | "call-bind": "^1.0.6", 1489 | "es-errors": "^1.3.0", 1490 | "get-intrinsic": "^1.2.4", 1491 | "object-inspect": "^1.13.1" 1492 | }, 1493 | "engines": { 1494 | "node": ">= 0.4" 1495 | }, 1496 | "funding": { 1497 | "url": "https://github.com/sponsors/ljharb" 1498 | } 1499 | }, 1500 | "node_modules/sift": { 1501 | "version": "16.0.1", 1502 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 1503 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 1504 | }, 1505 | "node_modules/signal-exit": { 1506 | "version": "3.0.7", 1507 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1508 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1509 | }, 1510 | "node_modules/sparse-bitfield": { 1511 | "version": "3.0.3", 1512 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1513 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1514 | "dependencies": { 1515 | "memory-pager": "^1.0.2" 1516 | } 1517 | }, 1518 | "node_modules/statuses": { 1519 | "version": "2.0.1", 1520 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1521 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1522 | "engines": { 1523 | "node": ">= 0.8" 1524 | } 1525 | }, 1526 | "node_modules/streamsearch": { 1527 | "version": "1.1.0", 1528 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1529 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1530 | "engines": { 1531 | "node": ">=10.0.0" 1532 | } 1533 | }, 1534 | "node_modules/string_decoder": { 1535 | "version": "1.3.0", 1536 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1537 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1538 | "dependencies": { 1539 | "safe-buffer": "~5.2.0" 1540 | } 1541 | }, 1542 | "node_modules/string-width": { 1543 | "version": "4.2.3", 1544 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1545 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1546 | "dependencies": { 1547 | "emoji-regex": "^8.0.0", 1548 | "is-fullwidth-code-point": "^3.0.0", 1549 | "strip-ansi": "^6.0.1" 1550 | }, 1551 | "engines": { 1552 | "node": ">=8" 1553 | } 1554 | }, 1555 | "node_modules/strip-ansi": { 1556 | "version": "6.0.1", 1557 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1558 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1559 | "dependencies": { 1560 | "ansi-regex": "^5.0.1" 1561 | }, 1562 | "engines": { 1563 | "node": ">=8" 1564 | } 1565 | }, 1566 | "node_modules/tar": { 1567 | "version": "6.2.0", 1568 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", 1569 | "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", 1570 | "dependencies": { 1571 | "chownr": "^2.0.0", 1572 | "fs-minipass": "^2.0.0", 1573 | "minipass": "^5.0.0", 1574 | "minizlib": "^2.1.1", 1575 | "mkdirp": "^1.0.3", 1576 | "yallist": "^4.0.0" 1577 | }, 1578 | "engines": { 1579 | "node": ">=10" 1580 | } 1581 | }, 1582 | "node_modules/toidentifier": { 1583 | "version": "1.0.1", 1584 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1585 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1586 | "engines": { 1587 | "node": ">=0.6" 1588 | } 1589 | }, 1590 | "node_modules/tr46": { 1591 | "version": "4.1.1", 1592 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", 1593 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", 1594 | "dependencies": { 1595 | "punycode": "^2.3.0" 1596 | }, 1597 | "engines": { 1598 | "node": ">=14" 1599 | } 1600 | }, 1601 | "node_modules/type-is": { 1602 | "version": "1.6.18", 1603 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1604 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1605 | "dependencies": { 1606 | "media-typer": "0.3.0", 1607 | "mime-types": "~2.1.24" 1608 | }, 1609 | "engines": { 1610 | "node": ">= 0.6" 1611 | } 1612 | }, 1613 | "node_modules/unpipe": { 1614 | "version": "1.0.0", 1615 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1616 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1617 | "engines": { 1618 | "node": ">= 0.8" 1619 | } 1620 | }, 1621 | "node_modules/util-deprecate": { 1622 | "version": "1.0.2", 1623 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1624 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1625 | }, 1626 | "node_modules/utils-merge": { 1627 | "version": "1.0.1", 1628 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1629 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1630 | "engines": { 1631 | "node": ">= 0.4.0" 1632 | } 1633 | }, 1634 | "node_modules/validator": { 1635 | "version": "13.11.0", 1636 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", 1637 | "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", 1638 | "engines": { 1639 | "node": ">= 0.10" 1640 | } 1641 | }, 1642 | "node_modules/vary": { 1643 | "version": "1.1.2", 1644 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1645 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1646 | "engines": { 1647 | "node": ">= 0.8" 1648 | } 1649 | }, 1650 | "node_modules/webidl-conversions": { 1651 | "version": "7.0.0", 1652 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1653 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1654 | "engines": { 1655 | "node": ">=12" 1656 | } 1657 | }, 1658 | "node_modules/whatwg-url": { 1659 | "version": "13.0.0", 1660 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", 1661 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", 1662 | "dependencies": { 1663 | "tr46": "^4.1.1", 1664 | "webidl-conversions": "^7.0.0" 1665 | }, 1666 | "engines": { 1667 | "node": ">=16" 1668 | } 1669 | }, 1670 | "node_modules/wide-align": { 1671 | "version": "1.1.5", 1672 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 1673 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 1674 | "dependencies": { 1675 | "string-width": "^1.0.2 || 2 || 3 || 4" 1676 | } 1677 | }, 1678 | "node_modules/wrappy": { 1679 | "version": "1.0.2", 1680 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1681 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 1682 | }, 1683 | "node_modules/yallist": { 1684 | "version": "4.0.0", 1685 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1686 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1687 | } 1688 | } 1689 | } 1690 | --------------------------------------------------------------------------------