├── 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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------