├── frontend
├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
├── src
│ ├── image
│ │ ├── aa.jpg
│ │ ├── icon.png
│ │ ├── logo.png
│ │ ├── images.jpeg
│ │ ├── logo2.png
│ │ ├── labrador-puppy-royalty-free-image-1626252338.jpg
│ │ └── rectangle8.svg
│ ├── App.css
│ ├── components
│ │ ├── showallproducts.css
│ │ ├── Logout.css
│ │ ├── Logout.js
│ │ ├── Register.js
│ │ ├── AdminLogin.js
│ │ ├── Login.js
│ │ ├── Login.css
│ │ ├── saveproduct.js
│ │ ├── AdminView.js
│ │ └── showallproducts.js
│ ├── store
│ │ └── store.js
│ ├── index.css
│ ├── index.js
│ ├── slices
│ │ └── userSlice.js
│ └── App.js
├── package.json
└── README.md
├── backend
├── .env
├── public
│ └── pets
│ │ ├── images.jpeg
│ │ ├── licensed-image.jpeg
│ │ ├── Snapchat-1163174235.jpg
│ │ ├── licensed-image (2).jpeg
│ │ ├── licensed-image (4).jpeg
│ │ ├── favpng_cat-silhouette-clip-art.png
│ │ ├── b653a3e79d74ee26b3d9d6ea3636d1c2.jpg
│ │ ├── Types-of-Fish-Species-In-World-and-Their-Facts.jpg
│ │ ├── find-your-furmate-high-resolution-color-logo.png
│ │ └── labrador-puppy-royalty-free-image-1626252338.jpg
├── src
│ ├── routes
│ │ ├── company.js
│ │ ├── order.js
│ │ ├── buyer.js
│ │ └── products.js
│ ├── server.js
│ ├── middlewears
│ │ └── verifyToken.js
│ ├── model
│ │ ├── admin.js
│ │ ├── users.js
│ │ ├── adoptions.js
│ │ └── pets.js
│ ├── app.js
│ └── controllers
│ │ ├── adoptions.js
│ │ ├── admin.js
│ │ ├── users.js
│ │ └── pets.js
├── package.json
└── package-lock.json
├── ScreenShots
└── loginpage.png
├── README.md
└── .gitignore
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/backend/.env:
--------------------------------------------------------------------------------
1 | PORT=3001
2 | MONGO_URI=mongodb://127.0.0.1:27017/adopt
3 | JWT_TOKEN_KEY=asdwasdwawsndjwndf23edfhjhfas
--------------------------------------------------------------------------------
/ScreenShots/loginpage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/ScreenShots/loginpage.png
--------------------------------------------------------------------------------
/frontend/src/image/aa.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/aa.jpg
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/public/logo192.png
--------------------------------------------------------------------------------
/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/public/logo512.png
--------------------------------------------------------------------------------
/frontend/src/image/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/icon.png
--------------------------------------------------------------------------------
/frontend/src/image/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/logo.png
--------------------------------------------------------------------------------
/frontend/src/image/images.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/images.jpeg
--------------------------------------------------------------------------------
/frontend/src/image/logo2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/logo2.png
--------------------------------------------------------------------------------
/backend/public/pets/images.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/images.jpeg
--------------------------------------------------------------------------------
/backend/public/pets/licensed-image.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/licensed-image.jpeg
--------------------------------------------------------------------------------
/backend/public/pets/Snapchat-1163174235.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/Snapchat-1163174235.jpg
--------------------------------------------------------------------------------
/backend/public/pets/licensed-image (2).jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/licensed-image (2).jpeg
--------------------------------------------------------------------------------
/backend/public/pets/licensed-image (4).jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/licensed-image (4).jpeg
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | box-sizing: border-box;
5 | }
6 |
7 | body {
8 | background: rgb(236, 236, 236);
9 | }
10 |
--------------------------------------------------------------------------------
/backend/public/pets/favpng_cat-silhouette-clip-art.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/favpng_cat-silhouette-clip-art.png
--------------------------------------------------------------------------------
/backend/public/pets/b653a3e79d74ee26b3d9d6ea3636d1c2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/b653a3e79d74ee26b3d9d6ea3636d1c2.jpg
--------------------------------------------------------------------------------
/frontend/src/components/showallproducts.css:
--------------------------------------------------------------------------------
1 | .show {
2 | background-image: './image/logo2.png';
3 | background-repeat: no-repeat;
4 | background-position: -200% 30%;
5 | background-size: 1000px 622px;
6 | }
--------------------------------------------------------------------------------
/frontend/src/image/labrador-puppy-royalty-free-image-1626252338.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/frontend/src/image/labrador-puppy-royalty-free-image-1626252338.jpg
--------------------------------------------------------------------------------
/backend/public/pets/Types-of-Fish-Species-In-World-and-Their-Facts.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/Types-of-Fish-Species-In-World-and-Their-Facts.jpg
--------------------------------------------------------------------------------
/backend/public/pets/find-your-furmate-high-resolution-color-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/find-your-furmate-high-resolution-color-logo.png
--------------------------------------------------------------------------------
/backend/public/pets/labrador-puppy-royalty-free-image-1626252338.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sahanrashmikaslk/MERN-PetAdoptionWebApplication/HEAD/backend/public/pets/labrador-puppy-royalty-free-image-1626252338.jpg
--------------------------------------------------------------------------------
/frontend/src/store/store.js:
--------------------------------------------------------------------------------
1 | import { configureStore } from "@reduxjs/toolkit";
2 | import userReducer from "../slices/userSlice";
3 |
4 | export default configureStore({
5 | reducer: {
6 | user: userReducer,
7 | },
8 | });
9 |
--------------------------------------------------------------------------------
/backend/src/routes/company.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const router = express.Router();
4 | const CompanyController = require('../controllers/admin');
5 |
6 | router.post('/', CompanyController.register);
7 | router.post('/login', CompanyController.login);
8 |
9 | module.exports = router;
--------------------------------------------------------------------------------
/backend/src/routes/order.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const router = express.Router();
4 | const OrderController = require('../controllers/adoptions');
5 |
6 |
7 | router.post('/', OrderController.create)
8 | router.get('/',OrderController.getAll)
9 |
10 | module.exports = router;
--------------------------------------------------------------------------------
/backend/src/routes/buyer.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const router = express.Router();
4 | const BuyerController = require('../controllers/users');
5 |
6 |
7 | router.post('/', BuyerController.register)
8 | router.post('/login', BuyerController.login)
9 |
10 | module.exports = router;
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/backend/src/server.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config();
2 | // const express = require('express');
3 | const mongoose = require('mongoose');
4 | const port = process.env.PORT;
5 | const app = require('./app');
6 |
7 |
8 | mongoose.connect(
9 | process.env.MONGO_URI,
10 | {}).then(result => {
11 | console.log("db conntected")
12 | app.listen(port, () => {
13 | console.log(`Example app listening on port ${port}`)
14 | })
15 | }
16 | ).catch(err => console.log(err))
17 |
--------------------------------------------------------------------------------
/frontend/src/components/Logout.css:
--------------------------------------------------------------------------------
1 | .logout {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | justify-content: center;
6 | height: 100vh;
7 | font-family: "Inter";
8 | }
9 |
10 | .logout__button {
11 | min-width: 300px;
12 | padding: 17px 30px;
13 | margin-top: 20px;
14 | background: black;
15 | border: none;
16 | color: white;
17 | font-size: 14px;
18 | font-family: "Inter";
19 | border-radius: 3px;
20 | }
21 |
22 | .user__name {
23 | color: #8d0ada;
24 | }
25 |
--------------------------------------------------------------------------------
/backend/src/middlewears/verifyToken.js:
--------------------------------------------------------------------------------
1 | const jwt = require('jsonwebtoken');
2 |
3 | module.exports = function (req, res, next) {
4 | const token = req.body.token || req.query.token || req.headers['x-access-token'];
5 |
6 | if (!token) {
7 | res.status(401).send('Token not provided');
8 | }
9 |
10 | try {
11 | const decoded = jwt.verify(token, process.env.JWT_TOKEN_KEY);
12 | req.user = decoded;
13 | } catch (error) {
14 | res.status(400).send('Invalid token');
15 | }
16 |
17 | return next();
18 |
19 | }
--------------------------------------------------------------------------------
/backend/src/model/admin.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 | const Schema = mongoose.Schema;
3 |
4 | const adminSchema = new Schema({
5 | name: {
6 | type: String,
7 | required: true,
8 | },
9 | password: {
10 | type: String,
11 | required: true,
12 | },
13 |
14 | email: {
15 | type: String,
16 | required: true,
17 | },
18 | token: {
19 | type: String,
20 | required: false,
21 | }
22 | });
23 |
24 | const Admin = mongoose.model('Comapny', adminSchema);
25 |
26 | module.exports = Admin;
--------------------------------------------------------------------------------
/backend/src/routes/products.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const ProductController = require('../controllers/pets')
3 |
4 | const router = express.Router()
5 |
6 | const verifyToken = require('../middlewears/verifyToken')
7 |
8 | router.post('/', ProductController.create);
9 | router.put('/:id', ProductController.update)
10 | router.delete('/:id', ProductController.delete)
11 | router.get('/all', ProductController.getAll)
12 |
13 | router.get('/:id', ProductController.getById)
14 | router.get('/search/:search', ProductController.search)
15 |
16 | module.exports = router;
17 |
--------------------------------------------------------------------------------
/backend/src/model/users.js:
--------------------------------------------------------------------------------
1 | //create model
2 | const mongoose = require('mongoose');
3 | const Schema = mongoose.Schema;
4 |
5 | const userSchema = new Schema({
6 |
7 | name: {
8 | type: String,
9 | required: true,
10 | },
11 | email: {
12 | type: String,
13 | required: true,
14 | },
15 | password: {
16 | type: String,
17 | required: true,
18 | },
19 | token: {
20 | type: String,
21 | required: false,
22 | }
23 |
24 |
25 | });
26 |
27 | const User = mongoose.model('User', userSchema);
28 |
29 | module.exports = User;
--------------------------------------------------------------------------------
/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom/client";
3 | import App from "./App";
4 | import { Provider } from "react-redux";
5 | import store from "./store/store";
6 | import { ThemeProvider, createTheme } from "@mui/material/styles";
7 | const root = ReactDOM.createRoot(document.getElementById("root"));
8 | const defaultTheme = createTheme();
9 | root.render(
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | );
19 |
20 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon src/server.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "bcrypt": "^5.1.1",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.3.1",
16 | "express": "^4.18.2",
17 | "express-fileupload": "^1.4.1",
18 | "http-errors": "^2.0.0",
19 | "jsonwebtoken": "^9.0.2",
20 | "mongoose": "^7.6.1"
21 | },
22 | "devDependencies": {
23 | "nodemon": "^3.0.1"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/backend/src/model/adoptions.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const Schema = mongoose.Schema;
3 |
4 | const adoptionSchema = new Schema({
5 | user_id: {
6 | type: String,
7 | required: true,
8 | },
9 | user_name: {
10 | type: String
11 | },
12 | pet_id: {
13 | type: String,
14 | required: true,
15 | },
16 | pet_name: {
17 | type: String
18 | },
19 | status: {
20 | type: String,
21 | required: true,
22 | },
23 | date: {
24 | type: String,
25 | required: true,
26 | }
27 | });
28 |
29 | const Adoption = mongoose.model('Adoption', adoptionSchema);
30 |
31 | module.exports = Adoption;
--------------------------------------------------------------------------------
/frontend/src/components/Logout.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useDispatch, useSelector } from "react-redux";
3 | import "./Logout.css";
4 | import { logout, selectUser } from "../slices/userSlice";
5 |
6 | const Logout = () => {
7 | const dispatch = useDispatch();
8 | const user = useSelector(selectUser);
9 |
10 | const Logout = (e) => {
11 | dispatch(logout());
12 | };
13 |
14 |
15 | return (
16 |
25 | );
26 | };
27 |
28 | export default Logout;
29 |
--------------------------------------------------------------------------------
/frontend/src/slices/userSlice.js:
--------------------------------------------------------------------------------
1 | import { createSlice } from "@reduxjs/toolkit";
2 |
3 | export const userSlice = createSlice({
4 | name: "user",
5 | initialState: {
6 | user: null,
7 | },
8 | reducers: {
9 | login: (state, action) => {
10 | state.user = action.payload;
11 | localStorage.setItem("user", JSON.stringify(state.user));
12 | },
13 | logout: (state) => {
14 | state.user = null;
15 | localStorage.setItem("user", null);
16 | },
17 | },
18 | });
19 |
20 | export const { login, logout } = userSlice.actions;
21 |
22 | export const selectUser = (state) => {
23 | const stateTest = state.user.user;
24 | return JSON.parse(localStorage.getItem("user"));
25 | }
26 |
27 | export default userSlice.reducer;
28 |
--------------------------------------------------------------------------------
/backend/src/model/pets.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const Schema = mongoose.Schema;
3 |
4 | const petSchema = new Schema({
5 | petname: {
6 | type: String,
7 | required: true,
8 | },
9 | pettype: {
10 | type: String,
11 | required: true,
12 | },
13 | petbreed: {
14 | type: String,
15 | required: true,
16 | },
17 | petage: {
18 | type: String,
19 | required: true,
20 | },
21 | image: {
22 | type: String,
23 | required: true,
24 | },
25 | description: {
26 | type: String,
27 | required: false,
28 | },
29 | location: {
30 | type: String,
31 | required: true,
32 | },
33 | status: {
34 | type: String,
35 | required: true,
36 | }
37 |
38 | });
39 |
40 | const Pet = mongoose.model('Pet', petSchema);
41 |
42 | module.exports = Pet;
--------------------------------------------------------------------------------
/backend/src/app.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config()
2 | const express = require('express')
3 | const app = express()
4 | const createHttpError = require('http-errors')
5 | const BuyerRouter = require('./routes/buyer')
6 | const CompanyRouter = require('./routes/company')
7 | const ProductRouter = require('./routes/products')
8 | const OrderRouter = require('./routes/order')
9 | const fileUpload = require('express-fileupload');
10 |
11 | app.use(fileUpload());
12 |
13 | app.use('/public/pets', express.static('public/pets'))
14 |
15 | //cors
16 | const cors = require('cors')
17 | app.use(cors())
18 |
19 | app.use(express.json())
20 |
21 | app.use('/api/v1/users', BuyerRouter);
22 | app.use('/api/v1/admin', CompanyRouter);
23 | app.use('/api/v1/pets', ProductRouter)
24 | app.use('/api/v1/adoptions', OrderRouter)
25 |
26 | app.use((err, req, res, next) => {
27 | if (createHttpError.isHttpError(err)) {
28 | res.status(err.status).send({ message: err.message })
29 | } else {
30 | res.status(500).send({ message: err.message })
31 | }
32 | //error unknown
33 | res.status(500).send({ message: "Error Unknown" })
34 | })
35 |
36 | module.exports = app;
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@emotion/react": "^11.11.1",
7 | "@emotion/styled": "^11.11.0",
8 | "@mui/material": "^5.14.13",
9 | "@reduxjs/toolkit": "^1.4.0",
10 | "@testing-library/jest-dom": "^5.17.0",
11 | "@testing-library/react": "^13.4.0",
12 | "@testing-library/user-event": "^13.5.0",
13 | "axios": "^1.5.1",
14 | "react": "^18.2.0",
15 | "react-dom": "^18.2.0",
16 | "react-redux": "^7.2.2",
17 | "react-router-dom": "^6.0.2",
18 | "react-scripts": "5.0.1",
19 | "redux": "^4.0.5",
20 | "web-vitals": "^2.1.4"
21 | },
22 | "scripts": {
23 | "start": "react-scripts start",
24 | "build": "react-scripts build",
25 | "test": "react-scripts test",
26 | "eject": "react-scripts eject"
27 | },
28 | "eslintConfig": {
29 | "extends": [
30 | "react-app",
31 | "react-app/jest"
32 | ]
33 | },
34 | "browserslist": {
35 | "production": [
36 | ">0.2%",
37 | "not dead",
38 | "not op_mini all"
39 | ],
40 | "development": [
41 | "last 1 chrome version",
42 | "last 1 firefox version",
43 | "last 1 safari version"
44 | ]
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/backend/src/controllers/adoptions.js:
--------------------------------------------------------------------------------
1 | const createHttpError = require('http-errors')
2 | const bcrypt = require('bcrypt');
3 | const OrderModel = require('../model/adoptions')
4 | const BuyerModel = require('../model/users');
5 | const PetModel = require('../model/pets')
6 |
7 | exports.create = async (req, res, next) => {
8 | const user_id = req.body.user_id
9 | const pet_id = req.body.pet_id
10 | try {
11 | if (!user_id || !pet_id) {
12 | throw createHttpError(400, 'Missing required parameters')
13 | }
14 |
15 | const isUserAvailable = await BuyerModel.findOne({ _id: user_id }).exec();
16 |
17 | if (!isUserAvailable) {
18 | throw createHttpError(400, 'User doesnt exists')
19 | }
20 |
21 | const isPet = await PetModel.findById(pet_id).exec();
22 |
23 | if (!isPet) {
24 | throw createHttpError(400, 'Pet doesnt exists')
25 | }
26 |
27 |
28 | const order = new OrderModel({
29 | user_id: user_id,
30 | user_name: isUserAvailable.name,
31 | pet_id: pet_id,
32 | pet_name: isPet.petname,
33 | status: "Request",
34 | date: new Date().toISOString()
35 | })
36 |
37 | const result = await order.save();
38 |
39 | res.status(201).send(result);
40 |
41 | } catch (error) {
42 | next(error)
43 |
44 | }
45 |
46 |
47 |
48 |
49 | }
50 |
51 | exports.getAll = async (req, res, next) => {
52 |
53 | try {
54 | const result = await OrderModel.find({status:"Request"}).exec();
55 | res.status(200).send(result);
56 | } catch (error) {
57 | next(error)
58 | }
59 |
60 | }
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
23 |
32 | Find Your FurMate
33 |
34 |
35 | You need to enable JavaScript to run this app.
36 |
37 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Pet Adoption Web Application using MERN
2 |
3 | 
4 |
5 | This is a MERN (MongoDB, Express.js, React.js, Node.js) stack project for a Pet Adoption Web Application. Users can view available pets for adoption, add new pets for adoption, and adopt pets.
6 |
7 | ## Features
8 |
9 | - User authentication: Users can sign up, log in, and log out.
10 | - CRUD operations: Users can perform CRUD (Create, Read, Update, Delete) operations on pet listings.
11 | - Image upload: Users can upload images of pets they want to put up for adoption.
12 | - Search functionality: Users can search for pets based on various parameters such as breed, age, etc.
13 | - Responsive design: The application is responsive and works seamlessly on various devices.
14 |
15 | ## Installation
16 |
17 | To run this project locally, follow these steps:
18 |
19 | 1. Clone the repository:
20 |
21 | ```
22 | git clone https://github.com/sahanrashmikaslk/MERN-PetAdoptationWebApplication.git
23 | ```
24 |
25 | 2. Navigate to the project directory:
26 |
27 | ```
28 | cd MERN-PetAdoptationWebApplication
29 | ```
30 |
31 | 3. Install dependencies:
32 |
33 | ```
34 | npm install
35 | ```
36 |
37 | 4. Set up environment variables:
38 |
39 | Create a `.env` file in the root directory and add the following variables:
40 |
41 | ```
42 | MONGODB_URI=
43 | JWT_SECRET=
44 | ```
45 |
46 | 5. Run the development server:
47 |
48 | ```
49 | npm run dev
50 | ```
51 |
52 | 6. Open http://localhost:3000 or whatever port in your browser to view the application.
53 |
54 | ## Technologies Used
55 |
56 | - **Frontend**
57 | - React.js
58 | - Redux (for state management)
59 | - Material UI (for styling)
60 | - **Backend**
61 | - Node.js
62 | - Express.js
63 | - MongoDB (with Mongoose ODM)
64 | - **Authentication**
65 | - JSON Web Tokens (JWT)
66 | - **Others**
67 | - Axios (for making HTTP requests)
68 |
69 | ## Acknowledgments
70 |
71 | - This project was inspired by the love for animals and the desire to help them find loving homes.
72 |
73 |
--------------------------------------------------------------------------------
/frontend/src/image/rectangle8.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/frontend/src/components/Register.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import axios from "axios";
3 |
4 | const Register = () => {
5 | const [name, setName] = useState("");
6 | const [email, setEmail] = useState("");
7 | const [password, setPassword] = useState("");
8 |
9 | const handleSubmit = async (e) => {
10 | e.preventDefault();
11 | await axios.post("http://localhost:3001/api/v1/users", {
12 | name: name,
13 | email: email,
14 | password: password
15 | }).then((response) => {
16 | console.log(response);
17 | window.location.href = "/";
18 | }).catch((error) => {
19 | console.log(error);
20 | });
21 |
22 | setEmail("");
23 | setPassword("");
24 | };
25 |
26 | return (
27 |
28 |
71 |
72 | );
73 | };
74 |
75 | export default Register;
--------------------------------------------------------------------------------
/backend/src/controllers/admin.js:
--------------------------------------------------------------------------------
1 | const createHttpError = require('http-errors')
2 | const bcrypt = require('bcrypt');
3 | const CompanyModel = require('../model/admin');
4 | const jwt = require('jsonwebtoken');
5 |
6 | exports.register = async (req, res, next) => {
7 | const email = req.body.email
8 | const password = req.body.password
9 | const name = req.body.name
10 | try {
11 | if (!email || !password || !name) {
12 | throw createHttpError(400, 'Missing required parameters')
13 | }
14 |
15 | const isCompanyAvailable = await CompanyModel.findOne({ email: email }).exec();
16 |
17 | if (isCompanyAvailable) {
18 | throw createHttpError(400, 'Company already exists')
19 | }
20 |
21 | const hashedPassword = await bcrypt.hash(password, 10);
22 |
23 | const company = new CompanyModel({
24 | name: name,
25 | email: email,
26 | password: hashedPassword
27 | })
28 |
29 | const result = await company.save();
30 |
31 | res.status(201).send(result);
32 |
33 |
34 | } catch (error) {
35 | next(error)
36 |
37 | }
38 |
39 |
40 | }
41 |
42 |
43 | exports.login = async (req, res, next) => {
44 | const email = req.body.email
45 | const password = req.body.password
46 |
47 | try {
48 | if (!email || !password) {
49 | throw createHttpError(400, 'Missing required parameters')
50 | }
51 |
52 | const company = await CompanyModel.findOne({ email: email }).exec();
53 |
54 | if (!company) {
55 | throw createHttpError(400, 'User does not exist')
56 | }
57 |
58 | const isPasswordValid = await bcrypt.compare(password, company.password);
59 |
60 | if (!isPasswordValid) {
61 | throw createHttpError(400, 'Invalid credentials')
62 | }
63 |
64 | const user = await CompanyModel.findOne({ email: email }).exec();
65 |
66 | const token = jwt.sign(
67 | {
68 | user_id: user._id,
69 | email: user.email,
70 | },
71 | process.env.JWT_TOKEN_KEY,
72 | {
73 | expiresIn: "4h",
74 | }
75 | )
76 |
77 | user.token = token;
78 |
79 | const result = await user.save();
80 |
81 | const response = {
82 | id: result._id,
83 | name: result.name,
84 | email: result.email,
85 | token: result.token,
86 | userType: "admin"
87 | }
88 |
89 | console.log(response);
90 |
91 | res.status(200).send(response);
92 |
93 |
94 | } catch (error) {
95 | next(error)
96 | }
97 |
98 | }
99 |
100 |
--------------------------------------------------------------------------------
/backend/src/controllers/users.js:
--------------------------------------------------------------------------------
1 | const BuyerModel = require('../model/users')
2 | const createHttpError = require('http-errors')
3 | const bcrypt = require('bcrypt');
4 | const jwt = require('jsonwebtoken');
5 |
6 |
7 | exports.login = async (req, res, next) => {
8 | const email = req.body.email
9 | const password = req.body.password
10 |
11 | try {
12 | if (!email || !password) {
13 | throw createHttpError(400, 'Missing required parameters')
14 | }
15 |
16 | const buyer = await BuyerModel.findOne({ email: email }).exec();
17 |
18 | if (!buyer) {
19 | throw createHttpError(400, 'User does not exist')
20 | }
21 |
22 | const isPasswordValid = await bcrypt.compare(password, buyer.password);
23 |
24 | if (!isPasswordValid) {
25 | throw createHttpError(400, 'Invalid credentials')
26 | }
27 |
28 | const user = await BuyerModel.findOne({ email: email }).exec();
29 |
30 | const token = jwt.sign(
31 | {
32 | user_id: user._id,
33 | email: user.email,
34 | },
35 | process.env.JWT_TOKEN_KEY,
36 | {
37 | expiresIn: "4h",
38 | }
39 | )
40 |
41 | user.token = token;
42 |
43 | const result = await user.save();
44 |
45 |
46 | const response = {
47 | id: result._id,
48 | name: result.name,
49 | email: result.email,
50 | phone: result.phone,
51 | token: result.token,
52 | userType: "buyer"
53 | }
54 |
55 |
56 | console.log(response);
57 |
58 | res.status(200).send(response);
59 |
60 | } catch (error) {
61 | next(error)
62 | }
63 | }
64 |
65 |
66 | exports.register = async (req, res, next) => {
67 | const email = req.body.email
68 | const password = req.body.password
69 | const name = req.body.name
70 | try {
71 | if (!email || !password || !name ) {
72 | throw createHttpError(400, 'Missing required parameters')
73 | }
74 |
75 | const isUserAvailable = await BuyerModel.findOne({ email: email }).exec();
76 |
77 | if (isUserAvailable) {
78 | throw createHttpError(400, 'User already exists')
79 | }
80 |
81 | const hashedPassword = await bcrypt.hash(password, 10);
82 |
83 | const buyer = new BuyerModel({
84 | name: name,
85 | email: email,
86 | password: hashedPassword
87 | })
88 |
89 | const result = await buyer.save();
90 |
91 | res.status(201).send(result);
92 |
93 |
94 | } catch (error) {
95 | next(error)
96 |
97 | }
98 |
99 |
100 | }
101 |
102 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 |
76 | # parcel-bundler cache (https://parceljs.org/)
77 | .cache
78 | .parcel-cache
79 |
80 | # Next.js build output
81 | .next
82 | out
83 |
84 | # Nuxt.js build / generate output
85 | .nuxt
86 | dist
87 |
88 | # Gatsby files
89 | .cache/
90 | # Comment in the public line in if your project uses Gatsby and not Next.js
91 | # https://nextjs.org/blog/next-9-1#public-directory-support
92 | # public
93 |
94 | # vuepress build output
95 | .vuepress/dist
96 |
97 | # vuepress v2.x temp and cache directory
98 | .temp
99 | .cache
100 |
101 | # Docusaurus cache and generated files
102 | .docusaurus
103 |
104 | # Serverless directories
105 | .serverless/
106 |
107 | # FuseBox cache
108 | .fusebox/
109 |
110 | # DynamoDB Local files
111 | .dynamodb/
112 |
113 | # TernJS port file
114 | .tern-port
115 |
116 | # Stores VSCode versions used for testing VSCode extensions
117 | .vscode-test
118 |
119 | # yarn v2
120 | .yarn/cache
121 | .yarn/unplugged
122 | .yarn/build-state.yml
123 | .yarn/install-state.gz
124 | .pnp.*
125 |
126 |
127 | .pnp.js
128 |
129 | # testing
130 | coverage
131 |
132 | # production
133 | build
134 |
135 | # misc
136 | .DS_Store
137 | .env.local
138 | .env.development.local
139 | .env.test.local
140 | .env.production.local
141 |
142 | npm-debug.log*
143 | yarn-debug.log*
144 | yarn-error.log*
145 |
--------------------------------------------------------------------------------
/frontend/src/components/AdminLogin.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import "./Login.css";
3 |
4 | import { login } from "../slices/userSlice";
5 | import { useDispatch } from "react-redux";
6 | import axios from "axios";
7 |
8 | const Admin = () => {
9 | const [email, setEmail] = useState("");
10 | const [password, setPassword] = useState("");
11 |
12 | const dispatch = useDispatch();
13 |
14 | const handleSubmit = async (e) => {
15 | e.preventDefault();
16 |
17 | await axios.post("http://localhost:3001/api/v1/admin/login", {
18 | email: email,
19 | password: password,
20 | }).then((response) => {
21 | if (response.status === 200) {
22 | // Successful login
23 | dispatch(login(response.data));
24 | // alert("Login Success");
25 | } else {
26 | // Handle non-200 response
27 | alert(`Login Error: ${response.status} - ${response.data.message}`);
28 | }
29 | }).catch((error) => {
30 | // Handle other errors
31 | alert(`Login Error: ${error.message}`);
32 | });
33 |
34 |
35 |
36 |
37 |
38 |
39 | setEmail("");
40 | setPassword("");
41 |
42 | // redirect to the logout page
43 | // window.location = "/logout";
44 | };
45 |
46 | return (
47 |
48 |
49 |
107 |
108 | );
109 | };
110 |
111 | export default Admin;
112 |
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Login from "./components/Login";
3 | import Register from "./components/Register";
4 | import CreateProduct from "./components/saveproduct";
5 | import GetAll from "./components/showallproducts";
6 | import AdminView from "./components/AdminView";
7 | import "./App.css";
8 | import Admin from "./components/AdminLogin";
9 | import { selectUser } from "./slices/userSlice";
10 | import { useSelector } from "react-redux";
11 | import Logout from "./components/Logout";
12 | import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
13 | import { AppBar, Container, Toolbar, Typography } from "@mui/material";
14 |
15 | import image from "../src/image/aa.jpg"
16 | const App = () => {
17 | const user = useSelector(selectUser);
18 | console.log(user);
19 |
20 | const userType = user?.userType;
21 |
22 | const isLoggedInAndAdmin = user && userType === "admin";
23 |
24 | return (
25 |
26 |
32 |
33 |
41 |
42 |
43 |
44 |
45 | :
47 |
48 | } />
49 | {/* :
52 | } /> */}
53 | :
56 | } />
57 | :
59 | } />
60 |
61 | :
63 | } />
64 | :
67 | } />
68 |
69 | :
72 | } />
73 |
74 | :
77 | } />
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | );
88 | };
89 |
90 | export default App;
91 |
--------------------------------------------------------------------------------
/frontend/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/frontend/src/components/Login.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import "./Login.css";
3 |
4 | import { login } from "../slices/userSlice";
5 | import { useDispatch } from "react-redux";
6 | import axios from "axios";
7 |
8 | const Login = () => {
9 | const [email, setEmail] = useState("");
10 | const [password, setPassword] = useState("");
11 |
12 | const dispatch = useDispatch();
13 |
14 | const handleSubmit = async (e) => {
15 | e.preventDefault();
16 |
17 | await axios.post("http://localhost:3001/api/v1/users/login", {
18 | email: email,
19 | password: password,
20 | }).then((response) => {
21 | if (response.status === 200) {
22 | // Successful login
23 | dispatch(login(response.data));
24 | console.log(response);
25 | window.location.href = "/";
26 | } else {
27 |
28 | console.error(`Login Error: ${response.status} - ${response.data.message}`);
29 |
30 | }})
31 | .catch((error) => {
32 |
33 | console.error("Login Error:", error);
34 |
35 | });
36 |
37 |
38 | setEmail("");
39 | setPassword("");
40 |
41 | // redirect to the logout page
42 | window.location = "/pets";
43 | };
44 |
45 | return (
46 |
47 |
48 |
49 |
50 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 | );
139 | };
140 |
141 | export default Login;
142 |
--------------------------------------------------------------------------------
/backend/src/controllers/pets.js:
--------------------------------------------------------------------------------
1 | const createHttpError = require('http-errors')
2 | const ProductModel = require('../model/pets')
3 | const mongoose = require('mongoose');
4 |
5 | exports.create = async (req, res, next) => {
6 | const {
7 | petname,
8 | pettype,
9 | petbreed,
10 | petage,
11 | description,
12 | location
13 | } = req.body;
14 |
15 | try {
16 | const { image } = req.files;
17 | if (!image) {
18 | throw createHttpError(404, "Image not found")
19 | }
20 | if (!image.mimetype.startsWith('image')) {
21 | throw createHttpError(400, 'Only images are allowed');
22 | }
23 | let filepath = __dirname + '../../../public/pets/' + image.name
24 | image.mv(filepath);
25 |
26 | let filepathtoUplaod = '/public/pets/' + image.name
27 |
28 | if (!petname || !pettype || !petbreed || !petage || !location) {
29 | throw createHttpError(400, 'Please provide all the required fields');
30 | }
31 |
32 | const pet = new ProductModel({
33 | petname,
34 | pettype,
35 | petbreed,
36 | petage,
37 | image: filepathtoUplaod,
38 | description,
39 | location,
40 | status: 'available'
41 | });
42 |
43 | const result = await pet.save();
44 |
45 | res.status(201).send(result);
46 |
47 |
48 |
49 |
50 |
51 | } catch (error) {
52 |
53 | next(error)
54 |
55 | }
56 |
57 | }
58 |
59 | exports.update = async (req, res, next) => {
60 |
61 | const petid = req.params.id;
62 |
63 | const {
64 | petname,
65 | pettype,
66 | petbreed,
67 | petage,
68 | description,
69 | location
70 | } = req.body;
71 |
72 | try {
73 |
74 | if (!petid) {
75 | throw createHttpError(400, 'Please provide pet id');
76 | }
77 |
78 | //check mongoose id
79 | if (!mongoose.isValidObjectId(petid)) {
80 | throw createHttpError(400, 'Please provide valid pet id');
81 | }
82 |
83 | //if req.files is not empty
84 | let pth;
85 | if (req.files) {
86 | const { image } = req.files;
87 | if (!image) {
88 | throw createHttpError(404, "Image not found")
89 | }
90 | if (!image.mimetype.startsWith('image')) {
91 | throw createHttpError(400, 'Only images are allowed');
92 | }
93 | let filepath = __dirname + '../../../public/pets/' + image.name
94 | image.mv(filepath);
95 |
96 | pth = '/public/pets/' + image.name
97 | }
98 |
99 | const pet = await ProductModel.findById(petid).exec();
100 |
101 | if (!pet) {
102 | throw createHttpError(404, 'Pet not found');
103 | }
104 |
105 | pet.petname = petname || pet.petname;
106 | pet.pettype = pettype || pet.pettype;
107 | pet.petbreed = petbreed || pet.petbreed;
108 | pet.petage = petage || pet.petage;
109 | pet.image = pth || pet.image;
110 | pet.description = description || pet.description;
111 | pet.location = location || pet.location;
112 |
113 | const result = await pet.save();
114 |
115 | res.status(200).send(result);
116 |
117 |
118 |
119 | } catch (error) {
120 |
121 | next(error)
122 |
123 | }
124 | }
125 |
126 | exports.getAll = async (req, res, next) => {
127 |
128 | try {
129 | const result = await ProductModel.find().exec();
130 | res.status(200).send(result);
131 | } catch (error) {
132 | next(error)
133 | }
134 |
135 | }
136 |
137 | exports.getById = async (req, res, next) => {
138 |
139 | try {
140 | const id = req.params.id;
141 | const result = await ProductModel.findById(id).exec();
142 | res.status(200).send(result);
143 | } catch (error) {
144 | next(error)
145 | }
146 |
147 | }
148 |
149 | exports.delete = async (req, res, next) => {
150 |
151 | try {
152 | const id = req.params.id;
153 | const result = await ProductModel.findByIdAndDelete(id).exec();
154 | res.status(200).send(result);
155 | } catch (error) {
156 | next(error)
157 | }
158 |
159 | }
160 |
161 | exports.search = async (req, res, next) => {
162 |
163 | // const search = req.params.search;
164 |
165 | try {
166 | const search = req.params.search;
167 |
168 | //user regex to search for petname,type,breed, case insensitive, and return all results
169 | const result = await ProductModel.find({ $or: [{ petname: { $regex: search, $options: 'i' } }, { pettype: { $regex: search, $options: 'i' } }, { petbreed: { $regex: search, $options: 'i' } }] }).exec();
170 |
171 | res.status(200).send(result);
172 | } catch (error) {
173 | next(error)
174 | }
175 |
176 | }
177 |
--------------------------------------------------------------------------------
/frontend/src/components/Login.css:
--------------------------------------------------------------------------------
1 | .login {
2 | display: flex;
3 | flex-direction: column;
4 | justify-content: center;
5 | height: 100vh;
6 | align-items: center;
7 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
8 | background-image: url('../image/logo.png');
9 | background-repeat: no-repeat;
10 | background-position: -200% 30%;
11 | background-size: 1000px 622px;
12 |
13 |
14 | }
15 |
16 | .login__form {
17 | display: flex;
18 | flex-direction: column;
19 | }
20 |
21 | .login__form > h1 {
22 | font-size: 25px;
23 | margin-bottom: 15px;
24 | padding-bottom: 10px;
25 | letter-spacing: -1px;
26 | }
27 |
28 | .login__form > input {
29 | min-width: 300px;
30 | padding: 20px 0;
31 | padding-left: 15px;
32 | margin-bottom: 15px;
33 | outline: none;
34 | border: 1px solid rgba(0, 0, 0, 0.085);
35 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
36 | border-radius: 10px;
37 | font-size: 15px;
38 | }
39 |
40 | .submit__btn {
41 | border-radius: 8px; /* Corrected the syntax for border-radius */
42 | border: 1px solid #ffffff3e;
43 | background: linear-gradient(318deg, rgba(0, 0, 0, 0.40) 0%, rgba(255, 255, 255, 0.40) 105.18%), #A483D6;
44 | background-blend-mode: soft-light, normal;
45 | box-shadow: 5px 5px 10px 0px #A6ABBD, -5px -5px 10px 0px #FAFBFF;
46 | color: #fff;
47 | transition: background 0.8s; /* Add a transition effect for a smooth color change */
48 | }
49 |
50 | .submit__btn:active {
51 | background: linear-gradient(318deg, rgba(255, 255, 255, 0.689) 0%, rgba(0, 0, 0, 0.40) 105.18%), #624490;
52 | /* Change the color for the :active state */
53 | }
54 |
55 |
56 | .sl-032421-41660-03-1-icon {
57 | position: absolute;
58 | top: 0;
59 | left: 0;
60 | width: 1700px;
61 | height: 1024px;
62 | object-fit: cover;
63 | z-index: -5;
64 | }
65 | .desktop-1-child {
66 | position: absolute;
67 | top: 162px;
68 | left: 783px;
69 | border-radius: var(--br-base);
70 | width: 503px;
71 | height: 647px;
72 | }
73 | .forgot-your-password,
74 | .new-here-create {
75 | position: absolute;
76 | top: 698px;
77 | left: 951px;
78 | }
79 | .new-here-create {
80 | top: 679px;
81 | left: 940px;
82 | display: inline-block;
83 | width: 200px;
84 | }
85 | .log-in {
86 | position: absolute;
87 | top: calc(50% - 12px);
88 | left: calc(50% - 64.5px);
89 | font-size: var(--font-size-base);
90 | letter-spacing: 0.03em;
91 | text-transform: capitalize;
92 | font-weight: 600;
93 | font-family: var(--font-open-sans);
94 | color: #fff;
95 | text-align: center;
96 | display: flex;
97 | align-items: center;
98 | justify-content: center;
99 | width: 129px;
100 | }
101 | .login-button,
102 | .icon {
103 | position: absolute;
104 | top: 11px;
105 | left: 11px;
106 | width: 39.46px;
107 | height: 38px;
108 | overflow: hidden;
109 | }
110 | .login-button {
111 | cursor: pointer;
112 | border: 0;
113 | padding: 0;
114 | background-color: transparent;
115 | top: 599px;
116 | left: 982px;
117 | border-radius: 20px;
118 | background: linear-gradient(
119 | -42.3deg,
120 | rgba(0, 0, 0, 0.4),
121 | rgba(255, 255, 255, 0.4)
122 | ),
123 | linear-gradient(180deg, #bba0e4, #a483d6);
124 | box-shadow: -5px -5px 10px #fafbff, 5px 5px 10px #a6abbd;
125 | width: 113px;
126 | height: 48px;
127 | }
128 | .password {
129 | position: absolute;
130 | top: calc(50% - 8px);
131 | left: 16px;
132 | letter-spacing: 1px;
133 | }
134 | .error-stroke-icon,
135 | .input-placeholder {
136 | position: absolute;
137 | height: 100%;
138 | width: 100%;
139 | top: 0;
140 | right: 0;
141 | bottom: 0;
142 | left: 0;
143 | border-radius: var(--br-base);
144 | }
145 | .input-placeholder {
146 | background: linear-gradient(#e6eef8, #e6eef8), #cfd8dc;
147 | box-shadow: -4px -4px 12px rgba(253, 255, 255, 0.8) inset,
148 | 4px 4px 12px rgba(187, 195, 206, 0.6) inset;
149 | }
150 | .error-stroke-icon {
151 | max-width: 100%;
152 | overflow: hidden;
153 | max-height: 100%;
154 | display: none;
155 | }
156 | .icon-hide,
157 | .input-inset {
158 | position: absolute;
159 | top: 0;
160 | left: calc(50% - 112.5px);
161 | width: 225px;
162 | height: 40px;
163 | }
164 | .icon-hide {
165 | top: 13.33px;
166 | left: calc(50% + 83.93px);
167 | width: 14.29px;
168 | height: 13.33px;
169 | overflow: hidden;
170 | }
171 | .log-in1,
172 | .password-input {
173 | position: absolute;
174 | font-family: var(--font-open-sans);
175 | }
176 | .password-input {
177 | top: 525px;
178 | left: calc(50% + 206px);
179 | width: 225px;
180 | height: 40px;
181 | text-align: left;
182 | font-size: 15px;
183 | color: var(--color-darkgray);
184 | }
185 | .log-in1 {
186 | top: 244px;
187 | left: 939px;
188 | font-size: 28px;
189 | display: inline-block;
190 | color: #a483d6;
191 | width: 200px;
192 | }
193 | .input-inset1 {
194 | border: 0;
195 | background-color: transparent;
196 | position: absolute;
197 | top: 453px;
198 | left: calc(50% + 206px);
199 | }
200 | .social-buttons-icon {
201 | position: absolute;
202 | top: 327px;
203 | left: 923px;
204 | width: 224px;
205 | height: 80px;
206 | }
207 | .logo-no-background-1-icon {
208 | position: absolute;
209 | top: 2752px;
210 | left: 103px;
211 | width: 466px;
212 | height: 441px;
213 | object-fit: cover;
214 | }
215 | .desktop-1 {
216 | position: relative;
217 | background: linear-gradient(180deg, rgba(227, 208, 255, 0.87), #fff 42.71%);
218 | width: 100%;
219 | height: 1024px;
220 | overflow: hidden;
221 | text-align: center;
222 | font-size: var(--font-size-base);
223 | color: var(--bluegrey600);
224 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
225 | }
--------------------------------------------------------------------------------
/frontend/src/components/saveproduct.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable jsx-a11y/alt-text */
2 | import axios from "axios";
3 |
4 | import { useEffect, useState } from "react";
5 | import { Box, Button, TextField, Typography } from "@mui/material";
6 | import { selectUser } from "../slices/userSlice";
7 | import { useSelector } from "react-redux";
8 | // import { get } from "mongoose";
9 | import { useParams } from "react-router-dom";
10 |
11 | const CreateProduct = (props) => {
12 |
13 | const { id } = useParams();
14 |
15 | const user = useSelector(selectUser);
16 |
17 | const [image, setImage] = useState("");
18 | const [name, setName] = useState("");
19 | const [pettype, setPettype] = useState("");
20 | const [petbreed, setPetbreed] = useState("");
21 | const [petage, setPetage] = useState("");
22 | const [description, setDescription] = useState("");
23 | const [location, setLocation] = useState("");
24 |
25 |
26 |
27 | useEffect(() => {
28 | async function getCompany(id) {
29 | await axios.get("http://localhost:3001/api/v1/pets/" + id, {
30 | headers: {
31 | "x-access-token": user.token
32 | },
33 | }).then((response) => {
34 | console.log(response);
35 | setName(response.data.petname);
36 |
37 | setImage(response.data.image);
38 |
39 | setPettype(response.data.pettype);
40 |
41 | setPetbreed(response.data.petbreed);
42 | setDescription(response.data.description);
43 |
44 | setLocation(response.data.location);
45 |
46 | setPetage(response.data.petage);
47 |
48 |
49 |
50 | }).catch((error) => {
51 | console.log(error);
52 | });
53 | }
54 |
55 | if (id) { getCompany(id)}
56 |
57 | }, [])
58 |
59 |
60 | const handleSubmit = async (e) => {
61 | e.preventDefault();
62 | const formData = new FormData();
63 | formData.append("petname", name);
64 | formData.append("image", image);
65 | formData.append("pettype", pettype);
66 | formData.append("petbreed", petbreed);
67 | formData.append("petage", petage);
68 | formData.append("description", description);
69 | formData.append("location", location);
70 |
71 |
72 |
73 |
74 | if (id) {
75 | await axios.put("http://localhost:3001/api/v1/pets/" + id, formData, {
76 | headers: {
77 | "Content-Type": "multipart/form-data",
78 | "x-access-token": user.token
79 | },
80 | }).then((response) => {
81 | console.log(response);
82 | window.location.href = "/dashboard";
83 | }).catch((error) => {
84 | console.log(error);
85 | });
86 | return;
87 | }
88 |
89 |
90 | await axios.post("http://localhost:3001/api/v1/pets", formData, {
91 | headers: {
92 | "Content-Type": "multipart/form-data",
93 | "x-access-token": user.token
94 | },
95 | }).then((response) => {
96 | console.log(response);
97 | window.location.href = "/dashboard";
98 | }).catch((error) => {
99 | console.log(error);
100 | });
101 |
102 |
103 | }
104 |
105 |
106 |
107 | return (
108 |
109 |
113 |
242 |
243 | );
244 | }
245 |
246 | export default CreateProduct;
--------------------------------------------------------------------------------
/frontend/src/components/AdminView.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react';
2 | import { styled } from '@mui/material/styles';
3 | import { Button, Card, CardActions, CardContent, CardMedia, Container, Grid, Typography } from '@mui/material';
4 | import axios from 'axios';
5 | import { selectUser,logout } from '../slices/userSlice';
6 | import { useSelector,useDispatch } from 'react-redux';
7 | import { useState } from 'react';
8 | import Table from '@mui/material/Table';
9 | import TableBody from '@mui/material/TableBody';
10 | import TableCell from '@mui/material/TableCell';
11 | import TableContainer from '@mui/material/TableContainer';
12 | import TableHead from '@mui/material/TableHead';
13 | import TableRow from '@mui/material/TableRow';
14 | import Paper from '@mui/material/Paper';
15 | const cards = [1, 2, 3, 4, 5, 6, 7, 8, 9];
16 |
17 |
18 | const AdminView = () => {
19 | const dispatch = useDispatch();
20 | // const user = useSelector(selectUser);
21 | //
22 | const Logout = (e) => {
23 | dispatch(logout());
24 | window.location.reload()
25 | };
26 | const user = useSelector(selectUser);
27 |
28 | const [products, setProducts] = useState([]);
29 | const [adoptions,setAdoptions] = useState([]);
30 | useEffect(() => {
31 | async function getProducts() {
32 | await axios.get("http://localhost:3001/api/v1/pets/all", {
33 | headers: {
34 | "x-access-token": user.token
35 | },
36 | }).then((response) => {
37 | console.log(response);
38 | setProducts(response.data);
39 | }).catch((error) => {
40 | console.log(error);
41 | });
42 | }
43 | async function getAdoptions(){
44 | await axios.get("http://localhost:3001/api/v1/adoptions/", {
45 | headers: {
46 | "x-access-token": user.token
47 | },
48 | }).then((response) => {
49 | console.log(response);
50 | setAdoptions(response.data);
51 | }).catch((error) => {
52 | console.log(error);
53 | });
54 | }
55 | getAdoptions();
56 | getProducts();
57 | }, [])
58 |
59 | async function deleteProduct(id) {
60 |
61 | //confirm before deleting
62 | if (!window.confirm("Are you sure you want to delete this pet?")) {
63 | return;
64 | }
65 |
66 | await axios.delete("http://localhost:3001/api/v1/pets/" + id, {
67 | headers: {
68 | "x-access-token": user.token
69 | },
70 | }).then((response) => {
71 | console.log(response);
72 | window.location.reload();
73 | }).catch((error) => {
74 | console.log(error);
75 | });
76 | }
77 |
78 | return (
79 |
80 | {/* End hero unit */}
81 | find your furMate
82 |
100 | Add New Pet
101 |
102 |
103 | {products.map((card) => (
104 |
105 |
108 |
116 |
117 |
118 | Name : {card.petname}
119 |
120 |
121 | Type : {card.pettype}
122 |
123 |
124 | Breed : {card.petbreed}
125 |
126 |
127 | Age : {card.petage}
128 |
129 |
130 | Description : {card.description}
131 |
132 |
133 | Location : {card.location}
134 |
135 |
136 |
137 |
138 |
139 | {user.userType === "b2 uyer" ? Order :
140 | <>
141 | { window.location.href = "/addpet/" + card._id }}
143 | >Edit
144 | { deleteProduct(card._id) }}
146 | >Delete
147 | >}
148 |
149 |
150 |
151 |
152 |
153 | ))}
154 |
155 |
156 |
162 | Pet Adoption Requests -------------------------------------------------------------------------------------------------------------------------
163 |
164 |
165 |
166 |
167 |
168 | Requested Date
169 | Requested User
170 | Requestd Pet
171 |
172 |
173 |
174 |
175 | {adoptions.map((row) => (
176 |
180 |
181 | {new Date(row.date).toUTCString()}
182 |
183 | {row.user_name}
184 | {row.pet_name}
185 |
186 | ))}
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 | Logout(e)}
196 | style={{
197 |
198 | textTransform: 'capitalize',
199 | borderRadius: '12px',
200 | width:'60', height:'40',
201 | border: '1px solid #ffffff3e',
202 | background: 'linear-gradient(318deg, rgba(0, 0, 0, 0.40) 0%, rgba(255, 255, 255, 0.40) 105.18%), #A483D6',
203 | backgroundBlendMode: 'soft-light, normal', // Corrected the syntax for background-blend-mode
204 | boxShadow: '5px 5px 10px 0px #A6ABBD, -5px -5px 10px 0px #FAFBFF',
205 | color: '#fff',
206 | transition: 'background 0.8s',
207 | margin: '0px 0px 0px 760px'
208 | }}>
209 | Log out
210 |
211 |
212 | );
213 | }
214 |
215 | export default AdminView;
--------------------------------------------------------------------------------
/frontend/src/components/showallproducts.js:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from 'react';
2 | import { Button, Card, CardActions, CardContent, CardMedia, Container, Grid, TextField, Typography } from '@mui/material';
3 | import axios from 'axios';
4 | import { selectUser,logout } from '../slices/userSlice';
5 | import { useSelector,useDispatch } from 'react-redux';
6 | import { useState } from 'react';
7 |
8 | const GetAll = () => {
9 | const dispatch = useDispatch();
10 | const user = useSelector(selectUser);
11 |
12 | const Logout = (e) => {
13 | dispatch(logout());
14 | window.location.href = "/"
15 | };
16 |
17 |
18 | const [products, setProducts] = useState([]);
19 | const [search,setSearch] = useState("");
20 | const [msg,setMsg] = useState("");
21 |
22 | useEffect(() => {
23 | async function getProducts() {
24 | await axios.get("http://localhost:3001/api/v1/pets/all", {
25 | headers: {
26 | "x-access-token": user.token
27 | },
28 | }).then((response) => {
29 | console.log(response);
30 | setMsg("")
31 | setProducts(response.data);
32 | }).catch((error) => {
33 | console.log(error);
34 | });
35 | }
36 | getProducts();
37 | }, [])
38 |
39 | async function getProducts2() {
40 | await axios.get("http://localhost:3001/api/v1/pets/all", {
41 | headers: {
42 | "x-access-token": user.token
43 | },
44 | }).then((response) => {
45 | setMsg("")
46 | console.log(response);
47 | setProducts(response.data);
48 | }).catch((error) => {
49 | console.log(error);
50 | });
51 | }
52 | async function getProductsSearch() {
53 | const search2 = search;
54 | if(search2 == ""){
55 | getProducts2()
56 | return;
57 | }
58 | const url = "http://localhost:3001/api/v1/pets/search/" + search2
59 | await axios.get(url, {
60 | headers: {
61 | "x-access-token": user.token
62 | },
63 | }).then((response) => {
64 | console.log(response);
65 |
66 |
67 | if(response.data.length ==0){
68 | setMsg("No results")
69 | setProducts([])
70 | return;
71 | }else{
72 | setMsg("")
73 | setProducts(response.data);
74 | }
75 | }).catch((error) => {
76 | console.log(error);
77 | });
78 | }
79 |
80 |
81 | async function requestToAdopt(id) {
82 | await axios.post("http://localhost:3001/api/v1/adoptions", {
83 | pet_id: id,
84 | user_id: user.id,
85 | }, {
86 | headers: {
87 | "x-access-token": user.token
88 | },
89 | }).then((response) => {
90 | console.log(response);
91 | alert("Request to adopt sent successfully");
92 | // window.location.reload();
93 | }).catch((error) => {
94 | console.log(error);
95 | });
96 | }
97 |
98 | return (
99 |
100 |
101 | {/* End hero unit */}
102 | find your furMate
103 |
117 | {
118 |
119 | setSearch(e.target.value)
120 | }}
121 |
122 | >
123 | {
135 | getProductsSearch()
136 | }}
137 | >search
138 |
139 |
140 | {msg}
141 |
142 |
143 | {products.map((card) => (
144 |
145 |
148 |
156 |
157 |
158 | Name : {card.petname}
159 |
160 |
161 | Type : {card.pettype}
162 |
163 |
164 | Breed : {card.petbreed}
165 |
166 |
167 | Age : {card.petage}
168 |
169 |
170 | Description : {card.description}
171 |
172 |
173 | Location : {card.location}
174 |
175 |
176 |
177 |
178 |
179 | requestToAdopt(card._id)}>
196 | Request to Adopt
197 |
198 |
199 |
200 |
201 |
202 | ))}
203 |
204 | Logout(e)}
205 | style={{
206 | marginTop:"30px",
207 |
208 | textTransform: 'capitalize',
209 | borderRadius: '14px', // Corrected the syntax for border-radius
210 | border: '1px solid #ffffff3e',
211 | background: 'linear-gradient(318deg, rgba(0, 0, 0, 0.40) 0%, rgba(255, 255, 255, 0.40) 105.18%), #A483D6',
212 | backgroundBlendMode: 'soft-light, normal', // Corrected the syntax for background-blend-mode
213 | boxShadow: '5px 5px 10px 0px #A6ABBD, -5px -5px 10px 0px #FAFBFF',
214 | color: '#fff',
215 | transition: 'background 0.8s',
216 | margin: '0px 0px 0px 760px'
217 | }}>
218 | Log out
219 |
220 |
221 |
222 | );
223 | }
224 |
225 | export default GetAll;
--------------------------------------------------------------------------------
/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcrypt": "^5.1.1",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.3.1",
15 | "express": "^4.18.2",
16 | "express-fileupload": "^1.4.1",
17 | "http-errors": "^2.0.0",
18 | "jsonwebtoken": "^9.0.2",
19 | "mongoose": "^7.6.1"
20 | },
21 | "devDependencies": {
22 | "nodemon": "^3.0.1"
23 | }
24 | },
25 | "node_modules/@mapbox/node-pre-gyp": {
26 | "version": "1.0.11",
27 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
28 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
29 | "dependencies": {
30 | "detect-libc": "^2.0.0",
31 | "https-proxy-agent": "^5.0.0",
32 | "make-dir": "^3.1.0",
33 | "node-fetch": "^2.6.7",
34 | "nopt": "^5.0.0",
35 | "npmlog": "^5.0.1",
36 | "rimraf": "^3.0.2",
37 | "semver": "^7.3.5",
38 | "tar": "^6.1.11"
39 | },
40 | "bin": {
41 | "node-pre-gyp": "bin/node-pre-gyp"
42 | }
43 | },
44 | "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": {
45 | "version": "5.0.0",
46 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
47 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
48 | "dependencies": {
49 | "abbrev": "1"
50 | },
51 | "bin": {
52 | "nopt": "bin/nopt.js"
53 | },
54 | "engines": {
55 | "node": ">=6"
56 | }
57 | },
58 | "node_modules/@mongodb-js/saslprep": {
59 | "version": "1.1.0",
60 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
61 | "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
62 | "optional": true,
63 | "dependencies": {
64 | "sparse-bitfield": "^3.0.3"
65 | }
66 | },
67 | "node_modules/@types/node": {
68 | "version": "20.8.5",
69 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.5.tgz",
70 | "integrity": "sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==",
71 | "dependencies": {
72 | "undici-types": "~5.25.1"
73 | }
74 | },
75 | "node_modules/@types/webidl-conversions": {
76 | "version": "7.0.1",
77 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz",
78 | "integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg=="
79 | },
80 | "node_modules/@types/whatwg-url": {
81 | "version": "8.2.2",
82 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
83 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
84 | "dependencies": {
85 | "@types/node": "*",
86 | "@types/webidl-conversions": "*"
87 | }
88 | },
89 | "node_modules/abbrev": {
90 | "version": "1.1.1",
91 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
92 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
93 | },
94 | "node_modules/accepts": {
95 | "version": "1.3.8",
96 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
97 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
98 | "dependencies": {
99 | "mime-types": "~2.1.34",
100 | "negotiator": "0.6.3"
101 | },
102 | "engines": {
103 | "node": ">= 0.6"
104 | }
105 | },
106 | "node_modules/agent-base": {
107 | "version": "6.0.2",
108 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
109 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
110 | "dependencies": {
111 | "debug": "4"
112 | },
113 | "engines": {
114 | "node": ">= 6.0.0"
115 | }
116 | },
117 | "node_modules/agent-base/node_modules/debug": {
118 | "version": "4.3.4",
119 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
120 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
121 | "dependencies": {
122 | "ms": "2.1.2"
123 | },
124 | "engines": {
125 | "node": ">=6.0"
126 | },
127 | "peerDependenciesMeta": {
128 | "supports-color": {
129 | "optional": true
130 | }
131 | }
132 | },
133 | "node_modules/agent-base/node_modules/ms": {
134 | "version": "2.1.2",
135 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
136 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
137 | },
138 | "node_modules/ansi-regex": {
139 | "version": "5.0.1",
140 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
141 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
142 | "engines": {
143 | "node": ">=8"
144 | }
145 | },
146 | "node_modules/anymatch": {
147 | "version": "3.1.3",
148 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
149 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
150 | "dev": true,
151 | "dependencies": {
152 | "normalize-path": "^3.0.0",
153 | "picomatch": "^2.0.4"
154 | },
155 | "engines": {
156 | "node": ">= 8"
157 | }
158 | },
159 | "node_modules/aproba": {
160 | "version": "2.0.0",
161 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
162 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
163 | },
164 | "node_modules/are-we-there-yet": {
165 | "version": "2.0.0",
166 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
167 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
168 | "dependencies": {
169 | "delegates": "^1.0.0",
170 | "readable-stream": "^3.6.0"
171 | },
172 | "engines": {
173 | "node": ">=10"
174 | }
175 | },
176 | "node_modules/array-flatten": {
177 | "version": "1.1.1",
178 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
179 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
180 | },
181 | "node_modules/balanced-match": {
182 | "version": "1.0.2",
183 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
184 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
185 | },
186 | "node_modules/bcrypt": {
187 | "version": "5.1.1",
188 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
189 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
190 | "hasInstallScript": true,
191 | "dependencies": {
192 | "@mapbox/node-pre-gyp": "^1.0.11",
193 | "node-addon-api": "^5.0.0"
194 | },
195 | "engines": {
196 | "node": ">= 10.0.0"
197 | }
198 | },
199 | "node_modules/binary-extensions": {
200 | "version": "2.2.0",
201 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
202 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
203 | "dev": true,
204 | "engines": {
205 | "node": ">=8"
206 | }
207 | },
208 | "node_modules/body-parser": {
209 | "version": "1.20.1",
210 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
211 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
212 | "dependencies": {
213 | "bytes": "3.1.2",
214 | "content-type": "~1.0.4",
215 | "debug": "2.6.9",
216 | "depd": "2.0.0",
217 | "destroy": "1.2.0",
218 | "http-errors": "2.0.0",
219 | "iconv-lite": "0.4.24",
220 | "on-finished": "2.4.1",
221 | "qs": "6.11.0",
222 | "raw-body": "2.5.1",
223 | "type-is": "~1.6.18",
224 | "unpipe": "1.0.0"
225 | },
226 | "engines": {
227 | "node": ">= 0.8",
228 | "npm": "1.2.8000 || >= 1.4.16"
229 | }
230 | },
231 | "node_modules/brace-expansion": {
232 | "version": "1.1.11",
233 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
234 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
235 | "dependencies": {
236 | "balanced-match": "^1.0.0",
237 | "concat-map": "0.0.1"
238 | }
239 | },
240 | "node_modules/braces": {
241 | "version": "3.0.2",
242 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
243 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
244 | "dev": true,
245 | "dependencies": {
246 | "fill-range": "^7.0.1"
247 | },
248 | "engines": {
249 | "node": ">=8"
250 | }
251 | },
252 | "node_modules/bson": {
253 | "version": "5.5.0",
254 | "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.0.tgz",
255 | "integrity": "sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==",
256 | "engines": {
257 | "node": ">=14.20.1"
258 | }
259 | },
260 | "node_modules/buffer-equal-constant-time": {
261 | "version": "1.0.1",
262 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
263 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
264 | },
265 | "node_modules/busboy": {
266 | "version": "1.6.0",
267 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
268 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
269 | "dependencies": {
270 | "streamsearch": "^1.1.0"
271 | },
272 | "engines": {
273 | "node": ">=10.16.0"
274 | }
275 | },
276 | "node_modules/bytes": {
277 | "version": "3.1.2",
278 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
279 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
280 | "engines": {
281 | "node": ">= 0.8"
282 | }
283 | },
284 | "node_modules/call-bind": {
285 | "version": "1.0.2",
286 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
287 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
288 | "dependencies": {
289 | "function-bind": "^1.1.1",
290 | "get-intrinsic": "^1.0.2"
291 | },
292 | "funding": {
293 | "url": "https://github.com/sponsors/ljharb"
294 | }
295 | },
296 | "node_modules/chokidar": {
297 | "version": "3.5.3",
298 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
299 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
300 | "dev": true,
301 | "funding": [
302 | {
303 | "type": "individual",
304 | "url": "https://paulmillr.com/funding/"
305 | }
306 | ],
307 | "dependencies": {
308 | "anymatch": "~3.1.2",
309 | "braces": "~3.0.2",
310 | "glob-parent": "~5.1.2",
311 | "is-binary-path": "~2.1.0",
312 | "is-glob": "~4.0.1",
313 | "normalize-path": "~3.0.0",
314 | "readdirp": "~3.6.0"
315 | },
316 | "engines": {
317 | "node": ">= 8.10.0"
318 | },
319 | "optionalDependencies": {
320 | "fsevents": "~2.3.2"
321 | }
322 | },
323 | "node_modules/chownr": {
324 | "version": "2.0.0",
325 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
326 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
327 | "engines": {
328 | "node": ">=10"
329 | }
330 | },
331 | "node_modules/color-support": {
332 | "version": "1.1.3",
333 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
334 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
335 | "bin": {
336 | "color-support": "bin.js"
337 | }
338 | },
339 | "node_modules/concat-map": {
340 | "version": "0.0.1",
341 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
342 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
343 | },
344 | "node_modules/console-control-strings": {
345 | "version": "1.1.0",
346 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
347 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
348 | },
349 | "node_modules/content-disposition": {
350 | "version": "0.5.4",
351 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
352 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
353 | "dependencies": {
354 | "safe-buffer": "5.2.1"
355 | },
356 | "engines": {
357 | "node": ">= 0.6"
358 | }
359 | },
360 | "node_modules/content-type": {
361 | "version": "1.0.5",
362 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
363 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
364 | "engines": {
365 | "node": ">= 0.6"
366 | }
367 | },
368 | "node_modules/cookie": {
369 | "version": "0.5.0",
370 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
371 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
372 | "engines": {
373 | "node": ">= 0.6"
374 | }
375 | },
376 | "node_modules/cookie-signature": {
377 | "version": "1.0.6",
378 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
379 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
380 | },
381 | "node_modules/cors": {
382 | "version": "2.8.5",
383 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
384 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
385 | "dependencies": {
386 | "object-assign": "^4",
387 | "vary": "^1"
388 | },
389 | "engines": {
390 | "node": ">= 0.10"
391 | }
392 | },
393 | "node_modules/debug": {
394 | "version": "2.6.9",
395 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
396 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
397 | "dependencies": {
398 | "ms": "2.0.0"
399 | }
400 | },
401 | "node_modules/delegates": {
402 | "version": "1.0.0",
403 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
404 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
405 | },
406 | "node_modules/depd": {
407 | "version": "2.0.0",
408 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
409 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
410 | "engines": {
411 | "node": ">= 0.8"
412 | }
413 | },
414 | "node_modules/destroy": {
415 | "version": "1.2.0",
416 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
417 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
418 | "engines": {
419 | "node": ">= 0.8",
420 | "npm": "1.2.8000 || >= 1.4.16"
421 | }
422 | },
423 | "node_modules/detect-libc": {
424 | "version": "2.0.2",
425 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
426 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
427 | "engines": {
428 | "node": ">=8"
429 | }
430 | },
431 | "node_modules/dotenv": {
432 | "version": "16.3.1",
433 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
434 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
435 | "engines": {
436 | "node": ">=12"
437 | },
438 | "funding": {
439 | "url": "https://github.com/motdotla/dotenv?sponsor=1"
440 | }
441 | },
442 | "node_modules/ecdsa-sig-formatter": {
443 | "version": "1.0.11",
444 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
445 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
446 | "dependencies": {
447 | "safe-buffer": "^5.0.1"
448 | }
449 | },
450 | "node_modules/ee-first": {
451 | "version": "1.1.1",
452 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
453 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
454 | },
455 | "node_modules/emoji-regex": {
456 | "version": "8.0.0",
457 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
458 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
459 | },
460 | "node_modules/encodeurl": {
461 | "version": "1.0.2",
462 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
463 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
464 | "engines": {
465 | "node": ">= 0.8"
466 | }
467 | },
468 | "node_modules/escape-html": {
469 | "version": "1.0.3",
470 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
471 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
472 | },
473 | "node_modules/etag": {
474 | "version": "1.8.1",
475 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
476 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
477 | "engines": {
478 | "node": ">= 0.6"
479 | }
480 | },
481 | "node_modules/express": {
482 | "version": "4.18.2",
483 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
484 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
485 | "dependencies": {
486 | "accepts": "~1.3.8",
487 | "array-flatten": "1.1.1",
488 | "body-parser": "1.20.1",
489 | "content-disposition": "0.5.4",
490 | "content-type": "~1.0.4",
491 | "cookie": "0.5.0",
492 | "cookie-signature": "1.0.6",
493 | "debug": "2.6.9",
494 | "depd": "2.0.0",
495 | "encodeurl": "~1.0.2",
496 | "escape-html": "~1.0.3",
497 | "etag": "~1.8.1",
498 | "finalhandler": "1.2.0",
499 | "fresh": "0.5.2",
500 | "http-errors": "2.0.0",
501 | "merge-descriptors": "1.0.1",
502 | "methods": "~1.1.2",
503 | "on-finished": "2.4.1",
504 | "parseurl": "~1.3.3",
505 | "path-to-regexp": "0.1.7",
506 | "proxy-addr": "~2.0.7",
507 | "qs": "6.11.0",
508 | "range-parser": "~1.2.1",
509 | "safe-buffer": "5.2.1",
510 | "send": "0.18.0",
511 | "serve-static": "1.15.0",
512 | "setprototypeof": "1.2.0",
513 | "statuses": "2.0.1",
514 | "type-is": "~1.6.18",
515 | "utils-merge": "1.0.1",
516 | "vary": "~1.1.2"
517 | },
518 | "engines": {
519 | "node": ">= 0.10.0"
520 | }
521 | },
522 | "node_modules/express-fileupload": {
523 | "version": "1.4.1",
524 | "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.1.tgz",
525 | "integrity": "sha512-9F6SkbxbEOA9cYOBZ8tnn238jL+bGfacQuUO/JqPWp5t+piUcoDcESvKwAXsQV7IHGxmI5bMj3QxMWOKOIsMCg==",
526 | "dependencies": {
527 | "busboy": "^1.6.0"
528 | },
529 | "engines": {
530 | "node": ">=12.0.0"
531 | }
532 | },
533 | "node_modules/fill-range": {
534 | "version": "7.0.1",
535 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
536 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
537 | "dev": true,
538 | "dependencies": {
539 | "to-regex-range": "^5.0.1"
540 | },
541 | "engines": {
542 | "node": ">=8"
543 | }
544 | },
545 | "node_modules/finalhandler": {
546 | "version": "1.2.0",
547 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
548 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
549 | "dependencies": {
550 | "debug": "2.6.9",
551 | "encodeurl": "~1.0.2",
552 | "escape-html": "~1.0.3",
553 | "on-finished": "2.4.1",
554 | "parseurl": "~1.3.3",
555 | "statuses": "2.0.1",
556 | "unpipe": "~1.0.0"
557 | },
558 | "engines": {
559 | "node": ">= 0.8"
560 | }
561 | },
562 | "node_modules/forwarded": {
563 | "version": "0.2.0",
564 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
565 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
566 | "engines": {
567 | "node": ">= 0.6"
568 | }
569 | },
570 | "node_modules/fresh": {
571 | "version": "0.5.2",
572 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
573 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
574 | "engines": {
575 | "node": ">= 0.6"
576 | }
577 | },
578 | "node_modules/fs-minipass": {
579 | "version": "2.1.0",
580 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
581 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
582 | "dependencies": {
583 | "minipass": "^3.0.0"
584 | },
585 | "engines": {
586 | "node": ">= 8"
587 | }
588 | },
589 | "node_modules/fs-minipass/node_modules/minipass": {
590 | "version": "3.3.6",
591 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
592 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
593 | "dependencies": {
594 | "yallist": "^4.0.0"
595 | },
596 | "engines": {
597 | "node": ">=8"
598 | }
599 | },
600 | "node_modules/fs.realpath": {
601 | "version": "1.0.0",
602 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
603 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
604 | },
605 | "node_modules/fsevents": {
606 | "version": "2.3.3",
607 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
608 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
609 | "dev": true,
610 | "hasInstallScript": true,
611 | "optional": true,
612 | "os": [
613 | "darwin"
614 | ],
615 | "engines": {
616 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
617 | }
618 | },
619 | "node_modules/function-bind": {
620 | "version": "1.1.2",
621 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
622 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
623 | "funding": {
624 | "url": "https://github.com/sponsors/ljharb"
625 | }
626 | },
627 | "node_modules/gauge": {
628 | "version": "3.0.2",
629 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
630 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
631 | "dependencies": {
632 | "aproba": "^1.0.3 || ^2.0.0",
633 | "color-support": "^1.1.2",
634 | "console-control-strings": "^1.0.0",
635 | "has-unicode": "^2.0.1",
636 | "object-assign": "^4.1.1",
637 | "signal-exit": "^3.0.0",
638 | "string-width": "^4.2.3",
639 | "strip-ansi": "^6.0.1",
640 | "wide-align": "^1.1.2"
641 | },
642 | "engines": {
643 | "node": ">=10"
644 | }
645 | },
646 | "node_modules/get-intrinsic": {
647 | "version": "1.2.1",
648 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
649 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
650 | "dependencies": {
651 | "function-bind": "^1.1.1",
652 | "has": "^1.0.3",
653 | "has-proto": "^1.0.1",
654 | "has-symbols": "^1.0.3"
655 | },
656 | "funding": {
657 | "url": "https://github.com/sponsors/ljharb"
658 | }
659 | },
660 | "node_modules/glob": {
661 | "version": "7.2.3",
662 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
663 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
664 | "dependencies": {
665 | "fs.realpath": "^1.0.0",
666 | "inflight": "^1.0.4",
667 | "inherits": "2",
668 | "minimatch": "^3.1.1",
669 | "once": "^1.3.0",
670 | "path-is-absolute": "^1.0.0"
671 | },
672 | "engines": {
673 | "node": "*"
674 | },
675 | "funding": {
676 | "url": "https://github.com/sponsors/isaacs"
677 | }
678 | },
679 | "node_modules/glob-parent": {
680 | "version": "5.1.2",
681 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
682 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
683 | "dev": true,
684 | "dependencies": {
685 | "is-glob": "^4.0.1"
686 | },
687 | "engines": {
688 | "node": ">= 6"
689 | }
690 | },
691 | "node_modules/has": {
692 | "version": "1.0.4",
693 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
694 | "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
695 | "engines": {
696 | "node": ">= 0.4.0"
697 | }
698 | },
699 | "node_modules/has-flag": {
700 | "version": "3.0.0",
701 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
702 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
703 | "dev": true,
704 | "engines": {
705 | "node": ">=4"
706 | }
707 | },
708 | "node_modules/has-proto": {
709 | "version": "1.0.1",
710 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
711 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
712 | "engines": {
713 | "node": ">= 0.4"
714 | },
715 | "funding": {
716 | "url": "https://github.com/sponsors/ljharb"
717 | }
718 | },
719 | "node_modules/has-symbols": {
720 | "version": "1.0.3",
721 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
722 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
723 | "engines": {
724 | "node": ">= 0.4"
725 | },
726 | "funding": {
727 | "url": "https://github.com/sponsors/ljharb"
728 | }
729 | },
730 | "node_modules/has-unicode": {
731 | "version": "2.0.1",
732 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
733 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
734 | },
735 | "node_modules/http-errors": {
736 | "version": "2.0.0",
737 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
738 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
739 | "dependencies": {
740 | "depd": "2.0.0",
741 | "inherits": "2.0.4",
742 | "setprototypeof": "1.2.0",
743 | "statuses": "2.0.1",
744 | "toidentifier": "1.0.1"
745 | },
746 | "engines": {
747 | "node": ">= 0.8"
748 | }
749 | },
750 | "node_modules/https-proxy-agent": {
751 | "version": "5.0.1",
752 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
753 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
754 | "dependencies": {
755 | "agent-base": "6",
756 | "debug": "4"
757 | },
758 | "engines": {
759 | "node": ">= 6"
760 | }
761 | },
762 | "node_modules/https-proxy-agent/node_modules/debug": {
763 | "version": "4.3.4",
764 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
765 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
766 | "dependencies": {
767 | "ms": "2.1.2"
768 | },
769 | "engines": {
770 | "node": ">=6.0"
771 | },
772 | "peerDependenciesMeta": {
773 | "supports-color": {
774 | "optional": true
775 | }
776 | }
777 | },
778 | "node_modules/https-proxy-agent/node_modules/ms": {
779 | "version": "2.1.2",
780 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
781 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
782 | },
783 | "node_modules/iconv-lite": {
784 | "version": "0.4.24",
785 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
786 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
787 | "dependencies": {
788 | "safer-buffer": ">= 2.1.2 < 3"
789 | },
790 | "engines": {
791 | "node": ">=0.10.0"
792 | }
793 | },
794 | "node_modules/ignore-by-default": {
795 | "version": "1.0.1",
796 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
797 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
798 | "dev": true
799 | },
800 | "node_modules/inflight": {
801 | "version": "1.0.6",
802 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
803 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
804 | "dependencies": {
805 | "once": "^1.3.0",
806 | "wrappy": "1"
807 | }
808 | },
809 | "node_modules/inherits": {
810 | "version": "2.0.4",
811 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
812 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
813 | },
814 | "node_modules/ip": {
815 | "version": "2.0.0",
816 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
817 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
818 | },
819 | "node_modules/ipaddr.js": {
820 | "version": "1.9.1",
821 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
822 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
823 | "engines": {
824 | "node": ">= 0.10"
825 | }
826 | },
827 | "node_modules/is-binary-path": {
828 | "version": "2.1.0",
829 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
830 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
831 | "dev": true,
832 | "dependencies": {
833 | "binary-extensions": "^2.0.0"
834 | },
835 | "engines": {
836 | "node": ">=8"
837 | }
838 | },
839 | "node_modules/is-extglob": {
840 | "version": "2.1.1",
841 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
842 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
843 | "dev": true,
844 | "engines": {
845 | "node": ">=0.10.0"
846 | }
847 | },
848 | "node_modules/is-fullwidth-code-point": {
849 | "version": "3.0.0",
850 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
851 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
852 | "engines": {
853 | "node": ">=8"
854 | }
855 | },
856 | "node_modules/is-glob": {
857 | "version": "4.0.3",
858 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
859 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
860 | "dev": true,
861 | "dependencies": {
862 | "is-extglob": "^2.1.1"
863 | },
864 | "engines": {
865 | "node": ">=0.10.0"
866 | }
867 | },
868 | "node_modules/is-number": {
869 | "version": "7.0.0",
870 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
871 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
872 | "dev": true,
873 | "engines": {
874 | "node": ">=0.12.0"
875 | }
876 | },
877 | "node_modules/jsonwebtoken": {
878 | "version": "9.0.2",
879 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
880 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
881 | "dependencies": {
882 | "jws": "^3.2.2",
883 | "lodash.includes": "^4.3.0",
884 | "lodash.isboolean": "^3.0.3",
885 | "lodash.isinteger": "^4.0.4",
886 | "lodash.isnumber": "^3.0.3",
887 | "lodash.isplainobject": "^4.0.6",
888 | "lodash.isstring": "^4.0.1",
889 | "lodash.once": "^4.0.0",
890 | "ms": "^2.1.1",
891 | "semver": "^7.5.4"
892 | },
893 | "engines": {
894 | "node": ">=12",
895 | "npm": ">=6"
896 | }
897 | },
898 | "node_modules/jsonwebtoken/node_modules/ms": {
899 | "version": "2.1.3",
900 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
901 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
902 | },
903 | "node_modules/jwa": {
904 | "version": "1.4.1",
905 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
906 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
907 | "dependencies": {
908 | "buffer-equal-constant-time": "1.0.1",
909 | "ecdsa-sig-formatter": "1.0.11",
910 | "safe-buffer": "^5.0.1"
911 | }
912 | },
913 | "node_modules/jws": {
914 | "version": "3.2.2",
915 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
916 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
917 | "dependencies": {
918 | "jwa": "^1.4.1",
919 | "safe-buffer": "^5.0.1"
920 | }
921 | },
922 | "node_modules/kareem": {
923 | "version": "2.5.1",
924 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
925 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
926 | "engines": {
927 | "node": ">=12.0.0"
928 | }
929 | },
930 | "node_modules/lodash.includes": {
931 | "version": "4.3.0",
932 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
933 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
934 | },
935 | "node_modules/lodash.isboolean": {
936 | "version": "3.0.3",
937 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
938 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
939 | },
940 | "node_modules/lodash.isinteger": {
941 | "version": "4.0.4",
942 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
943 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
944 | },
945 | "node_modules/lodash.isnumber": {
946 | "version": "3.0.3",
947 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
948 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
949 | },
950 | "node_modules/lodash.isplainobject": {
951 | "version": "4.0.6",
952 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
953 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
954 | },
955 | "node_modules/lodash.isstring": {
956 | "version": "4.0.1",
957 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
958 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
959 | },
960 | "node_modules/lodash.once": {
961 | "version": "4.1.1",
962 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
963 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
964 | },
965 | "node_modules/lru-cache": {
966 | "version": "6.0.0",
967 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
968 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
969 | "dependencies": {
970 | "yallist": "^4.0.0"
971 | },
972 | "engines": {
973 | "node": ">=10"
974 | }
975 | },
976 | "node_modules/make-dir": {
977 | "version": "3.1.0",
978 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
979 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
980 | "dependencies": {
981 | "semver": "^6.0.0"
982 | },
983 | "engines": {
984 | "node": ">=8"
985 | },
986 | "funding": {
987 | "url": "https://github.com/sponsors/sindresorhus"
988 | }
989 | },
990 | "node_modules/make-dir/node_modules/semver": {
991 | "version": "6.3.1",
992 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
993 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
994 | "bin": {
995 | "semver": "bin/semver.js"
996 | }
997 | },
998 | "node_modules/media-typer": {
999 | "version": "0.3.0",
1000 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1001 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1002 | "engines": {
1003 | "node": ">= 0.6"
1004 | }
1005 | },
1006 | "node_modules/memory-pager": {
1007 | "version": "1.5.0",
1008 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1009 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1010 | "optional": true
1011 | },
1012 | "node_modules/merge-descriptors": {
1013 | "version": "1.0.1",
1014 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1015 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1016 | },
1017 | "node_modules/methods": {
1018 | "version": "1.1.2",
1019 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1020 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1021 | "engines": {
1022 | "node": ">= 0.6"
1023 | }
1024 | },
1025 | "node_modules/mime": {
1026 | "version": "1.6.0",
1027 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1028 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1029 | "bin": {
1030 | "mime": "cli.js"
1031 | },
1032 | "engines": {
1033 | "node": ">=4"
1034 | }
1035 | },
1036 | "node_modules/mime-db": {
1037 | "version": "1.52.0",
1038 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1039 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1040 | "engines": {
1041 | "node": ">= 0.6"
1042 | }
1043 | },
1044 | "node_modules/mime-types": {
1045 | "version": "2.1.35",
1046 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1047 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1048 | "dependencies": {
1049 | "mime-db": "1.52.0"
1050 | },
1051 | "engines": {
1052 | "node": ">= 0.6"
1053 | }
1054 | },
1055 | "node_modules/minimatch": {
1056 | "version": "3.1.2",
1057 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1058 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1059 | "dependencies": {
1060 | "brace-expansion": "^1.1.7"
1061 | },
1062 | "engines": {
1063 | "node": "*"
1064 | }
1065 | },
1066 | "node_modules/minipass": {
1067 | "version": "5.0.0",
1068 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
1069 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
1070 | "engines": {
1071 | "node": ">=8"
1072 | }
1073 | },
1074 | "node_modules/minizlib": {
1075 | "version": "2.1.2",
1076 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
1077 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
1078 | "dependencies": {
1079 | "minipass": "^3.0.0",
1080 | "yallist": "^4.0.0"
1081 | },
1082 | "engines": {
1083 | "node": ">= 8"
1084 | }
1085 | },
1086 | "node_modules/minizlib/node_modules/minipass": {
1087 | "version": "3.3.6",
1088 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
1089 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
1090 | "dependencies": {
1091 | "yallist": "^4.0.0"
1092 | },
1093 | "engines": {
1094 | "node": ">=8"
1095 | }
1096 | },
1097 | "node_modules/mkdirp": {
1098 | "version": "1.0.4",
1099 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1100 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
1101 | "bin": {
1102 | "mkdirp": "bin/cmd.js"
1103 | },
1104 | "engines": {
1105 | "node": ">=10"
1106 | }
1107 | },
1108 | "node_modules/mongodb": {
1109 | "version": "5.9.0",
1110 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.0.tgz",
1111 | "integrity": "sha512-g+GCMHN1CoRUA+wb1Agv0TI4YTSiWr42B5ulkiAfLLHitGK1R+PkSAf3Lr5rPZwi/3F04LiaZEW0Kxro9Fi2TA==",
1112 | "dependencies": {
1113 | "bson": "^5.5.0",
1114 | "mongodb-connection-string-url": "^2.6.0",
1115 | "socks": "^2.7.1"
1116 | },
1117 | "engines": {
1118 | "node": ">=14.20.1"
1119 | },
1120 | "optionalDependencies": {
1121 | "@mongodb-js/saslprep": "^1.1.0"
1122 | },
1123 | "peerDependencies": {
1124 | "@aws-sdk/credential-providers": "^3.188.0",
1125 | "@mongodb-js/zstd": "^1.0.0",
1126 | "kerberos": "^1.0.0 || ^2.0.0",
1127 | "mongodb-client-encryption": ">=2.3.0 <3",
1128 | "snappy": "^7.2.2"
1129 | },
1130 | "peerDependenciesMeta": {
1131 | "@aws-sdk/credential-providers": {
1132 | "optional": true
1133 | },
1134 | "@mongodb-js/zstd": {
1135 | "optional": true
1136 | },
1137 | "kerberos": {
1138 | "optional": true
1139 | },
1140 | "mongodb-client-encryption": {
1141 | "optional": true
1142 | },
1143 | "snappy": {
1144 | "optional": true
1145 | }
1146 | }
1147 | },
1148 | "node_modules/mongodb-connection-string-url": {
1149 | "version": "2.6.0",
1150 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
1151 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
1152 | "dependencies": {
1153 | "@types/whatwg-url": "^8.2.1",
1154 | "whatwg-url": "^11.0.0"
1155 | }
1156 | },
1157 | "node_modules/mongoose": {
1158 | "version": "7.6.1",
1159 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.6.1.tgz",
1160 | "integrity": "sha512-Iflr60FL7mabBdgAtumLTwEGdZGV6IKHfF7F75En2JWpPitorwQeCFqWPcPHRnBxncKANl3gwI9nh2Yb4y3/sA==",
1161 | "dependencies": {
1162 | "bson": "^5.5.0",
1163 | "kareem": "2.5.1",
1164 | "mongodb": "5.9.0",
1165 | "mpath": "0.9.0",
1166 | "mquery": "5.0.0",
1167 | "ms": "2.1.3",
1168 | "sift": "16.0.1"
1169 | },
1170 | "engines": {
1171 | "node": ">=14.20.1"
1172 | },
1173 | "funding": {
1174 | "type": "opencollective",
1175 | "url": "https://opencollective.com/mongoose"
1176 | }
1177 | },
1178 | "node_modules/mongoose/node_modules/ms": {
1179 | "version": "2.1.3",
1180 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1181 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1182 | },
1183 | "node_modules/mpath": {
1184 | "version": "0.9.0",
1185 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1186 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
1187 | "engines": {
1188 | "node": ">=4.0.0"
1189 | }
1190 | },
1191 | "node_modules/mquery": {
1192 | "version": "5.0.0",
1193 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
1194 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
1195 | "dependencies": {
1196 | "debug": "4.x"
1197 | },
1198 | "engines": {
1199 | "node": ">=14.0.0"
1200 | }
1201 | },
1202 | "node_modules/mquery/node_modules/debug": {
1203 | "version": "4.3.4",
1204 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1205 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1206 | "dependencies": {
1207 | "ms": "2.1.2"
1208 | },
1209 | "engines": {
1210 | "node": ">=6.0"
1211 | },
1212 | "peerDependenciesMeta": {
1213 | "supports-color": {
1214 | "optional": true
1215 | }
1216 | }
1217 | },
1218 | "node_modules/mquery/node_modules/ms": {
1219 | "version": "2.1.2",
1220 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1221 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1222 | },
1223 | "node_modules/ms": {
1224 | "version": "2.0.0",
1225 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1226 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1227 | },
1228 | "node_modules/negotiator": {
1229 | "version": "0.6.3",
1230 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1231 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1232 | "engines": {
1233 | "node": ">= 0.6"
1234 | }
1235 | },
1236 | "node_modules/node-addon-api": {
1237 | "version": "5.1.0",
1238 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
1239 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
1240 | },
1241 | "node_modules/node-fetch": {
1242 | "version": "2.7.0",
1243 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1244 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1245 | "dependencies": {
1246 | "whatwg-url": "^5.0.0"
1247 | },
1248 | "engines": {
1249 | "node": "4.x || >=6.0.0"
1250 | },
1251 | "peerDependencies": {
1252 | "encoding": "^0.1.0"
1253 | },
1254 | "peerDependenciesMeta": {
1255 | "encoding": {
1256 | "optional": true
1257 | }
1258 | }
1259 | },
1260 | "node_modules/node-fetch/node_modules/tr46": {
1261 | "version": "0.0.3",
1262 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1263 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
1264 | },
1265 | "node_modules/node-fetch/node_modules/webidl-conversions": {
1266 | "version": "3.0.1",
1267 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1268 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
1269 | },
1270 | "node_modules/node-fetch/node_modules/whatwg-url": {
1271 | "version": "5.0.0",
1272 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1273 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1274 | "dependencies": {
1275 | "tr46": "~0.0.3",
1276 | "webidl-conversions": "^3.0.0"
1277 | }
1278 | },
1279 | "node_modules/nodemon": {
1280 | "version": "3.0.1",
1281 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
1282 | "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
1283 | "dev": true,
1284 | "dependencies": {
1285 | "chokidar": "^3.5.2",
1286 | "debug": "^3.2.7",
1287 | "ignore-by-default": "^1.0.1",
1288 | "minimatch": "^3.1.2",
1289 | "pstree.remy": "^1.1.8",
1290 | "semver": "^7.5.3",
1291 | "simple-update-notifier": "^2.0.0",
1292 | "supports-color": "^5.5.0",
1293 | "touch": "^3.1.0",
1294 | "undefsafe": "^2.0.5"
1295 | },
1296 | "bin": {
1297 | "nodemon": "bin/nodemon.js"
1298 | },
1299 | "engines": {
1300 | "node": ">=10"
1301 | },
1302 | "funding": {
1303 | "type": "opencollective",
1304 | "url": "https://opencollective.com/nodemon"
1305 | }
1306 | },
1307 | "node_modules/nodemon/node_modules/debug": {
1308 | "version": "3.2.7",
1309 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1310 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1311 | "dev": true,
1312 | "dependencies": {
1313 | "ms": "^2.1.1"
1314 | }
1315 | },
1316 | "node_modules/nodemon/node_modules/ms": {
1317 | "version": "2.1.3",
1318 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1319 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1320 | "dev": true
1321 | },
1322 | "node_modules/nopt": {
1323 | "version": "1.0.10",
1324 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1325 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1326 | "dev": true,
1327 | "dependencies": {
1328 | "abbrev": "1"
1329 | },
1330 | "bin": {
1331 | "nopt": "bin/nopt.js"
1332 | },
1333 | "engines": {
1334 | "node": "*"
1335 | }
1336 | },
1337 | "node_modules/normalize-path": {
1338 | "version": "3.0.0",
1339 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1340 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1341 | "dev": true,
1342 | "engines": {
1343 | "node": ">=0.10.0"
1344 | }
1345 | },
1346 | "node_modules/npmlog": {
1347 | "version": "5.0.1",
1348 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
1349 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
1350 | "dependencies": {
1351 | "are-we-there-yet": "^2.0.0",
1352 | "console-control-strings": "^1.1.0",
1353 | "gauge": "^3.0.0",
1354 | "set-blocking": "^2.0.0"
1355 | }
1356 | },
1357 | "node_modules/object-assign": {
1358 | "version": "4.1.1",
1359 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1360 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1361 | "engines": {
1362 | "node": ">=0.10.0"
1363 | }
1364 | },
1365 | "node_modules/object-inspect": {
1366 | "version": "1.12.3",
1367 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1368 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
1369 | "funding": {
1370 | "url": "https://github.com/sponsors/ljharb"
1371 | }
1372 | },
1373 | "node_modules/on-finished": {
1374 | "version": "2.4.1",
1375 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1376 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1377 | "dependencies": {
1378 | "ee-first": "1.1.1"
1379 | },
1380 | "engines": {
1381 | "node": ">= 0.8"
1382 | }
1383 | },
1384 | "node_modules/once": {
1385 | "version": "1.4.0",
1386 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1387 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1388 | "dependencies": {
1389 | "wrappy": "1"
1390 | }
1391 | },
1392 | "node_modules/parseurl": {
1393 | "version": "1.3.3",
1394 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1395 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1396 | "engines": {
1397 | "node": ">= 0.8"
1398 | }
1399 | },
1400 | "node_modules/path-is-absolute": {
1401 | "version": "1.0.1",
1402 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1403 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1404 | "engines": {
1405 | "node": ">=0.10.0"
1406 | }
1407 | },
1408 | "node_modules/path-to-regexp": {
1409 | "version": "0.1.7",
1410 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1411 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1412 | },
1413 | "node_modules/picomatch": {
1414 | "version": "2.3.1",
1415 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1416 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1417 | "dev": true,
1418 | "engines": {
1419 | "node": ">=8.6"
1420 | },
1421 | "funding": {
1422 | "url": "https://github.com/sponsors/jonschlinkert"
1423 | }
1424 | },
1425 | "node_modules/proxy-addr": {
1426 | "version": "2.0.7",
1427 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1428 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1429 | "dependencies": {
1430 | "forwarded": "0.2.0",
1431 | "ipaddr.js": "1.9.1"
1432 | },
1433 | "engines": {
1434 | "node": ">= 0.10"
1435 | }
1436 | },
1437 | "node_modules/pstree.remy": {
1438 | "version": "1.1.8",
1439 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1440 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1441 | "dev": true
1442 | },
1443 | "node_modules/punycode": {
1444 | "version": "2.3.0",
1445 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
1446 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
1447 | "engines": {
1448 | "node": ">=6"
1449 | }
1450 | },
1451 | "node_modules/qs": {
1452 | "version": "6.11.0",
1453 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1454 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1455 | "dependencies": {
1456 | "side-channel": "^1.0.4"
1457 | },
1458 | "engines": {
1459 | "node": ">=0.6"
1460 | },
1461 | "funding": {
1462 | "url": "https://github.com/sponsors/ljharb"
1463 | }
1464 | },
1465 | "node_modules/range-parser": {
1466 | "version": "1.2.1",
1467 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1468 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1469 | "engines": {
1470 | "node": ">= 0.6"
1471 | }
1472 | },
1473 | "node_modules/raw-body": {
1474 | "version": "2.5.1",
1475 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1476 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1477 | "dependencies": {
1478 | "bytes": "3.1.2",
1479 | "http-errors": "2.0.0",
1480 | "iconv-lite": "0.4.24",
1481 | "unpipe": "1.0.0"
1482 | },
1483 | "engines": {
1484 | "node": ">= 0.8"
1485 | }
1486 | },
1487 | "node_modules/readable-stream": {
1488 | "version": "3.6.2",
1489 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1490 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1491 | "dependencies": {
1492 | "inherits": "^2.0.3",
1493 | "string_decoder": "^1.1.1",
1494 | "util-deprecate": "^1.0.1"
1495 | },
1496 | "engines": {
1497 | "node": ">= 6"
1498 | }
1499 | },
1500 | "node_modules/readdirp": {
1501 | "version": "3.6.0",
1502 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1503 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1504 | "dev": true,
1505 | "dependencies": {
1506 | "picomatch": "^2.2.1"
1507 | },
1508 | "engines": {
1509 | "node": ">=8.10.0"
1510 | }
1511 | },
1512 | "node_modules/rimraf": {
1513 | "version": "3.0.2",
1514 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1515 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1516 | "dependencies": {
1517 | "glob": "^7.1.3"
1518 | },
1519 | "bin": {
1520 | "rimraf": "bin.js"
1521 | },
1522 | "funding": {
1523 | "url": "https://github.com/sponsors/isaacs"
1524 | }
1525 | },
1526 | "node_modules/safe-buffer": {
1527 | "version": "5.2.1",
1528 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1529 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1530 | "funding": [
1531 | {
1532 | "type": "github",
1533 | "url": "https://github.com/sponsors/feross"
1534 | },
1535 | {
1536 | "type": "patreon",
1537 | "url": "https://www.patreon.com/feross"
1538 | },
1539 | {
1540 | "type": "consulting",
1541 | "url": "https://feross.org/support"
1542 | }
1543 | ]
1544 | },
1545 | "node_modules/safer-buffer": {
1546 | "version": "2.1.2",
1547 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1548 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1549 | },
1550 | "node_modules/semver": {
1551 | "version": "7.5.4",
1552 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1553 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1554 | "dependencies": {
1555 | "lru-cache": "^6.0.0"
1556 | },
1557 | "bin": {
1558 | "semver": "bin/semver.js"
1559 | },
1560 | "engines": {
1561 | "node": ">=10"
1562 | }
1563 | },
1564 | "node_modules/send": {
1565 | "version": "0.18.0",
1566 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1567 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1568 | "dependencies": {
1569 | "debug": "2.6.9",
1570 | "depd": "2.0.0",
1571 | "destroy": "1.2.0",
1572 | "encodeurl": "~1.0.2",
1573 | "escape-html": "~1.0.3",
1574 | "etag": "~1.8.1",
1575 | "fresh": "0.5.2",
1576 | "http-errors": "2.0.0",
1577 | "mime": "1.6.0",
1578 | "ms": "2.1.3",
1579 | "on-finished": "2.4.1",
1580 | "range-parser": "~1.2.1",
1581 | "statuses": "2.0.1"
1582 | },
1583 | "engines": {
1584 | "node": ">= 0.8.0"
1585 | }
1586 | },
1587 | "node_modules/send/node_modules/ms": {
1588 | "version": "2.1.3",
1589 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1590 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1591 | },
1592 | "node_modules/serve-static": {
1593 | "version": "1.15.0",
1594 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1595 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1596 | "dependencies": {
1597 | "encodeurl": "~1.0.2",
1598 | "escape-html": "~1.0.3",
1599 | "parseurl": "~1.3.3",
1600 | "send": "0.18.0"
1601 | },
1602 | "engines": {
1603 | "node": ">= 0.8.0"
1604 | }
1605 | },
1606 | "node_modules/set-blocking": {
1607 | "version": "2.0.0",
1608 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1609 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
1610 | },
1611 | "node_modules/setprototypeof": {
1612 | "version": "1.2.0",
1613 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1614 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1615 | },
1616 | "node_modules/side-channel": {
1617 | "version": "1.0.4",
1618 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1619 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1620 | "dependencies": {
1621 | "call-bind": "^1.0.0",
1622 | "get-intrinsic": "^1.0.2",
1623 | "object-inspect": "^1.9.0"
1624 | },
1625 | "funding": {
1626 | "url": "https://github.com/sponsors/ljharb"
1627 | }
1628 | },
1629 | "node_modules/sift": {
1630 | "version": "16.0.1",
1631 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
1632 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
1633 | },
1634 | "node_modules/signal-exit": {
1635 | "version": "3.0.7",
1636 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1637 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
1638 | },
1639 | "node_modules/simple-update-notifier": {
1640 | "version": "2.0.0",
1641 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1642 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1643 | "dev": true,
1644 | "dependencies": {
1645 | "semver": "^7.5.3"
1646 | },
1647 | "engines": {
1648 | "node": ">=10"
1649 | }
1650 | },
1651 | "node_modules/smart-buffer": {
1652 | "version": "4.2.0",
1653 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
1654 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
1655 | "engines": {
1656 | "node": ">= 6.0.0",
1657 | "npm": ">= 3.0.0"
1658 | }
1659 | },
1660 | "node_modules/socks": {
1661 | "version": "2.7.1",
1662 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
1663 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
1664 | "dependencies": {
1665 | "ip": "^2.0.0",
1666 | "smart-buffer": "^4.2.0"
1667 | },
1668 | "engines": {
1669 | "node": ">= 10.13.0",
1670 | "npm": ">= 3.0.0"
1671 | }
1672 | },
1673 | "node_modules/sparse-bitfield": {
1674 | "version": "3.0.3",
1675 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1676 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1677 | "optional": true,
1678 | "dependencies": {
1679 | "memory-pager": "^1.0.2"
1680 | }
1681 | },
1682 | "node_modules/statuses": {
1683 | "version": "2.0.1",
1684 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1685 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1686 | "engines": {
1687 | "node": ">= 0.8"
1688 | }
1689 | },
1690 | "node_modules/streamsearch": {
1691 | "version": "1.1.0",
1692 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1693 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1694 | "engines": {
1695 | "node": ">=10.0.0"
1696 | }
1697 | },
1698 | "node_modules/string_decoder": {
1699 | "version": "1.3.0",
1700 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1701 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1702 | "dependencies": {
1703 | "safe-buffer": "~5.2.0"
1704 | }
1705 | },
1706 | "node_modules/string-width": {
1707 | "version": "4.2.3",
1708 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1709 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1710 | "dependencies": {
1711 | "emoji-regex": "^8.0.0",
1712 | "is-fullwidth-code-point": "^3.0.0",
1713 | "strip-ansi": "^6.0.1"
1714 | },
1715 | "engines": {
1716 | "node": ">=8"
1717 | }
1718 | },
1719 | "node_modules/strip-ansi": {
1720 | "version": "6.0.1",
1721 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1722 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1723 | "dependencies": {
1724 | "ansi-regex": "^5.0.1"
1725 | },
1726 | "engines": {
1727 | "node": ">=8"
1728 | }
1729 | },
1730 | "node_modules/supports-color": {
1731 | "version": "5.5.0",
1732 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1733 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1734 | "dev": true,
1735 | "dependencies": {
1736 | "has-flag": "^3.0.0"
1737 | },
1738 | "engines": {
1739 | "node": ">=4"
1740 | }
1741 | },
1742 | "node_modules/tar": {
1743 | "version": "6.2.0",
1744 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
1745 | "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
1746 | "dependencies": {
1747 | "chownr": "^2.0.0",
1748 | "fs-minipass": "^2.0.0",
1749 | "minipass": "^5.0.0",
1750 | "minizlib": "^2.1.1",
1751 | "mkdirp": "^1.0.3",
1752 | "yallist": "^4.0.0"
1753 | },
1754 | "engines": {
1755 | "node": ">=10"
1756 | }
1757 | },
1758 | "node_modules/to-regex-range": {
1759 | "version": "5.0.1",
1760 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1761 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1762 | "dev": true,
1763 | "dependencies": {
1764 | "is-number": "^7.0.0"
1765 | },
1766 | "engines": {
1767 | "node": ">=8.0"
1768 | }
1769 | },
1770 | "node_modules/toidentifier": {
1771 | "version": "1.0.1",
1772 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1773 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1774 | "engines": {
1775 | "node": ">=0.6"
1776 | }
1777 | },
1778 | "node_modules/touch": {
1779 | "version": "3.1.0",
1780 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1781 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1782 | "dev": true,
1783 | "dependencies": {
1784 | "nopt": "~1.0.10"
1785 | },
1786 | "bin": {
1787 | "nodetouch": "bin/nodetouch.js"
1788 | }
1789 | },
1790 | "node_modules/tr46": {
1791 | "version": "3.0.0",
1792 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1793 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1794 | "dependencies": {
1795 | "punycode": "^2.1.1"
1796 | },
1797 | "engines": {
1798 | "node": ">=12"
1799 | }
1800 | },
1801 | "node_modules/type-is": {
1802 | "version": "1.6.18",
1803 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1804 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1805 | "dependencies": {
1806 | "media-typer": "0.3.0",
1807 | "mime-types": "~2.1.24"
1808 | },
1809 | "engines": {
1810 | "node": ">= 0.6"
1811 | }
1812 | },
1813 | "node_modules/undefsafe": {
1814 | "version": "2.0.5",
1815 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1816 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1817 | "dev": true
1818 | },
1819 | "node_modules/undici-types": {
1820 | "version": "5.25.3",
1821 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
1822 | "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA=="
1823 | },
1824 | "node_modules/unpipe": {
1825 | "version": "1.0.0",
1826 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1827 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1828 | "engines": {
1829 | "node": ">= 0.8"
1830 | }
1831 | },
1832 | "node_modules/util-deprecate": {
1833 | "version": "1.0.2",
1834 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1835 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1836 | },
1837 | "node_modules/utils-merge": {
1838 | "version": "1.0.1",
1839 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1840 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1841 | "engines": {
1842 | "node": ">= 0.4.0"
1843 | }
1844 | },
1845 | "node_modules/vary": {
1846 | "version": "1.1.2",
1847 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1848 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1849 | "engines": {
1850 | "node": ">= 0.8"
1851 | }
1852 | },
1853 | "node_modules/webidl-conversions": {
1854 | "version": "7.0.0",
1855 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1856 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1857 | "engines": {
1858 | "node": ">=12"
1859 | }
1860 | },
1861 | "node_modules/whatwg-url": {
1862 | "version": "11.0.0",
1863 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1864 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1865 | "dependencies": {
1866 | "tr46": "^3.0.0",
1867 | "webidl-conversions": "^7.0.0"
1868 | },
1869 | "engines": {
1870 | "node": ">=12"
1871 | }
1872 | },
1873 | "node_modules/wide-align": {
1874 | "version": "1.1.5",
1875 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
1876 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
1877 | "dependencies": {
1878 | "string-width": "^1.0.2 || 2 || 3 || 4"
1879 | }
1880 | },
1881 | "node_modules/wrappy": {
1882 | "version": "1.0.2",
1883 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1884 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1885 | },
1886 | "node_modules/yallist": {
1887 | "version": "4.0.0",
1888 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1889 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1890 | }
1891 | }
1892 | }
1893 |
--------------------------------------------------------------------------------