├── backend
├── .gitignore
├── -copy.env
├── public
│ └── images
│ │ ├── products
│ │ ├── laptop1.webp
│ │ ├── laptop2.webp
│ │ ├── laptop3.webp
│ │ ├── laptop4.webp
│ │ ├── laptop5.webp
│ │ └── laptop6.webp
│ │ ├── tick24.svg
│ │ ├── secure-payment.svg
│ │ ├── truck-fast-solid.svg
│ │ └── dollar-sign-solid.svg
├── routes
│ ├── productRoutes.js
│ └── heroBottomRoutes.js
├── models
│ ├── heroBottom.js
│ └── product.js
├── controllers
│ ├── heroBottomController.js
│ └── productController.js
├── config
│ └── db.js
├── package.json
├── app.js
├── index.js
└── package-lock.json
└── frontend
├── src
├── Components
│ ├── Home
│ │ ├── Hero
│ │ │ ├── Hero.module.css
│ │ │ └── Hero.jsx
│ │ ├── HeroBottom
│ │ │ └── HeroBottom.jsx
│ │ └── LatestProducts
│ │ │ └── LatestProducts.jsx
│ ├── Footer.jsx
│ └── MainMenu.jsx
├── index.css
├── assets
│ └── images
│ │ ├── 2402277.jpg
│ │ ├── banner.jpg
│ │ └── SL-122222-54830-23.jpg
├── Layout.jsx
├── Pages
│ ├── Home.jsx
│ ├── Logout.jsx
│ ├── SignIn.jsx
│ └── SignUp.jsx
├── main.jsx
├── firebaseConfig.js
└── router.jsx
├── postcss.config.js
├── vite.config.js
├── tailwind.config.js
├── .gitignore
├── index.html
├── README.md
├── .eslintrc.cjs
└── package.json
/backend/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .env
--------------------------------------------------------------------------------
/frontend/src/Components/Home/Hero/Hero.module.css:
--------------------------------------------------------------------------------
1 | .h1 {
2 | font-style: italic;
3 | }
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/frontend/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/frontend/src/assets/images/2402277.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/frontend/src/assets/images/2402277.jpg
--------------------------------------------------------------------------------
/frontend/src/assets/images/banner.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/frontend/src/assets/images/banner.jpg
--------------------------------------------------------------------------------
/backend/-copy.env:
--------------------------------------------------------------------------------
1 | PORT=4000
2 | DB_URL=mongodb+srv://asif:ASDfgh123@ecommerce83.un9yb.mongodb.net/?retryWrites=true&w=majority&appName=ecommerce83
--------------------------------------------------------------------------------
/backend/public/images/products/laptop1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop1.webp
--------------------------------------------------------------------------------
/backend/public/images/products/laptop2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop2.webp
--------------------------------------------------------------------------------
/backend/public/images/products/laptop3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop3.webp
--------------------------------------------------------------------------------
/backend/public/images/products/laptop4.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop4.webp
--------------------------------------------------------------------------------
/backend/public/images/products/laptop5.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop5.webp
--------------------------------------------------------------------------------
/backend/public/images/products/laptop6.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/backend/public/images/products/laptop6.webp
--------------------------------------------------------------------------------
/frontend/src/assets/images/SL-122222-54830-23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/asif-daffodil/Mern-83-Project/HEAD/frontend/src/assets/images/SL-122222-54830-23.jpg
--------------------------------------------------------------------------------
/frontend/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/backend/routes/productRoutes.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import getLatestProducts from '../controllers/productController.js';
3 |
4 | const router = express.Router();
5 |
6 | router.get('/', getLatestProducts);
7 |
8 | export default router;
--------------------------------------------------------------------------------
/backend/routes/heroBottomRoutes.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import getHeroBottomData from '../controllers/heroBottomController.js';
3 |
4 | const router = express.Router();
5 |
6 | router.get('/', getHeroBottomData);
7 |
8 | export default router;
--------------------------------------------------------------------------------
/backend/models/heroBottom.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const heroBottomSchema = new mongoose.Schema({
4 | title: String,
5 | description: String,
6 | icon: String,
7 | });
8 |
9 | const HeroBottom = mongoose.model('HeroBottom', heroBottomSchema);
10 | export default HeroBottom;
--------------------------------------------------------------------------------
/frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: [
4 | "./index.html",
5 | "./src/**/*.{js,ts,jsx,tsx}",
6 | ],
7 | darkMode: 'class',
8 | theme: {
9 | extend: {},
10 | },
11 | plugins: [
12 | require('daisyui'),
13 | ],
14 | }
--------------------------------------------------------------------------------
/backend/models/product.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const productSchema = new mongoose.Schema({
4 | title: String,
5 | img: String,
6 | old_price: Number,
7 | sale_price: Number,
8 | short_description: String,
9 | });
10 |
11 | const Product = mongoose.model('Product', productSchema);
12 |
13 | export default Product;
--------------------------------------------------------------------------------
/backend/controllers/heroBottomController.js:
--------------------------------------------------------------------------------
1 | import HeroBottom from '../models/heroBottom.js';
2 |
3 | const getHeroBottomData = async (req, res) => {
4 | try {
5 | const data = await HeroBottom.find();
6 | res.status(200).send(data);
7 | } catch (error) {
8 | res.status(400).send(error);
9 | }
10 | };
11 |
12 | export default getHeroBottomData;
--------------------------------------------------------------------------------
/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/frontend/src/Layout.jsx:
--------------------------------------------------------------------------------
1 | import { Outlet } from "react-router-dom";
2 | import MainMenu from "./Components/MainMenu";
3 | import Footer from "./Components/Footer";
4 |
5 | const Layout = () => {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 | );
13 | };
14 |
15 | export default Layout;
--------------------------------------------------------------------------------
/backend/controllers/productController.js:
--------------------------------------------------------------------------------
1 | import Product from '../models/product.js';
2 |
3 | const getLatestProducts = async (req, res) => {
4 | try {
5 | const data = await Product.find().sort({ _id: -1 }).limit(6);
6 | res.status(200).send(data);
7 | } catch (error) {
8 | res.status(400).send(error);
9 | }
10 | };
11 |
12 | export default getLatestProducts;
--------------------------------------------------------------------------------
/backend/config/db.js:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose';
2 |
3 | const connectDB = async () => {
4 | try {
5 | await mongoose.connect(process.env.DB_URL);
6 | console.log('Database connected successfully');
7 | } catch (error) {
8 | console.error('Database connection failed:', error.message);
9 | process.exit(1);
10 | }
11 | };
12 |
13 | export default connectDB;
--------------------------------------------------------------------------------
/backend/public/images/tick24.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/frontend/src/Pages/Home.jsx:
--------------------------------------------------------------------------------
1 | import Hero from "../Components/Home/Hero/Hero";
2 | import HeroBottom from "../Components/Home/HeroBottom/HeroBottom";
3 | import LatestProducts from "../Components/Home/LatestProducts/LatestProducts";
4 |
5 | const Home = () => {
6 | return (
7 | <>
8 |
9 |
10 |
11 | >
12 | );
13 | };
14 |
15 | export default Home;
--------------------------------------------------------------------------------
/frontend/README.md:
--------------------------------------------------------------------------------
1 | # React + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
--------------------------------------------------------------------------------
/frontend/src/main.jsx:
--------------------------------------------------------------------------------
1 | import ReactDOM from 'react-dom/client'
2 | import './index.css'
3 | import { RouterProvider } from 'react-router-dom'
4 | import router from './router'
5 | import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
6 | import 'toastr/build/toastr.css'
7 |
8 | const queryClient = new QueryClient()
9 |
10 | ReactDOM.createRoot(document.getElementById('root')).render(
11 |
12 |
13 |
14 | )
15 |
--------------------------------------------------------------------------------
/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "main": "app.js",
5 | "type": "module",
6 | "scripts": {
7 | "start": "nodemon app.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "description": "",
14 | "dependencies": {
15 | "body-parser": "^1.20.3",
16 | "cookie-parser": "^1.4.6",
17 | "cors": "^2.8.5",
18 | "dotenv": "^16.4.5",
19 | "express": "^4.21.0",
20 | "mongoose": "^8.6.3",
21 | "multer": "^1.4.5-lts.1",
22 | "nodemon": "^3.1.6"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/frontend/src/Pages/Logout.jsx:
--------------------------------------------------------------------------------
1 | import { useSignOut } from "react-firebase-hooks/auth";
2 | import auth from "../firebaseConfig";
3 | import { useNavigate } from "react-router-dom";
4 |
5 | const Logout = () => {
6 | const [signOut, loading, error] = useSignOut(auth);
7 | const navigate = useNavigate();
8 | if (loading) {
9 | return Loading...
;
10 | }
11 |
12 | if (error) {
13 | return Error: {error}
;
14 | }
15 |
16 | signOut();
17 | navigate("/sign-in");
18 | return (
19 |
20 | Logout
21 |
22 | );
23 | };
24 |
25 | export default Logout;
--------------------------------------------------------------------------------
/backend/public/images/secure-payment.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/src/firebaseConfig.js:
--------------------------------------------------------------------------------
1 | // Import the functions you need from the SDKs you need
2 | import { initializeApp } from "firebase/app";
3 | // TODO: Add SDKs for Firebase products that you want to use
4 | // https://firebase.google.com/docs/web/setup#available-libraries
5 |
6 | import { getAuth } from "firebase/auth";
7 |
8 | // Your web app's Firebase configuration
9 | const firebaseConfig = {
10 | apiKey: "AIzaSyAU4bfZpl-IZ0UOF27YmssA2SqezcQOE6s",
11 | authDomain: "mern-83.firebaseapp.com",
12 | projectId: "mern-83",
13 | storageBucket: "mern-83.appspot.com",
14 | messagingSenderId: "481509556678",
15 | appId: "1:481509556678:web:66bdf96fc5f0aca1c3f2c7"
16 | };
17 |
18 | // Initialize Firebase
19 | const app = initializeApp(firebaseConfig);
20 | const auth = getAuth(app);
21 |
22 | export default auth;
--------------------------------------------------------------------------------
/backend/public/images/truck-fast-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: [
5 | 'eslint:recommended',
6 | 'plugin:react/recommended',
7 | 'plugin:react/jsx-runtime',
8 | 'plugin:react-hooks/recommended',
9 | ],
10 | ignorePatterns: ['dist', '.eslintrc.cjs'],
11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
12 | settings: { react: { version: '18.2' } },
13 | plugins: ['react-refresh'],
14 | rules: {
15 | 'react/jsx-no-target-blank': 'off',
16 | 'react-refresh/only-export-components': [
17 | 'warn',
18 | { allowConstantExport: true },
19 | ],
20 | },
21 | overrides: [
22 | {
23 | files: ['tailwind.config.js'],
24 | env: {
25 | node: true,
26 | },
27 | rules: {
28 | '@typescript-eslint/no-var-requires': 'off',
29 | },
30 | },
31 | ],
32 | }
33 |
--------------------------------------------------------------------------------
/frontend/src/router.jsx:
--------------------------------------------------------------------------------
1 | import { createBrowserRouter } from "react-router-dom";
2 | import Home from "./Pages/Home";
3 | import Layout from "./Layout";
4 | import SignUp from "./Pages/SignUp";
5 | import SignIn from "./Pages/SignIn";
6 | import Logout from "./Pages/Logout";
7 |
8 | const router = createBrowserRouter([
9 | {
10 | path: "/",
11 | element: ,
12 | children: [
13 | {
14 | path: "/",
15 | element:
16 | },
17 | {
18 | path: "/sign-up",
19 | element:
20 | },
21 | {
22 | path: "/sign-in",
23 | element:
24 | },
25 | {
26 | path: "/logout",
27 | element:
28 | }
29 | ]
30 | },
31 | ]);
32 |
33 | export default router;
--------------------------------------------------------------------------------
/backend/app.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import dotenv from 'dotenv';
3 | import cors from 'cors';
4 | import bodyParser from 'body-parser';
5 | import connectDB from './config/db.js';
6 | import heroBottomRoutes from './routes/heroBottomRoutes.js';
7 | import productRoutes from './routes/productRoutes.js';
8 |
9 | dotenv.config();
10 |
11 | const app = express();
12 | const port = process.env.PORT || 3000;
13 |
14 | // Middleware
15 | app.use(cors());
16 | app.use(bodyParser.json());
17 | app.use(bodyParser.urlencoded({ extended: true }));
18 | app.use(express.static('public'));
19 |
20 | // Connect to the database
21 | connectDB();
22 |
23 | // Routes
24 | app.use('/heroBottom', heroBottomRoutes);
25 | app.use('/latestProducts', productRoutes);
26 |
27 | // Default route
28 | app.get('/', (req, res) => {
29 | res.send('Hello World');
30 | });
31 |
32 | // Start the server
33 | app.listen(port, () => {
34 | console.log(`Server is running on port ${port}`);
35 | });
--------------------------------------------------------------------------------
/backend/public/images/dollar-sign-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/frontend/src/Components/Home/Hero/Hero.jsx:
--------------------------------------------------------------------------------
1 | import hero from "./Hero.module.css";
2 | import banner from '../../../assets/images/banner.jpg';
3 |
4 | const Hero = () => {
5 | return (
6 |
11 |
12 |
13 |
14 |
Hello there
15 |
16 | Provident cupiditate voluptatem et in. Quaerat fugiat ut assumenda excepturi exercitationem
17 | quasi. In deleniti eaque aut repudiandae et a id nisi.
18 |
19 |
Get Started
20 |
21 |
22 |
23 | );
24 | };
25 |
26 | export default Hero;
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "@fortawesome/fontawesome-svg-core": "^6.6.0",
14 | "@fortawesome/free-solid-svg-icons": "^6.6.0",
15 | "@fortawesome/react-fontawesome": "^0.2.2",
16 | "@tanstack/react-query": "^5.59.14",
17 | "axios": "^1.7.7",
18 | "firebase": "^10.14.1",
19 | "react": "^18.2.0",
20 | "react-dom": "^18.2.0",
21 | "react-firebase-hooks": "^5.1.1",
22 | "react-hook-form": "^7.53.0",
23 | "react-router-dom": "^6.26.2",
24 | "toastr": "^2.1.4"
25 | },
26 | "devDependencies": {
27 | "@types/react": "^18.2.66",
28 | "@types/react-dom": "^18.2.22",
29 | "@vitejs/plugin-react": "^4.2.1",
30 | "autoprefixer": "^10.4.20",
31 | "daisyui": "^4.12.10",
32 | "eslint": "^8.57.0",
33 | "eslint-plugin-react": "^7.34.1",
34 | "eslint-plugin-react-hooks": "^4.6.0",
35 | "eslint-plugin-react-refresh": "^0.4.6",
36 | "postcss": "^8.4.45",
37 | "tailwindcss": "^3.4.11",
38 | "vite": "^5.2.0"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/frontend/src/Components/Home/HeroBottom/HeroBottom.jsx:
--------------------------------------------------------------------------------
1 | import { faClock, faCreditCard, faDollar, faTruckFast } from "@fortawesome/free-solid-svg-icons";
2 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
3 | import { useQuery } from "@tanstack/react-query";
4 | import axios from "axios";
5 |
6 | const iconMap = {
7 | faClock: faClock,
8 | faCreditCard: faCreditCard,
9 | faDollar: faDollar,
10 | faTruckFast: faTruckFast,
11 | };
12 |
13 | const HeroBottom = () => {
14 | const heroBottom = useQuery({
15 | queryKey: 'heroBottom',
16 | queryFn: async () => {
17 | const { data } = await axios.get('http://localhost:4000/heroBottom');
18 | return data;
19 | }
20 | });
21 |
22 | if (heroBottom.isLoading) return Loading...
;
23 | if (heroBottom.error) return Error: {heroBottom.error.message}
;
24 |
25 | return (
26 |
27 |
28 |
29 | {heroBottom.data.map((item, index) => (
30 |
31 |
32 |
33 |
34 |
35 |
{item.title}
36 |
{item.description}
37 |
38 |
39 | ))}
40 |
41 |
42 |
43 | );
44 | };
45 |
46 | export default HeroBottom;
47 |
--------------------------------------------------------------------------------
/backend/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const app = express();
3 |
4 | // env
5 | require('dotenv').config();
6 |
7 | // port
8 | const port = process.env.PORT;
9 |
10 | // cors
11 | const cors = require('cors');
12 | app.use(cors());
13 |
14 | // body-parser
15 | const bodyParser = require('body-parser');
16 | app.use(bodyParser.json());
17 | app.use(bodyParser.urlencoded({ extended: true }));
18 |
19 | // multer
20 | const multer = require('multer');
21 |
22 | const storage = multer.diskStorage({
23 | destination: function (req, file, cb) {
24 | cb(null, 'uploads/');
25 | },
26 | filename: function (req, file, cb) {
27 | cb(null, file.originalname);
28 | }
29 | });
30 | const upload = multer({ storage: storage });
31 |
32 | // static
33 | app.use(express.static('public'));
34 |
35 | // mongoose
36 | const mongoose = require('mongoose');
37 | mongoose.connect(process.env.DB_URL);
38 |
39 | // heroBottom schema
40 | const heroBottomSchema = new mongoose.Schema({
41 | title: String,
42 | description: String,
43 | icon: String
44 | });
45 |
46 | const HeroBottom = mongoose.model('HeroBottom', heroBottomSchema);
47 |
48 | // heroBottom routes getData
49 | app.get('/heroBottom', (req, res) => {
50 | try{
51 | HeroBottom.find().then((data) => {
52 | res.send(data).status(200);
53 | });
54 | }catch(e){
55 | res.send(e).status(400);
56 | }
57 | });
58 |
59 | // get latest products
60 | const productSchema = new mongoose.Schema({
61 | title: String,
62 | img: String,
63 | old_price: Number,
64 | sale_price: Number,
65 | short_description: String
66 | });
67 |
68 | const Product = mongoose.model('Product', productSchema);
69 |
70 | app.get('/latestProducts', (req, res) => {
71 | try {
72 | Product.find().sort({ _id: -1 }).limit(6).then((data) => {
73 | res.send(data).status(200);
74 | });
75 | } catch (e) {
76 | res.send(e).status(400);
77 | }
78 | });
79 |
80 |
81 |
82 | // routes
83 | app.get('/', (req, res) => {
84 | res.send('Hello World');
85 | });
86 |
87 | // create server
88 | app.listen(port, () => {
89 | console.log(`Server is running on port ${port}`);
90 | });
91 |
--------------------------------------------------------------------------------
/frontend/src/Components/Home/LatestProducts/LatestProducts.jsx:
--------------------------------------------------------------------------------
1 | import { useQuery } from "@tanstack/react-query";
2 | import axios from "axios";
3 |
4 | const LatestProducts = () => {
5 | const LatestProduct = useQuery({
6 | queryKey: "latestProduct",
7 | queryFn: async () => {
8 | const { data } = await axios.get("http://localhost:4000/latestProducts");
9 | return data;
10 | },
11 | });
12 |
13 | if (LatestProduct.isLoading) return Loading...
;
14 |
15 | return (
16 |
17 |
18 |
19 | Latest Product
20 |
21 |
22 | {LatestProduct.data.map((item, index) => (
23 |
27 |
28 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | {item.title}
40 |
41 |
42 | ${item.sale_price}{" "}
43 |
44 | ${item.old_price}
45 |
46 |
47 |
48 |
52 | Add to Cart
53 |
54 |
55 |
56 | ))}
57 |
58 |
59 |
60 | );
61 | };
62 |
63 | export default LatestProducts;
64 |
--------------------------------------------------------------------------------
/frontend/src/Components/Footer.jsx:
--------------------------------------------------------------------------------
1 |
2 | const Footer = () => {
3 | return (
4 |
61 | );
62 | };
63 |
64 | export default Footer;
--------------------------------------------------------------------------------
/frontend/src/Pages/SignIn.jsx:
--------------------------------------------------------------------------------
1 | import { Link, useNavigate } from "react-router-dom";
2 | import img from "../assets/images/SL-122222-54830-23.jpg";
3 | import { useAuthState, useSignInWithEmailAndPassword, useSignInWithGoogle } from "react-firebase-hooks/auth";
4 | import auth from "../firebaseConfig";
5 | import { useForm } from "react-hook-form";
6 | import toastr from "toastr";
7 |
8 | const SignIn = () => {
9 | const navigate = useNavigate();
10 |
11 | const [user, loading, error] = useAuthState(auth);
12 | const [signInWithGoogle] = useSignInWithGoogle(auth);
13 | const [signInWithEmailAndPassword] = useSignInWithEmailAndPassword(auth);
14 | const {register, handleSubmit, formState: { errors }} = useForm();
15 |
16 | if (loading) {
17 | return Loading...
;
18 | }
19 |
20 | if (error) {
21 | return Error: {error}
;
22 | }
23 |
24 | if (user) {
25 | navigate("/");
26 | }
27 |
28 | const onSubmit = (data) => {
29 | if(signInWithEmailAndPassword(data.email, data.password)){
30 | toastr.success("Login successful");
31 | setTimeout(() => {
32 | navigate("/");
33 | }, 2000);
34 | }else{
35 | toastr.error("Login failed");
36 | }
37 | }
38 |
39 | return (
40 |
41 | {/* Left Section */}
42 |
43 |
44 |
45 |
46 |
47 |
48 | {/* Right Section */}
49 |
50 |
119 | {/* Create a Login with Facebook Button with Facebook Logo */}
120 |
121 |
signInWithGoogle()}>
122 |
127 | Login with Google
128 |
129 |
130 |
131 |
132 | );
133 | };
134 |
135 | export default SignIn;
136 |
--------------------------------------------------------------------------------
/frontend/src/Pages/SignUp.jsx:
--------------------------------------------------------------------------------
1 | import { useForm } from "react-hook-form";
2 | import { Link, useNavigate } from "react-router-dom";
3 | import img from "../assets/images/2402277.jpg";
4 | import { useAuthState, useCreateUserWithEmailAndPassword, useSignInWithGoogle } from 'react-firebase-hooks/auth';
5 | import { updateProfile } from "firebase/auth"; // Import the updateProfile method
6 | import auth from "../firebaseConfig";
7 | import toastr from 'toastr';
8 | import { useEffect } from "react";
9 |
10 | const SignUp = () => {
11 |
12 | const navigate = useNavigate();
13 |
14 | const [user, loading, error] = useAuthState(auth);
15 | const [signInWithGoogle] = useSignInWithGoogle(auth);
16 | const [createUserWithEmailAndPassword] = useCreateUserWithEmailAndPassword(auth);
17 |
18 | const { register, handleSubmit, formState: { errors } } = useForm();
19 |
20 | const onSubmit = async (data) => {
21 | try {
22 | // Create user with email and password
23 | const userCredential = await createUserWithEmailAndPassword(data.email, data.password);
24 | if (userCredential) {
25 | // Update profile with the display name
26 | await updateProfile(userCredential.user, {
27 | displayName: data.name,
28 | });
29 |
30 | toastr.success("User created successfully");
31 |
32 | // Delay navigation until the profile is updated
33 | setTimeout(() => {
34 | navigate("/sign-in"); // Redirect to sign-in page or home after
35 | }, 2000);
36 | }
37 | } catch (error) {
38 | toastr.error("User creation failed: " + error.message);
39 | }
40 | };
41 |
42 | // Watch for user updates and avoid redirecting too early
43 | useEffect(() => {
44 | if (user && user.displayName) {
45 | navigate("/"); // Now redirect to home after the name is updated
46 | }
47 | }, [user, navigate]); // UseEffect runs when `user` or `navigate` changes
48 |
49 | if (loading) {
50 | return Loading...
;
51 | }
52 |
53 | if (error) {
54 | return Error: {error.message}
;
55 | }
56 |
57 | return (
58 |
59 | {/* Left Section */}
60 |
61 |
62 |
63 |
64 |
65 |
66 | {/* Right Section */}
67 |
68 |
69 |
194 |
195 |
signInWithGoogle()}>
196 |
201 | Login with Google
202 |
203 |
204 |
205 |
206 |
207 | );
208 | };
209 |
210 | export default SignUp;
211 |
--------------------------------------------------------------------------------
/frontend/src/Components/MainMenu.jsx:
--------------------------------------------------------------------------------
1 | import { faBars, faMoon, faSun } from "@fortawesome/free-solid-svg-icons";
2 | import { faCartShopping } from "@fortawesome/free-solid-svg-icons/faCartShopping";
3 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4 | import { useEffect, useState } from "react";
5 | import { NavLink } from "react-router-dom";
6 | import { useAuthState } from "react-firebase-hooks/auth";
7 | import auth from "../firebaseConfig";
8 |
9 | const MainMenu = () => {
10 | const [user] = useAuthState(auth);
11 | const [isDarkMode, setIsDarkMode] = useState(false);
12 | const toggleDarkMode = () => {
13 | setIsDarkMode(!isDarkMode);
14 | if (isDarkMode) {
15 | document.body.classList.remove("dark");
16 | sessionStorage.setItem("darkMode", "false");
17 | } else {
18 | document.body.classList.add("dark");
19 | sessionStorage.setItem("darkMode", "true");
20 | }
21 | };
22 |
23 | useEffect(() => {
24 | const darkMode = sessionStorage.getItem("darkMode");
25 | if (darkMode === "true") {
26 | setIsDarkMode(true);
27 | document.body.classList.add("dark");
28 | }
29 | if (user && !user.displayName) {
30 | // Optionally re-fetch the user profile from Firebase if displayName is not set
31 | auth.currentUser.reload().then(() => {
32 | console.log("User data reloaded:", auth.currentUser);
33 | });
34 | }
35 | }, [user]);
36 |
37 | return (
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
48 | Home
49 |
50 | Parent
51 |
55 |
56 |
57 | Sign-in
58 |
59 |
60 | Sign-up
61 |
62 |
63 |
64 |
Project-83
65 |
66 |
67 |
68 |
69 |
70 | Home
71 |
72 |
73 | Parent
74 |
78 |
79 |
80 | {!user && (
81 | <>
82 |
83 | Sign-in
84 |
85 |
86 | Sign-up
87 |
88 | >
89 | )}
90 |
91 |
92 |
93 |
94 |
95 |
96 | 8
97 |
98 |
99 |
102 |
103 |
8 Items
104 |
Subtotal: $999
105 |
106 | View cart
107 |
108 |
109 |
110 |
111 | {user && (
112 |
113 |
114 |
115 | {user.displayName || "Profile"}
116 |
126 |
127 |
128 |
129 | )}
130 |
149 |
150 |
151 |
152 | );
153 | };
154 |
155 | export default MainMenu;
--------------------------------------------------------------------------------
/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 | "body-parser": "^1.20.3",
13 | "cookie-parser": "^1.4.6",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.4.5",
16 | "express": "^4.21.0",
17 | "mongoose": "^8.6.3",
18 | "multer": "^1.4.5-lts.1",
19 | "nodemon": "^3.1.6"
20 | }
21 | },
22 | "node_modules/@mongodb-js/saslprep": {
23 | "version": "1.1.9",
24 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
25 | "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
26 | "license": "MIT",
27 | "dependencies": {
28 | "sparse-bitfield": "^3.0.3"
29 | }
30 | },
31 | "node_modules/@types/webidl-conversions": {
32 | "version": "7.0.3",
33 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
34 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
35 | "license": "MIT"
36 | },
37 | "node_modules/@types/whatwg-url": {
38 | "version": "11.0.5",
39 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
40 | "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
41 | "license": "MIT",
42 | "dependencies": {
43 | "@types/webidl-conversions": "*"
44 | }
45 | },
46 | "node_modules/accepts": {
47 | "version": "1.3.8",
48 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
49 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
50 | "license": "MIT",
51 | "dependencies": {
52 | "mime-types": "~2.1.34",
53 | "negotiator": "0.6.3"
54 | },
55 | "engines": {
56 | "node": ">= 0.6"
57 | }
58 | },
59 | "node_modules/anymatch": {
60 | "version": "3.1.3",
61 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
62 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
63 | "license": "ISC",
64 | "dependencies": {
65 | "normalize-path": "^3.0.0",
66 | "picomatch": "^2.0.4"
67 | },
68 | "engines": {
69 | "node": ">= 8"
70 | }
71 | },
72 | "node_modules/append-field": {
73 | "version": "1.0.0",
74 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
75 | "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
76 | "license": "MIT"
77 | },
78 | "node_modules/array-flatten": {
79 | "version": "1.1.1",
80 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
81 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
82 | "license": "MIT"
83 | },
84 | "node_modules/balanced-match": {
85 | "version": "1.0.2",
86 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
87 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
88 | "license": "MIT"
89 | },
90 | "node_modules/binary-extensions": {
91 | "version": "2.3.0",
92 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
93 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
94 | "license": "MIT",
95 | "engines": {
96 | "node": ">=8"
97 | },
98 | "funding": {
99 | "url": "https://github.com/sponsors/sindresorhus"
100 | }
101 | },
102 | "node_modules/body-parser": {
103 | "version": "1.20.3",
104 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
105 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
106 | "license": "MIT",
107 | "dependencies": {
108 | "bytes": "3.1.2",
109 | "content-type": "~1.0.5",
110 | "debug": "2.6.9",
111 | "depd": "2.0.0",
112 | "destroy": "1.2.0",
113 | "http-errors": "2.0.0",
114 | "iconv-lite": "0.4.24",
115 | "on-finished": "2.4.1",
116 | "qs": "6.13.0",
117 | "raw-body": "2.5.2",
118 | "type-is": "~1.6.18",
119 | "unpipe": "1.0.0"
120 | },
121 | "engines": {
122 | "node": ">= 0.8",
123 | "npm": "1.2.8000 || >= 1.4.16"
124 | }
125 | },
126 | "node_modules/brace-expansion": {
127 | "version": "1.1.11",
128 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
129 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
130 | "license": "MIT",
131 | "dependencies": {
132 | "balanced-match": "^1.0.0",
133 | "concat-map": "0.0.1"
134 | }
135 | },
136 | "node_modules/braces": {
137 | "version": "3.0.3",
138 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
139 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
140 | "license": "MIT",
141 | "dependencies": {
142 | "fill-range": "^7.1.1"
143 | },
144 | "engines": {
145 | "node": ">=8"
146 | }
147 | },
148 | "node_modules/bson": {
149 | "version": "6.8.0",
150 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz",
151 | "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==",
152 | "license": "Apache-2.0",
153 | "engines": {
154 | "node": ">=16.20.1"
155 | }
156 | },
157 | "node_modules/buffer-from": {
158 | "version": "1.1.2",
159 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
160 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
161 | "license": "MIT"
162 | },
163 | "node_modules/busboy": {
164 | "version": "1.6.0",
165 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
166 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
167 | "dependencies": {
168 | "streamsearch": "^1.1.0"
169 | },
170 | "engines": {
171 | "node": ">=10.16.0"
172 | }
173 | },
174 | "node_modules/bytes": {
175 | "version": "3.1.2",
176 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
177 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
178 | "license": "MIT",
179 | "engines": {
180 | "node": ">= 0.8"
181 | }
182 | },
183 | "node_modules/call-bind": {
184 | "version": "1.0.7",
185 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
186 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
187 | "license": "MIT",
188 | "dependencies": {
189 | "es-define-property": "^1.0.0",
190 | "es-errors": "^1.3.0",
191 | "function-bind": "^1.1.2",
192 | "get-intrinsic": "^1.2.4",
193 | "set-function-length": "^1.2.1"
194 | },
195 | "engines": {
196 | "node": ">= 0.4"
197 | },
198 | "funding": {
199 | "url": "https://github.com/sponsors/ljharb"
200 | }
201 | },
202 | "node_modules/chokidar": {
203 | "version": "3.6.0",
204 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
205 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
206 | "license": "MIT",
207 | "dependencies": {
208 | "anymatch": "~3.1.2",
209 | "braces": "~3.0.2",
210 | "glob-parent": "~5.1.2",
211 | "is-binary-path": "~2.1.0",
212 | "is-glob": "~4.0.1",
213 | "normalize-path": "~3.0.0",
214 | "readdirp": "~3.6.0"
215 | },
216 | "engines": {
217 | "node": ">= 8.10.0"
218 | },
219 | "funding": {
220 | "url": "https://paulmillr.com/funding/"
221 | },
222 | "optionalDependencies": {
223 | "fsevents": "~2.3.2"
224 | }
225 | },
226 | "node_modules/concat-map": {
227 | "version": "0.0.1",
228 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
229 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
230 | "license": "MIT"
231 | },
232 | "node_modules/concat-stream": {
233 | "version": "1.6.2",
234 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
235 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
236 | "engines": [
237 | "node >= 0.8"
238 | ],
239 | "license": "MIT",
240 | "dependencies": {
241 | "buffer-from": "^1.0.0",
242 | "inherits": "^2.0.3",
243 | "readable-stream": "^2.2.2",
244 | "typedarray": "^0.0.6"
245 | }
246 | },
247 | "node_modules/content-disposition": {
248 | "version": "0.5.4",
249 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
250 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
251 | "license": "MIT",
252 | "dependencies": {
253 | "safe-buffer": "5.2.1"
254 | },
255 | "engines": {
256 | "node": ">= 0.6"
257 | }
258 | },
259 | "node_modules/content-type": {
260 | "version": "1.0.5",
261 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
262 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
263 | "license": "MIT",
264 | "engines": {
265 | "node": ">= 0.6"
266 | }
267 | },
268 | "node_modules/cookie": {
269 | "version": "0.6.0",
270 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
271 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
272 | "license": "MIT",
273 | "engines": {
274 | "node": ">= 0.6"
275 | }
276 | },
277 | "node_modules/cookie-parser": {
278 | "version": "1.4.6",
279 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
280 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
281 | "license": "MIT",
282 | "dependencies": {
283 | "cookie": "0.4.1",
284 | "cookie-signature": "1.0.6"
285 | },
286 | "engines": {
287 | "node": ">= 0.8.0"
288 | }
289 | },
290 | "node_modules/cookie-parser/node_modules/cookie": {
291 | "version": "0.4.1",
292 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
293 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
294 | "license": "MIT",
295 | "engines": {
296 | "node": ">= 0.6"
297 | }
298 | },
299 | "node_modules/cookie-signature": {
300 | "version": "1.0.6",
301 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
302 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
303 | "license": "MIT"
304 | },
305 | "node_modules/core-util-is": {
306 | "version": "1.0.3",
307 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
308 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
309 | "license": "MIT"
310 | },
311 | "node_modules/cors": {
312 | "version": "2.8.5",
313 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
314 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
315 | "license": "MIT",
316 | "dependencies": {
317 | "object-assign": "^4",
318 | "vary": "^1"
319 | },
320 | "engines": {
321 | "node": ">= 0.10"
322 | }
323 | },
324 | "node_modules/debug": {
325 | "version": "2.6.9",
326 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
327 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
328 | "license": "MIT",
329 | "dependencies": {
330 | "ms": "2.0.0"
331 | }
332 | },
333 | "node_modules/define-data-property": {
334 | "version": "1.1.4",
335 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
336 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
337 | "license": "MIT",
338 | "dependencies": {
339 | "es-define-property": "^1.0.0",
340 | "es-errors": "^1.3.0",
341 | "gopd": "^1.0.1"
342 | },
343 | "engines": {
344 | "node": ">= 0.4"
345 | },
346 | "funding": {
347 | "url": "https://github.com/sponsors/ljharb"
348 | }
349 | },
350 | "node_modules/depd": {
351 | "version": "2.0.0",
352 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
353 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
354 | "license": "MIT",
355 | "engines": {
356 | "node": ">= 0.8"
357 | }
358 | },
359 | "node_modules/destroy": {
360 | "version": "1.2.0",
361 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
362 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
363 | "license": "MIT",
364 | "engines": {
365 | "node": ">= 0.8",
366 | "npm": "1.2.8000 || >= 1.4.16"
367 | }
368 | },
369 | "node_modules/dotenv": {
370 | "version": "16.4.5",
371 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
372 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
373 | "license": "BSD-2-Clause",
374 | "engines": {
375 | "node": ">=12"
376 | },
377 | "funding": {
378 | "url": "https://dotenvx.com"
379 | }
380 | },
381 | "node_modules/ee-first": {
382 | "version": "1.1.1",
383 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
384 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
385 | "license": "MIT"
386 | },
387 | "node_modules/encodeurl": {
388 | "version": "2.0.0",
389 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
390 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
391 | "license": "MIT",
392 | "engines": {
393 | "node": ">= 0.8"
394 | }
395 | },
396 | "node_modules/es-define-property": {
397 | "version": "1.0.0",
398 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
399 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
400 | "license": "MIT",
401 | "dependencies": {
402 | "get-intrinsic": "^1.2.4"
403 | },
404 | "engines": {
405 | "node": ">= 0.4"
406 | }
407 | },
408 | "node_modules/es-errors": {
409 | "version": "1.3.0",
410 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
411 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
412 | "license": "MIT",
413 | "engines": {
414 | "node": ">= 0.4"
415 | }
416 | },
417 | "node_modules/escape-html": {
418 | "version": "1.0.3",
419 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
420 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
421 | "license": "MIT"
422 | },
423 | "node_modules/etag": {
424 | "version": "1.8.1",
425 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
426 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
427 | "license": "MIT",
428 | "engines": {
429 | "node": ">= 0.6"
430 | }
431 | },
432 | "node_modules/express": {
433 | "version": "4.21.0",
434 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
435 | "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
436 | "license": "MIT",
437 | "dependencies": {
438 | "accepts": "~1.3.8",
439 | "array-flatten": "1.1.1",
440 | "body-parser": "1.20.3",
441 | "content-disposition": "0.5.4",
442 | "content-type": "~1.0.4",
443 | "cookie": "0.6.0",
444 | "cookie-signature": "1.0.6",
445 | "debug": "2.6.9",
446 | "depd": "2.0.0",
447 | "encodeurl": "~2.0.0",
448 | "escape-html": "~1.0.3",
449 | "etag": "~1.8.1",
450 | "finalhandler": "1.3.1",
451 | "fresh": "0.5.2",
452 | "http-errors": "2.0.0",
453 | "merge-descriptors": "1.0.3",
454 | "methods": "~1.1.2",
455 | "on-finished": "2.4.1",
456 | "parseurl": "~1.3.3",
457 | "path-to-regexp": "0.1.10",
458 | "proxy-addr": "~2.0.7",
459 | "qs": "6.13.0",
460 | "range-parser": "~1.2.1",
461 | "safe-buffer": "5.2.1",
462 | "send": "0.19.0",
463 | "serve-static": "1.16.2",
464 | "setprototypeof": "1.2.0",
465 | "statuses": "2.0.1",
466 | "type-is": "~1.6.18",
467 | "utils-merge": "1.0.1",
468 | "vary": "~1.1.2"
469 | },
470 | "engines": {
471 | "node": ">= 0.10.0"
472 | }
473 | },
474 | "node_modules/fill-range": {
475 | "version": "7.1.1",
476 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
477 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
478 | "license": "MIT",
479 | "dependencies": {
480 | "to-regex-range": "^5.0.1"
481 | },
482 | "engines": {
483 | "node": ">=8"
484 | }
485 | },
486 | "node_modules/finalhandler": {
487 | "version": "1.3.1",
488 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
489 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
490 | "license": "MIT",
491 | "dependencies": {
492 | "debug": "2.6.9",
493 | "encodeurl": "~2.0.0",
494 | "escape-html": "~1.0.3",
495 | "on-finished": "2.4.1",
496 | "parseurl": "~1.3.3",
497 | "statuses": "2.0.1",
498 | "unpipe": "~1.0.0"
499 | },
500 | "engines": {
501 | "node": ">= 0.8"
502 | }
503 | },
504 | "node_modules/forwarded": {
505 | "version": "0.2.0",
506 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
507 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
508 | "license": "MIT",
509 | "engines": {
510 | "node": ">= 0.6"
511 | }
512 | },
513 | "node_modules/fresh": {
514 | "version": "0.5.2",
515 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
516 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
517 | "license": "MIT",
518 | "engines": {
519 | "node": ">= 0.6"
520 | }
521 | },
522 | "node_modules/fsevents": {
523 | "version": "2.3.3",
524 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
525 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
526 | "hasInstallScript": true,
527 | "license": "MIT",
528 | "optional": true,
529 | "os": [
530 | "darwin"
531 | ],
532 | "engines": {
533 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
534 | }
535 | },
536 | "node_modules/function-bind": {
537 | "version": "1.1.2",
538 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
539 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
540 | "license": "MIT",
541 | "funding": {
542 | "url": "https://github.com/sponsors/ljharb"
543 | }
544 | },
545 | "node_modules/get-intrinsic": {
546 | "version": "1.2.4",
547 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
548 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
549 | "license": "MIT",
550 | "dependencies": {
551 | "es-errors": "^1.3.0",
552 | "function-bind": "^1.1.2",
553 | "has-proto": "^1.0.1",
554 | "has-symbols": "^1.0.3",
555 | "hasown": "^2.0.0"
556 | },
557 | "engines": {
558 | "node": ">= 0.4"
559 | },
560 | "funding": {
561 | "url": "https://github.com/sponsors/ljharb"
562 | }
563 | },
564 | "node_modules/glob-parent": {
565 | "version": "5.1.2",
566 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
567 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
568 | "license": "ISC",
569 | "dependencies": {
570 | "is-glob": "^4.0.1"
571 | },
572 | "engines": {
573 | "node": ">= 6"
574 | }
575 | },
576 | "node_modules/gopd": {
577 | "version": "1.0.1",
578 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
579 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
580 | "license": "MIT",
581 | "dependencies": {
582 | "get-intrinsic": "^1.1.3"
583 | },
584 | "funding": {
585 | "url": "https://github.com/sponsors/ljharb"
586 | }
587 | },
588 | "node_modules/has-flag": {
589 | "version": "3.0.0",
590 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
591 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
592 | "license": "MIT",
593 | "engines": {
594 | "node": ">=4"
595 | }
596 | },
597 | "node_modules/has-property-descriptors": {
598 | "version": "1.0.2",
599 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
600 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
601 | "license": "MIT",
602 | "dependencies": {
603 | "es-define-property": "^1.0.0"
604 | },
605 | "funding": {
606 | "url": "https://github.com/sponsors/ljharb"
607 | }
608 | },
609 | "node_modules/has-proto": {
610 | "version": "1.0.3",
611 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
612 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
613 | "license": "MIT",
614 | "engines": {
615 | "node": ">= 0.4"
616 | },
617 | "funding": {
618 | "url": "https://github.com/sponsors/ljharb"
619 | }
620 | },
621 | "node_modules/has-symbols": {
622 | "version": "1.0.3",
623 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
624 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
625 | "license": "MIT",
626 | "engines": {
627 | "node": ">= 0.4"
628 | },
629 | "funding": {
630 | "url": "https://github.com/sponsors/ljharb"
631 | }
632 | },
633 | "node_modules/hasown": {
634 | "version": "2.0.2",
635 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
636 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
637 | "license": "MIT",
638 | "dependencies": {
639 | "function-bind": "^1.1.2"
640 | },
641 | "engines": {
642 | "node": ">= 0.4"
643 | }
644 | },
645 | "node_modules/http-errors": {
646 | "version": "2.0.0",
647 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
648 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
649 | "license": "MIT",
650 | "dependencies": {
651 | "depd": "2.0.0",
652 | "inherits": "2.0.4",
653 | "setprototypeof": "1.2.0",
654 | "statuses": "2.0.1",
655 | "toidentifier": "1.0.1"
656 | },
657 | "engines": {
658 | "node": ">= 0.8"
659 | }
660 | },
661 | "node_modules/iconv-lite": {
662 | "version": "0.4.24",
663 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
664 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
665 | "license": "MIT",
666 | "dependencies": {
667 | "safer-buffer": ">= 2.1.2 < 3"
668 | },
669 | "engines": {
670 | "node": ">=0.10.0"
671 | }
672 | },
673 | "node_modules/ignore-by-default": {
674 | "version": "1.0.1",
675 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
676 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
677 | "license": "ISC"
678 | },
679 | "node_modules/inherits": {
680 | "version": "2.0.4",
681 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
682 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
683 | "license": "ISC"
684 | },
685 | "node_modules/ipaddr.js": {
686 | "version": "1.9.1",
687 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
688 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
689 | "license": "MIT",
690 | "engines": {
691 | "node": ">= 0.10"
692 | }
693 | },
694 | "node_modules/is-binary-path": {
695 | "version": "2.1.0",
696 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
697 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
698 | "license": "MIT",
699 | "dependencies": {
700 | "binary-extensions": "^2.0.0"
701 | },
702 | "engines": {
703 | "node": ">=8"
704 | }
705 | },
706 | "node_modules/is-extglob": {
707 | "version": "2.1.1",
708 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
709 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
710 | "license": "MIT",
711 | "engines": {
712 | "node": ">=0.10.0"
713 | }
714 | },
715 | "node_modules/is-glob": {
716 | "version": "4.0.3",
717 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
718 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
719 | "license": "MIT",
720 | "dependencies": {
721 | "is-extglob": "^2.1.1"
722 | },
723 | "engines": {
724 | "node": ">=0.10.0"
725 | }
726 | },
727 | "node_modules/is-number": {
728 | "version": "7.0.0",
729 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
730 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
731 | "license": "MIT",
732 | "engines": {
733 | "node": ">=0.12.0"
734 | }
735 | },
736 | "node_modules/isarray": {
737 | "version": "1.0.0",
738 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
739 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
740 | "license": "MIT"
741 | },
742 | "node_modules/kareem": {
743 | "version": "2.6.3",
744 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
745 | "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
746 | "license": "Apache-2.0",
747 | "engines": {
748 | "node": ">=12.0.0"
749 | }
750 | },
751 | "node_modules/media-typer": {
752 | "version": "0.3.0",
753 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
754 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
755 | "license": "MIT",
756 | "engines": {
757 | "node": ">= 0.6"
758 | }
759 | },
760 | "node_modules/memory-pager": {
761 | "version": "1.5.0",
762 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
763 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
764 | "license": "MIT"
765 | },
766 | "node_modules/merge-descriptors": {
767 | "version": "1.0.3",
768 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
769 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
770 | "license": "MIT",
771 | "funding": {
772 | "url": "https://github.com/sponsors/sindresorhus"
773 | }
774 | },
775 | "node_modules/methods": {
776 | "version": "1.1.2",
777 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
778 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
779 | "license": "MIT",
780 | "engines": {
781 | "node": ">= 0.6"
782 | }
783 | },
784 | "node_modules/mime": {
785 | "version": "1.6.0",
786 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
787 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
788 | "license": "MIT",
789 | "bin": {
790 | "mime": "cli.js"
791 | },
792 | "engines": {
793 | "node": ">=4"
794 | }
795 | },
796 | "node_modules/mime-db": {
797 | "version": "1.52.0",
798 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
799 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
800 | "license": "MIT",
801 | "engines": {
802 | "node": ">= 0.6"
803 | }
804 | },
805 | "node_modules/mime-types": {
806 | "version": "2.1.35",
807 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
808 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
809 | "license": "MIT",
810 | "dependencies": {
811 | "mime-db": "1.52.0"
812 | },
813 | "engines": {
814 | "node": ">= 0.6"
815 | }
816 | },
817 | "node_modules/minimatch": {
818 | "version": "3.1.2",
819 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
820 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
821 | "license": "ISC",
822 | "dependencies": {
823 | "brace-expansion": "^1.1.7"
824 | },
825 | "engines": {
826 | "node": "*"
827 | }
828 | },
829 | "node_modules/minimist": {
830 | "version": "1.2.8",
831 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
832 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
833 | "license": "MIT",
834 | "funding": {
835 | "url": "https://github.com/sponsors/ljharb"
836 | }
837 | },
838 | "node_modules/mkdirp": {
839 | "version": "0.5.6",
840 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
841 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
842 | "license": "MIT",
843 | "dependencies": {
844 | "minimist": "^1.2.6"
845 | },
846 | "bin": {
847 | "mkdirp": "bin/cmd.js"
848 | }
849 | },
850 | "node_modules/mongodb": {
851 | "version": "6.8.0",
852 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.8.0.tgz",
853 | "integrity": "sha512-HGQ9NWDle5WvwMnrvUxsFYPd3JEbqD3RgABHBQRuoCEND0qzhsd0iH5ypHsf1eJ+sXmvmyKpP+FLOKY8Il7jMw==",
854 | "license": "Apache-2.0",
855 | "dependencies": {
856 | "@mongodb-js/saslprep": "^1.1.5",
857 | "bson": "^6.7.0",
858 | "mongodb-connection-string-url": "^3.0.0"
859 | },
860 | "engines": {
861 | "node": ">=16.20.1"
862 | },
863 | "peerDependencies": {
864 | "@aws-sdk/credential-providers": "^3.188.0",
865 | "@mongodb-js/zstd": "^1.1.0",
866 | "gcp-metadata": "^5.2.0",
867 | "kerberos": "^2.0.1",
868 | "mongodb-client-encryption": ">=6.0.0 <7",
869 | "snappy": "^7.2.2",
870 | "socks": "^2.7.1"
871 | },
872 | "peerDependenciesMeta": {
873 | "@aws-sdk/credential-providers": {
874 | "optional": true
875 | },
876 | "@mongodb-js/zstd": {
877 | "optional": true
878 | },
879 | "gcp-metadata": {
880 | "optional": true
881 | },
882 | "kerberos": {
883 | "optional": true
884 | },
885 | "mongodb-client-encryption": {
886 | "optional": true
887 | },
888 | "snappy": {
889 | "optional": true
890 | },
891 | "socks": {
892 | "optional": true
893 | }
894 | }
895 | },
896 | "node_modules/mongodb-connection-string-url": {
897 | "version": "3.0.1",
898 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
899 | "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
900 | "license": "Apache-2.0",
901 | "dependencies": {
902 | "@types/whatwg-url": "^11.0.2",
903 | "whatwg-url": "^13.0.0"
904 | }
905 | },
906 | "node_modules/mongoose": {
907 | "version": "8.6.3",
908 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.6.3.tgz",
909 | "integrity": "sha512-++yRmm7hjMbqVA/8WeiygTnEfrFbiy+OBjQi49GFJIvCQuSYE56myyQWo4j5hbpcHjhHQU8NukMNGTwAWFWjIw==",
910 | "license": "MIT",
911 | "dependencies": {
912 | "bson": "^6.7.0",
913 | "kareem": "2.6.3",
914 | "mongodb": "6.8.0",
915 | "mpath": "0.9.0",
916 | "mquery": "5.0.0",
917 | "ms": "2.1.3",
918 | "sift": "17.1.3"
919 | },
920 | "engines": {
921 | "node": ">=16.20.1"
922 | },
923 | "funding": {
924 | "type": "opencollective",
925 | "url": "https://opencollective.com/mongoose"
926 | }
927 | },
928 | "node_modules/mongoose/node_modules/ms": {
929 | "version": "2.1.3",
930 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
931 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
932 | "license": "MIT"
933 | },
934 | "node_modules/mpath": {
935 | "version": "0.9.0",
936 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
937 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
938 | "license": "MIT",
939 | "engines": {
940 | "node": ">=4.0.0"
941 | }
942 | },
943 | "node_modules/mquery": {
944 | "version": "5.0.0",
945 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
946 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
947 | "license": "MIT",
948 | "dependencies": {
949 | "debug": "4.x"
950 | },
951 | "engines": {
952 | "node": ">=14.0.0"
953 | }
954 | },
955 | "node_modules/mquery/node_modules/debug": {
956 | "version": "4.3.7",
957 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
958 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
959 | "license": "MIT",
960 | "dependencies": {
961 | "ms": "^2.1.3"
962 | },
963 | "engines": {
964 | "node": ">=6.0"
965 | },
966 | "peerDependenciesMeta": {
967 | "supports-color": {
968 | "optional": true
969 | }
970 | }
971 | },
972 | "node_modules/mquery/node_modules/ms": {
973 | "version": "2.1.3",
974 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
975 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
976 | "license": "MIT"
977 | },
978 | "node_modules/ms": {
979 | "version": "2.0.0",
980 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
981 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
982 | "license": "MIT"
983 | },
984 | "node_modules/multer": {
985 | "version": "1.4.5-lts.1",
986 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
987 | "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
988 | "license": "MIT",
989 | "dependencies": {
990 | "append-field": "^1.0.0",
991 | "busboy": "^1.0.0",
992 | "concat-stream": "^1.5.2",
993 | "mkdirp": "^0.5.4",
994 | "object-assign": "^4.1.1",
995 | "type-is": "^1.6.4",
996 | "xtend": "^4.0.0"
997 | },
998 | "engines": {
999 | "node": ">= 6.0.0"
1000 | }
1001 | },
1002 | "node_modules/negotiator": {
1003 | "version": "0.6.3",
1004 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1005 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1006 | "license": "MIT",
1007 | "engines": {
1008 | "node": ">= 0.6"
1009 | }
1010 | },
1011 | "node_modules/nodemon": {
1012 | "version": "3.1.6",
1013 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.6.tgz",
1014 | "integrity": "sha512-C8ymJbXpTTinxjWuMfMxw0rZhTn/r7ypSGldQyqPEgDEaVwAthqC0aodsMwontnAInN9TuPwRLeBoyhmfv+iSA==",
1015 | "license": "MIT",
1016 | "dependencies": {
1017 | "chokidar": "^3.5.2",
1018 | "debug": "^4",
1019 | "ignore-by-default": "^1.0.1",
1020 | "minimatch": "^3.1.2",
1021 | "pstree.remy": "^1.1.8",
1022 | "semver": "^7.5.3",
1023 | "simple-update-notifier": "^2.0.0",
1024 | "supports-color": "^5.5.0",
1025 | "touch": "^3.1.0",
1026 | "undefsafe": "^2.0.5"
1027 | },
1028 | "bin": {
1029 | "nodemon": "bin/nodemon.js"
1030 | },
1031 | "engines": {
1032 | "node": ">=10"
1033 | },
1034 | "funding": {
1035 | "type": "opencollective",
1036 | "url": "https://opencollective.com/nodemon"
1037 | }
1038 | },
1039 | "node_modules/nodemon/node_modules/debug": {
1040 | "version": "4.3.7",
1041 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
1042 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
1043 | "license": "MIT",
1044 | "dependencies": {
1045 | "ms": "^2.1.3"
1046 | },
1047 | "engines": {
1048 | "node": ">=6.0"
1049 | },
1050 | "peerDependenciesMeta": {
1051 | "supports-color": {
1052 | "optional": true
1053 | }
1054 | }
1055 | },
1056 | "node_modules/nodemon/node_modules/ms": {
1057 | "version": "2.1.3",
1058 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1059 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1060 | "license": "MIT"
1061 | },
1062 | "node_modules/normalize-path": {
1063 | "version": "3.0.0",
1064 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1065 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1066 | "license": "MIT",
1067 | "engines": {
1068 | "node": ">=0.10.0"
1069 | }
1070 | },
1071 | "node_modules/object-assign": {
1072 | "version": "4.1.1",
1073 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1074 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1075 | "license": "MIT",
1076 | "engines": {
1077 | "node": ">=0.10.0"
1078 | }
1079 | },
1080 | "node_modules/object-inspect": {
1081 | "version": "1.13.2",
1082 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
1083 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
1084 | "license": "MIT",
1085 | "engines": {
1086 | "node": ">= 0.4"
1087 | },
1088 | "funding": {
1089 | "url": "https://github.com/sponsors/ljharb"
1090 | }
1091 | },
1092 | "node_modules/on-finished": {
1093 | "version": "2.4.1",
1094 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1095 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1096 | "license": "MIT",
1097 | "dependencies": {
1098 | "ee-first": "1.1.1"
1099 | },
1100 | "engines": {
1101 | "node": ">= 0.8"
1102 | }
1103 | },
1104 | "node_modules/parseurl": {
1105 | "version": "1.3.3",
1106 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1107 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1108 | "license": "MIT",
1109 | "engines": {
1110 | "node": ">= 0.8"
1111 | }
1112 | },
1113 | "node_modules/path-to-regexp": {
1114 | "version": "0.1.10",
1115 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
1116 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
1117 | "license": "MIT"
1118 | },
1119 | "node_modules/picomatch": {
1120 | "version": "2.3.1",
1121 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1122 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1123 | "license": "MIT",
1124 | "engines": {
1125 | "node": ">=8.6"
1126 | },
1127 | "funding": {
1128 | "url": "https://github.com/sponsors/jonschlinkert"
1129 | }
1130 | },
1131 | "node_modules/process-nextick-args": {
1132 | "version": "2.0.1",
1133 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1134 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1135 | "license": "MIT"
1136 | },
1137 | "node_modules/proxy-addr": {
1138 | "version": "2.0.7",
1139 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1140 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1141 | "license": "MIT",
1142 | "dependencies": {
1143 | "forwarded": "0.2.0",
1144 | "ipaddr.js": "1.9.1"
1145 | },
1146 | "engines": {
1147 | "node": ">= 0.10"
1148 | }
1149 | },
1150 | "node_modules/pstree.remy": {
1151 | "version": "1.1.8",
1152 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1153 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1154 | "license": "MIT"
1155 | },
1156 | "node_modules/punycode": {
1157 | "version": "2.3.1",
1158 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1159 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1160 | "license": "MIT",
1161 | "engines": {
1162 | "node": ">=6"
1163 | }
1164 | },
1165 | "node_modules/qs": {
1166 | "version": "6.13.0",
1167 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1168 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1169 | "license": "BSD-3-Clause",
1170 | "dependencies": {
1171 | "side-channel": "^1.0.6"
1172 | },
1173 | "engines": {
1174 | "node": ">=0.6"
1175 | },
1176 | "funding": {
1177 | "url": "https://github.com/sponsors/ljharb"
1178 | }
1179 | },
1180 | "node_modules/range-parser": {
1181 | "version": "1.2.1",
1182 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1183 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1184 | "license": "MIT",
1185 | "engines": {
1186 | "node": ">= 0.6"
1187 | }
1188 | },
1189 | "node_modules/raw-body": {
1190 | "version": "2.5.2",
1191 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1192 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1193 | "license": "MIT",
1194 | "dependencies": {
1195 | "bytes": "3.1.2",
1196 | "http-errors": "2.0.0",
1197 | "iconv-lite": "0.4.24",
1198 | "unpipe": "1.0.0"
1199 | },
1200 | "engines": {
1201 | "node": ">= 0.8"
1202 | }
1203 | },
1204 | "node_modules/readable-stream": {
1205 | "version": "2.3.8",
1206 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
1207 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
1208 | "license": "MIT",
1209 | "dependencies": {
1210 | "core-util-is": "~1.0.0",
1211 | "inherits": "~2.0.3",
1212 | "isarray": "~1.0.0",
1213 | "process-nextick-args": "~2.0.0",
1214 | "safe-buffer": "~5.1.1",
1215 | "string_decoder": "~1.1.1",
1216 | "util-deprecate": "~1.0.1"
1217 | }
1218 | },
1219 | "node_modules/readable-stream/node_modules/safe-buffer": {
1220 | "version": "5.1.2",
1221 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1222 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1223 | "license": "MIT"
1224 | },
1225 | "node_modules/readdirp": {
1226 | "version": "3.6.0",
1227 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1228 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1229 | "license": "MIT",
1230 | "dependencies": {
1231 | "picomatch": "^2.2.1"
1232 | },
1233 | "engines": {
1234 | "node": ">=8.10.0"
1235 | }
1236 | },
1237 | "node_modules/safe-buffer": {
1238 | "version": "5.2.1",
1239 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1240 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1241 | "funding": [
1242 | {
1243 | "type": "github",
1244 | "url": "https://github.com/sponsors/feross"
1245 | },
1246 | {
1247 | "type": "patreon",
1248 | "url": "https://www.patreon.com/feross"
1249 | },
1250 | {
1251 | "type": "consulting",
1252 | "url": "https://feross.org/support"
1253 | }
1254 | ],
1255 | "license": "MIT"
1256 | },
1257 | "node_modules/safer-buffer": {
1258 | "version": "2.1.2",
1259 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1260 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1261 | "license": "MIT"
1262 | },
1263 | "node_modules/semver": {
1264 | "version": "7.6.3",
1265 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
1266 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
1267 | "license": "ISC",
1268 | "bin": {
1269 | "semver": "bin/semver.js"
1270 | },
1271 | "engines": {
1272 | "node": ">=10"
1273 | }
1274 | },
1275 | "node_modules/send": {
1276 | "version": "0.19.0",
1277 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1278 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1279 | "license": "MIT",
1280 | "dependencies": {
1281 | "debug": "2.6.9",
1282 | "depd": "2.0.0",
1283 | "destroy": "1.2.0",
1284 | "encodeurl": "~1.0.2",
1285 | "escape-html": "~1.0.3",
1286 | "etag": "~1.8.1",
1287 | "fresh": "0.5.2",
1288 | "http-errors": "2.0.0",
1289 | "mime": "1.6.0",
1290 | "ms": "2.1.3",
1291 | "on-finished": "2.4.1",
1292 | "range-parser": "~1.2.1",
1293 | "statuses": "2.0.1"
1294 | },
1295 | "engines": {
1296 | "node": ">= 0.8.0"
1297 | }
1298 | },
1299 | "node_modules/send/node_modules/encodeurl": {
1300 | "version": "1.0.2",
1301 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1302 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1303 | "license": "MIT",
1304 | "engines": {
1305 | "node": ">= 0.8"
1306 | }
1307 | },
1308 | "node_modules/send/node_modules/ms": {
1309 | "version": "2.1.3",
1310 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1311 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1312 | "license": "MIT"
1313 | },
1314 | "node_modules/serve-static": {
1315 | "version": "1.16.2",
1316 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1317 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1318 | "license": "MIT",
1319 | "dependencies": {
1320 | "encodeurl": "~2.0.0",
1321 | "escape-html": "~1.0.3",
1322 | "parseurl": "~1.3.3",
1323 | "send": "0.19.0"
1324 | },
1325 | "engines": {
1326 | "node": ">= 0.8.0"
1327 | }
1328 | },
1329 | "node_modules/set-function-length": {
1330 | "version": "1.2.2",
1331 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1332 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1333 | "license": "MIT",
1334 | "dependencies": {
1335 | "define-data-property": "^1.1.4",
1336 | "es-errors": "^1.3.0",
1337 | "function-bind": "^1.1.2",
1338 | "get-intrinsic": "^1.2.4",
1339 | "gopd": "^1.0.1",
1340 | "has-property-descriptors": "^1.0.2"
1341 | },
1342 | "engines": {
1343 | "node": ">= 0.4"
1344 | }
1345 | },
1346 | "node_modules/setprototypeof": {
1347 | "version": "1.2.0",
1348 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1349 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1350 | "license": "ISC"
1351 | },
1352 | "node_modules/side-channel": {
1353 | "version": "1.0.6",
1354 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1355 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1356 | "license": "MIT",
1357 | "dependencies": {
1358 | "call-bind": "^1.0.7",
1359 | "es-errors": "^1.3.0",
1360 | "get-intrinsic": "^1.2.4",
1361 | "object-inspect": "^1.13.1"
1362 | },
1363 | "engines": {
1364 | "node": ">= 0.4"
1365 | },
1366 | "funding": {
1367 | "url": "https://github.com/sponsors/ljharb"
1368 | }
1369 | },
1370 | "node_modules/sift": {
1371 | "version": "17.1.3",
1372 | "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
1373 | "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
1374 | "license": "MIT"
1375 | },
1376 | "node_modules/simple-update-notifier": {
1377 | "version": "2.0.0",
1378 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1379 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1380 | "license": "MIT",
1381 | "dependencies": {
1382 | "semver": "^7.5.3"
1383 | },
1384 | "engines": {
1385 | "node": ">=10"
1386 | }
1387 | },
1388 | "node_modules/sparse-bitfield": {
1389 | "version": "3.0.3",
1390 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1391 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1392 | "license": "MIT",
1393 | "dependencies": {
1394 | "memory-pager": "^1.0.2"
1395 | }
1396 | },
1397 | "node_modules/statuses": {
1398 | "version": "2.0.1",
1399 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1400 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1401 | "license": "MIT",
1402 | "engines": {
1403 | "node": ">= 0.8"
1404 | }
1405 | },
1406 | "node_modules/streamsearch": {
1407 | "version": "1.1.0",
1408 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
1409 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
1410 | "engines": {
1411 | "node": ">=10.0.0"
1412 | }
1413 | },
1414 | "node_modules/string_decoder": {
1415 | "version": "1.1.1",
1416 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1417 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1418 | "license": "MIT",
1419 | "dependencies": {
1420 | "safe-buffer": "~5.1.0"
1421 | }
1422 | },
1423 | "node_modules/string_decoder/node_modules/safe-buffer": {
1424 | "version": "5.1.2",
1425 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1426 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1427 | "license": "MIT"
1428 | },
1429 | "node_modules/supports-color": {
1430 | "version": "5.5.0",
1431 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1432 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1433 | "license": "MIT",
1434 | "dependencies": {
1435 | "has-flag": "^3.0.0"
1436 | },
1437 | "engines": {
1438 | "node": ">=4"
1439 | }
1440 | },
1441 | "node_modules/to-regex-range": {
1442 | "version": "5.0.1",
1443 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1444 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1445 | "license": "MIT",
1446 | "dependencies": {
1447 | "is-number": "^7.0.0"
1448 | },
1449 | "engines": {
1450 | "node": ">=8.0"
1451 | }
1452 | },
1453 | "node_modules/toidentifier": {
1454 | "version": "1.0.1",
1455 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1456 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1457 | "license": "MIT",
1458 | "engines": {
1459 | "node": ">=0.6"
1460 | }
1461 | },
1462 | "node_modules/touch": {
1463 | "version": "3.1.1",
1464 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
1465 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
1466 | "license": "ISC",
1467 | "bin": {
1468 | "nodetouch": "bin/nodetouch.js"
1469 | }
1470 | },
1471 | "node_modules/tr46": {
1472 | "version": "4.1.1",
1473 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
1474 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
1475 | "license": "MIT",
1476 | "dependencies": {
1477 | "punycode": "^2.3.0"
1478 | },
1479 | "engines": {
1480 | "node": ">=14"
1481 | }
1482 | },
1483 | "node_modules/type-is": {
1484 | "version": "1.6.18",
1485 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1486 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1487 | "license": "MIT",
1488 | "dependencies": {
1489 | "media-typer": "0.3.0",
1490 | "mime-types": "~2.1.24"
1491 | },
1492 | "engines": {
1493 | "node": ">= 0.6"
1494 | }
1495 | },
1496 | "node_modules/typedarray": {
1497 | "version": "0.0.6",
1498 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1499 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1500 | "license": "MIT"
1501 | },
1502 | "node_modules/undefsafe": {
1503 | "version": "2.0.5",
1504 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1505 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1506 | "license": "MIT"
1507 | },
1508 | "node_modules/unpipe": {
1509 | "version": "1.0.0",
1510 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1511 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1512 | "license": "MIT",
1513 | "engines": {
1514 | "node": ">= 0.8"
1515 | }
1516 | },
1517 | "node_modules/util-deprecate": {
1518 | "version": "1.0.2",
1519 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1520 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1521 | "license": "MIT"
1522 | },
1523 | "node_modules/utils-merge": {
1524 | "version": "1.0.1",
1525 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1526 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1527 | "license": "MIT",
1528 | "engines": {
1529 | "node": ">= 0.4.0"
1530 | }
1531 | },
1532 | "node_modules/vary": {
1533 | "version": "1.1.2",
1534 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1535 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1536 | "license": "MIT",
1537 | "engines": {
1538 | "node": ">= 0.8"
1539 | }
1540 | },
1541 | "node_modules/webidl-conversions": {
1542 | "version": "7.0.0",
1543 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1544 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1545 | "license": "BSD-2-Clause",
1546 | "engines": {
1547 | "node": ">=12"
1548 | }
1549 | },
1550 | "node_modules/whatwg-url": {
1551 | "version": "13.0.0",
1552 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
1553 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
1554 | "license": "MIT",
1555 | "dependencies": {
1556 | "tr46": "^4.1.1",
1557 | "webidl-conversions": "^7.0.0"
1558 | },
1559 | "engines": {
1560 | "node": ">=16"
1561 | }
1562 | },
1563 | "node_modules/xtend": {
1564 | "version": "4.0.2",
1565 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1566 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1567 | "license": "MIT",
1568 | "engines": {
1569 | "node": ">=0.4"
1570 | }
1571 | }
1572 | }
1573 | }
1574 |
--------------------------------------------------------------------------------