├── .env
├── Containerize.gif
├── Containerize.webp
├── README.md
├── client
├── .dockerignore
├── .env
├── .gitignore
├── Dockerfile
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ ├── photo1.jpg
│ └── robots.txt
└── src
│ ├── App.js
│ ├── components
│ └── Navbar.js
│ ├── index.css
│ ├── index.js
│ └── pages
│ ├── AddUser.js
│ ├── EditUser.js
│ └── Home.js
├── docker-compose.yml
└── server
├── .dockerignore
├── .env
├── .gitignore
├── Dockerfile
├── index.js
├── model
└── user.js
├── package-lock.json
├── package.json
├── routes
└── user.js
└── utils
├── cloudinary.js
└── multer.js
/.env:
--------------------------------------------------------------------------------
1 | MONGODB_USER = 'biswajit'
2 | MONGODB_PASSWORD = 12345678
3 | MONGODB_DATABASE = 'testdb'
4 | MONGODB_DOCKER_PORT = 27017
5 |
6 |
--------------------------------------------------------------------------------
/Containerize.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/Containerize.gif
--------------------------------------------------------------------------------
/Containerize.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/Containerize.webp
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Containerize Your Full Stack Web Application (MERN) with Docker Compose
2 |
3 | Welcome to our comprehensive guide on Containerizing a full stack Web MERN (MongoDB, Express.js, React, Node.js) application using Docker Compose involves creating separate containers for each component of the application & defining their configurations in a docker-compose.yml file.
4 |
5 | By integrating Grafana for dashboards, Loki for log aggregation, and Prometheus for metrics collection, this setup with advanced alerting, receive timely notifications based on custom thresholds.
6 |
7 | # Diagram
8 | [](https://github.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose "Containerize Your Full Stack Web Application (MERN) with Docker Compose")
9 |
10 | # Demo
11 | [](https://github.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose "Containerize Your Full Stack Web Application (MERN) with Docker Compose")
12 |
13 |
14 | ## For more Details
15 |
16 | ### Containerize Your Full Stack Web Application (MERN) with Docker Compose
17 | https://medium.com/@bjnandi/containerize-your-full-stack-web-application-mern-with-docker-compose-4900156ba9dd
18 |
19 |
20 | ### 📣 Follow & Show Your Support ⭐️
21 |
22 | If you found this project helpful, please give it a star! ⭐️ It helps others discover the project and motivates us to continue improving it.
23 |
24 | Stay updated with my latest projects and articles:
25 |
26 | - **GitHub**: Follow me on [GitHub](https://github.com/bjnandi) to see my latest repositories and contributions.
27 | [](https://github.com/bjnandi)
28 |
29 | - **Medium**: Follow me on [Medium](https://medium.com/@bjnandi) to read my latest articles and insights.
30 | 
31 |
32 |
33 | Thank you for your support and interest in my work!
34 | Happy coding! 💻✨
35 |
36 |
37 | **🙏 Special Thanks:** A huge thank you to [@doubtcrack](https://github.com/doubtcrack) for amazing MERN Stack base [Cloudinary-CRUD-Operations](https://github.com/doubtcrack/Cloudinary-CRUD-Operations) projects!
38 |
39 |
40 |
41 | ## Cloudinary CRUD Operations MERN Stack Application
42 |
43 | 
44 |
45 | ## Table of Contents
46 |
47 | - [Project Description](#dproject-description)
48 | - [Key Features](#key-features)
49 | - [Why I Chose This Project](#why-i-chose-this-project)
50 | - [Tech Stack Used](#tech-stack-used)
51 | - [Challenges Faced](#challenges-faced)
52 | - [User Interface (UI)](#user-interface-ui)
53 | - [Read Project Article](#learn-more-about-this-project)
54 | - [Demo Link](#demo-link)
55 | - [API Endpoints](#api-endpoints)
56 | - [Setup Guide](#setup-guide)
57 |
58 | ## Project Description
59 |
60 | The Cloudinary CRUD operations MERN stack application is a web project designed for efficient image management. It allows users to perform CRUD operations (Create, Read, Update, Delete) on images using the MERN (MongoDB, Express.js, React.js, Node.js) stack. The application leverages Cloudinary, a cloud-based image management platform, for secure and streamlined image handling.
61 |
62 | ### Key Features
63 |
64 | - CRUD operations for images
65 | - MERN stack development
66 | - Cloudinary integration for image management
67 | - User-friendly interface built with React.js
68 | - Efficient image storage and retrieval with MongoDB
69 | - Streamlined image handling for web applications
70 |
71 | ## Why I chose this Project
72 |
73 | I decided to work on the Cloudinary CRUD operations MERN stack application for several reasons. Firstly, it provided a hands-on opportunity to understand the practical aspects of image management in web applications. This project allowed me to enhance my skills in creating, updating, and deleting images—essential skills for a developer.
74 |
75 | Additionally, the project aligns with industry trends by utilizing the MERN stack, a versatile and popular technology combination. Exploring this stack provided me with proficiency in a holistic development approach, covering both frontend and backend aspects.
76 |
77 | Moreover, the integration of Cloudinary into the project allowed me to work with a powerful cloud-based image management solution. This enhanced my understanding of how cloud-based services can elevate application functionalities.
78 |
79 | In essence, I chose the Cloudinary CRUD operations MERN stack project to gain practical experience in handling images within web applications, explore the MERN stack, and work with a prominent cloud-based image management solution like Cloudinary.
80 |
81 | ### Tech Stack Used
82 |
83 | - MongoDB
84 | - Express.js
85 | - React.js
86 | - Node.js
87 | - Cloudinary
88 |
89 | ## Challenges Faced
90 |
91 | During the development of the Cloudinary CRUD operations MERN stack application, a significant challenge was seamlessly integrating with Cloudinary for image management. This involved ensuring secure image uploads, tracking changes made to images, and efficiently managing resources.
92 |
93 | Securely handling image uploads and accommodating various image formats and sizes added complexity. Additionally, accurately reflecting modifications or deletions to images in the Cloudinary database required meticulous attention to detail.
94 |
95 | The challenge extended beyond technical aspects to considerations for user experience. Striking the right balance between functionality, security, and user-friendliness was crucial in overcoming this challenge and delivering a reliable image management system.
96 |
97 | ## User Interface (UI)
98 |
99 | ### Home Page
100 |
101 | 
102 |
103 | ### Edit Page
104 |
105 | 
106 |
107 | ### Add Page
108 |
109 | 
110 |
111 | ## Learn More About this Project
112 |
113 | You can find the full article for this project [here](https://tksuryavanshi.blogspot.com/2023/10/cloudinary-crud-operations-mern-stack.html).
114 |
115 | ## Demo Link
116 |
117 | Check out the live version preview of this project [here](https://cloudinary-crud-operations.vercel.app/).
118 |
119 | ## API Endpoints
120 |
121 | ### User
122 |
123 | - **POST** `/user`: Create a new user
124 | - **GET** `/user`: Get all users
125 | - **GET** `/user/{id}`: Get a user by ID
126 | - **PUT** `/user/{id}`: Update a user by ID
127 | - **DELETE** `/user/{id}`: Delete a user by ID
128 |
129 | ## Setup Guide
130 |
131 | Follow these steps to set up and run the Cloudinary CRUD operations MERN stack application locally:
132 |
133 | 1. **Clone the Repository:**
134 |
135 | ```bash
136 | git clone https://github.com/doubtcrack/Cloudinary-CRUD-Operations.git
137 | cd Cloudinary-CRUD-Operations
138 |
139 | ```
140 |
141 | 2. **Installing Dependencies:**
142 | ```bash
143 | cd client
144 | npm install
145 | cd ../server
146 | npm install
147 | ```
148 | 3. **Setting Up `.env` Credentials**
149 |
150 | To enable seamless image management functionalities, you'll need Cloudinary API credentials, and for saving those images location and other data you will need mongodb url.
151 |
152 | Follow these steps:
153 |
154 | 1. Obtain Cloudinary API & MongoDB credentials.
155 | 2. Create a `.env` file in the `server` directory.
156 | 3. Add your credentials to the `.env` file:
157 |
158 | ```env
159 | CLOUDINARY_CLOUD_NAME=your-cloud-name
160 | CLOUDINARY_API_KEY=your-api-key
161 | CLOUDINARY_API_SECRET=your-api-secret
162 | MONGO_URI=your-mongodb-uri
163 | ```
164 |
165 | Create a `.env` file in your client directory and provide your live server URL
166 |
167 | REACT_APP_SERVER_URL= your-server-url
168 |
169 | 4. **Starting the Server**
170 |
171 | Start the server by running the following command in the server directory:
172 |
173 | ```
174 | cd server
175 | npm start
176 | ```
177 |
178 | 5. **Starting the Client**
179 |
180 | Begin the client application with the following command in the client directory:
181 |
182 | ```
183 | cd client
184 | npm start
185 | ```
186 |
187 | 6. **Accessing the Application**
188 |
189 | You're all set! Open your browser and go to http://localhost:3000 to access the Cloudinary CRUD operations application.
190 |
191 | ## Contribute and Support ❤️
192 |
193 | If you find this project useful and would like to contribute or show your support, we welcome your involvement. Feel free to submit pull requests, report issues, or share your feedback. Your contributions make this project even better!
194 |
195 | Also, don't forget to give a star ⭐ to this repo
196 |
--------------------------------------------------------------------------------
/client/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | build
--------------------------------------------------------------------------------
/client/.env:
--------------------------------------------------------------------------------
1 | REACT_APP_SERVER_URL = http://localhost:5000
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/client/Dockerfile:
--------------------------------------------------------------------------------
1 | # Stage-1 & spacify a name 'builder'
2 | FROM node:latest AS builder
3 |
4 | # Create a directory and go to directory
5 | WORKDIR /app
6 |
7 | # Copy the package.json file to my current directory for install necessary dependence
8 | COPY package.json .
9 |
10 | # Install the dependence
11 | RUN npm install
12 |
13 | # Copy other file to my current directory
14 | COPY . .
15 |
16 | # Build optimise static file
17 | RUN npm run build
18 |
19 | # Stage-2
20 | FROM nginx:1.25.2-alpine-slim
21 |
22 | # Copy static file to my nignx folder for serve static contain
23 | COPY --from=builder /app/build /usr/share/nginx/html
24 |
25 | # Open the port for react
26 | EXPOSE 80
27 |
28 | # Run nginx in foreground
29 | CMD ["nginx", "-g", "daemon off;"]
30 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.11.4",
7 | "@testing-library/react": "^11.1.0",
8 | "@testing-library/user-event": "^12.1.10",
9 | "react": "^18.2.0",
10 | "react-dom": "^18.2.0",
11 | "react-router-dom": "^6.16.0",
12 | "react-scripts": "^5.0.1",
13 | "web-vitals": "^1.0.1"
14 | },
15 | "scripts": {
16 | "start": "react-scripts start",
17 | "build": "react-scripts build",
18 | "test": "react-scripts test",
19 | "eject": "react-scripts eject"
20 | },
21 | "eslintConfig": {
22 | "extends": [
23 | "react-app",
24 | "react-app/jest"
25 | ]
26 | },
27 | "browserslist": {
28 | "production": [
29 | ">0.2%",
30 | "not dead",
31 | "not op_mini all"
32 | ],
33 | "development": [
34 | "last 1 chrome version",
35 | "last 1 firefox version",
36 | "last 1 safari version"
37 | ]
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/client/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/client/public/favicon.ico
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
19 |
20 |
21 |
22 | React App
23 |
24 |
25 | You need to enable JavaScript to run this app.
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/client/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/client/public/logo192.png
--------------------------------------------------------------------------------
/client/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/client/public/logo512.png
--------------------------------------------------------------------------------
/client/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 |
--------------------------------------------------------------------------------
/client/public/photo1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bjnandi/containerize-full-stack-app-MERN-with-docker-compose/884760fbd5efd47ea6a6d6d1d599285b7ddeb03a/client/public/photo1.jpg
--------------------------------------------------------------------------------
/client/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/client/src/App.js:
--------------------------------------------------------------------------------
1 | import { Routes, BrowserRouter, Route } from "react-router-dom";
2 | import Navbar from "./components/Navbar";
3 | import Home from "./pages/Home";
4 | import AddUser from "./pages/AddUser";
5 | import EditUser from "./pages/EditUser";
6 |
7 | function App() {
8 | return (
9 |
10 |
11 |
12 |
13 | } />
14 | } />
15 | } />
16 |
17 |
18 |
19 | );
20 | }
21 |
22 | export default App;
23 |
--------------------------------------------------------------------------------
/client/src/components/Navbar.js:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | const Navbar = () => {
4 | return (
5 |
6 |
7 |
8 | CRUD
9 |
10 |
11 |
12 |
13 |
14 | Add User
15 |
16 |
17 |
18 |
19 |
20 |
21 | );
22 | };
23 |
24 | export default Navbar;
25 |
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | .col-md-4 {
2 | width: 30%;
3 | }
4 |
5 | .text-center {
6 | text-align: center;
7 | }
8 |
9 | .center {
10 | justify-content: center;
11 | align-items: center;
12 | }
13 |
14 | .edit-button {
15 | text-decoration: none;
16 | background: #8647e9;
17 | padding: 5px 20px;
18 | border-radius: 50px;
19 | color: white;
20 | }
21 |
22 | .btn-danger {
23 | border-radius: 5px;
24 | background: #ff5656;
25 | color: white;
26 | }
27 |
28 | .card {
29 | max-width: 300px;
30 | }
31 |
--------------------------------------------------------------------------------
/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./index.css";
3 | import App from "./App";
4 | import { createRoot } from "react-dom/client";
5 |
6 | createRoot(document.getElementById("root")).render(
7 |
8 |
9 |
10 | );
11 |
--------------------------------------------------------------------------------
/client/src/pages/AddUser.js:
--------------------------------------------------------------------------------
1 | import { useState } from "react";
2 | import { useNavigate } from "react-router-dom";
3 |
4 | const AddUser = () => {
5 | const navigate = useNavigate();
6 | const [data, setData] = useState({
7 | name: "",
8 | image: "",
9 | });
10 | const handleChange = (name) => (e) => {
11 | const value = name === "image" ? e.target.files[0] : e.target.value;
12 | setData({ ...data, [name]: value });
13 | };
14 | const handleSubmit = async () => {
15 | try {
16 | let formData = new FormData();
17 | formData.append("image", data.image);
18 | formData.append("name", data.name);
19 |
20 | const res = await fetch(`${process.env.REACT_APP_SERVER_URL}/user`, {
21 | method: "POST",
22 | body: formData,
23 | });
24 | if (res.ok) {
25 | setData({ name: "", image: "" });
26 | navigate("/", { replace: true });
27 | }
28 | } catch (error) {
29 | console.log(error);
30 | }
31 | };
32 |
33 | return (
34 |
35 |
36 |
44 |
45 |
46 |
53 |
54 |
55 |
56 | Submit
57 |
58 |
59 |
60 | );
61 | };
62 |
63 | export default AddUser;
64 |
--------------------------------------------------------------------------------
/client/src/pages/EditUser.js:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 | import { useNavigate, useLocation } from "react-router-dom";
3 |
4 | const EditUser = ({ match }) => {
5 | const navigate = useNavigate();
6 | const { pathname } = useLocation();
7 | const userid = pathname.substring(pathname.lastIndexOf("/") + 1);
8 |
9 | const [data, setData] = useState({
10 | name: "",
11 | image: "",
12 | });
13 | useEffect(() => {
14 | fetch(`${process.env.REACT_APP_SERVER_URL}/user/${userid}`)
15 | .then((res) => res.json())
16 | .then((data) => setData(data));
17 | }, []);
18 |
19 | const handleChange = (name) => (e) => {
20 | const value = name === "image" ? e?.target?.files[0] : e?.target?.value;
21 | setData({ ...data, [name]: value });
22 | };
23 |
24 | const handleSubmit = async () => {
25 | try {
26 | let formData = new FormData();
27 | formData.append("image", data?.image);
28 | formData.append("name", data?.name);
29 |
30 | const res = await fetch(
31 | `${process.env.REACT_APP_SERVER_URL}/user/${userid}`,
32 | {
33 | method: "PUT",
34 | body: formData,
35 | }
36 | );
37 | if (res.ok) {
38 | setData({ name: "", image: "" });
39 | navigate("/", { replace: true });
40 | }
41 | } catch (error) {
42 | console.log(error);
43 | }
44 | };
45 |
46 | return (
47 |
48 |
49 |
56 |
57 |
58 |
65 |
66 |
67 |
68 | Update
69 |
70 |
71 |
72 | );
73 | };
74 |
75 | export default EditUser;
76 |
--------------------------------------------------------------------------------
/client/src/pages/Home.js:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 | import { useEffect, useState } from "react";
3 |
4 | const Home = () => {
5 | const [users, setUsers] = useState();
6 | useEffect(() => {
7 | const fetchUsers = async () => {
8 | const res = await fetch(`${process.env.REACT_APP_SERVER_URL}/user`);
9 | const data = await res.json();
10 | setUsers(data);
11 | };
12 | fetchUsers();
13 | }, []);
14 |
15 | const handleDelete = async (id) => {
16 | try {
17 | const res = await fetch(
18 | `${process.env.REACT_APP_SERVER_URL}/user/${id}`,
19 | {
20 | method: "DELETE",
21 | }
22 | );
23 | if (res.ok) {
24 | const updatedUsers = users.filter((user) => user._id !== id);
25 | setUsers(updatedUsers);
26 | }
27 | } catch (error) {
28 | console.log(error);
29 | }
30 | };
31 | return (
32 |
33 | {users?.map((user) => (
34 |
35 |
36 |
37 |
{user.name}
38 |
39 |
44 | Edit
45 |
46 | handleDelete(user._id)}
49 | >
50 | X
51 |
52 |
53 |
54 |
55 | ))}
56 |
57 | );
58 | };
59 |
60 | export default Home;
61 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | # Services
4 | services:
5 | # Server service
6 | server:
7 | build:
8 | context: ./server
9 | dockerfile: Dockerfile
10 |
11 | container_name: backend
12 | ports:
13 | - "5000:5000"
14 | env_file: ./.env
15 | environment:
16 | - DB_HOST=mongodb
17 | - DB_USER=$MONGODB_USER
18 | - DB_PASSWORD=$MONGODB_PASSWORD
19 | - DB_NAME=$MONGODB_DATABASE
20 | - DB_PORT=$MONGODB_DOCKER_PORT
21 | depends_on:
22 | - mongodb
23 |
24 | # Client service
25 | client:
26 | build:
27 | context: ./client
28 | dockerfile: Dockerfile
29 |
30 | container_name: frontend
31 | ports:
32 | - "80:80"
33 | depends_on:
34 | - server
35 |
36 | # Database service
37 | mongodb:
38 | image: mongo:latest
39 | container_name: mongodb_server
40 |
41 | env_file: ./.env
42 | environment:
43 | - MONGO_INITDB_ROOT_USERNAME=$MONGODB_USER
44 | - MONGO_INITDB_ROOT_PASSWORD=$MONGODB_PASSWORD
45 | ports:
46 | - "27017:27017"
47 | volumes:
48 | - ./../mydata:/data/db
49 |
50 | # Volumes define
51 | volumes:
52 | mydata:
53 |
--------------------------------------------------------------------------------
/server/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
--------------------------------------------------------------------------------
/server/.env:
--------------------------------------------------------------------------------
1 | CLOUDINARY_CLOUD_NAME=your-cloud-name
2 | CLOUDINARY_API_KEY=your-api-key
3 | CLOUDINARY_API_SECRET=your-api-secret
4 | # MONGO_URI=your-mongodb-uri
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/server/Dockerfile:
--------------------------------------------------------------------------------
1 | # Select a base image
2 | FROM node:20-alpine3.17
3 |
4 | # Create a directory and go to directory
5 | WORKDIR /app
6 |
7 | # Copy the package.json file to my current directory for install necessary dependence
8 | COPY package.json .
9 |
10 | # Install the dependence
11 | RUN npm install
12 |
13 | # Copy other file to my current directory
14 | COPY . .
15 |
16 |
17 | # Open the port for express server
18 | EXPOSE 5000
19 |
20 | # Run express rum in foreground
21 | CMD ["npm", "start"]
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 | const mongoose = require("mongoose");
4 | const dotenv = require("dotenv");
5 | const cors = require("cors");
6 |
7 | dotenv.config();
8 |
9 | const {
10 | DB_USER,
11 | DB_PASSWORD,
12 | DB_HOST,
13 | DB_PORT,
14 | DB_NAME,
15 | } = process.env;
16 |
17 | const MONGO_URI = `mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?authSource=admin`
18 |
19 | // Connect DB
20 | mongoose
21 | .connect(MONGO_URI,{ useNewUrlParser: true, useUnifiedTopology: true })
22 | .then(() => console.log("mongoDB is connected"))
23 | .catch((err) => console.log(err));
24 |
25 | // Middleware
26 | app.use(express.json());
27 | app.use(cors());
28 |
29 | // Route
30 | app.use("/user", require("./routes/user"));
31 |
32 | app.listen(5000, () => console.log("Server is running on port 5000"));
33 |
--------------------------------------------------------------------------------
/server/model/user.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 | const userSchema = new mongoose.Schema({
3 | name: {
4 | type: String,
5 | },
6 | avatar: {
7 | type: String,
8 | },
9 | cloudinary_id: {
10 | type: String,
11 | },
12 | });
13 |
14 | module.exports = mongoose.model("Cloudinary-CRUD", userSchema);
15 |
--------------------------------------------------------------------------------
/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "imgcrud",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "imgcrud",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cloudinary": "^1.41.0",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.3.1",
15 | "express": "^4.18.2",
16 | "mongoose": "^7.5.4",
17 | "multer": "^1.4.5-lts.1",
18 | "react-router-dom": "^6.16.0"
19 | },
20 | "devDependencies": {
21 | "nodemon": "^2.0.4"
22 | },
23 | "engines": {
24 | "node": ">=18.17.0",
25 | "npm": ">=9.8.1"
26 | }
27 | },
28 | "node_modules/@mongodb-js/saslprep": {
29 | "version": "1.1.0",
30 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz",
31 | "integrity": "sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw==",
32 | "optional": true,
33 | "dependencies": {
34 | "sparse-bitfield": "^3.0.3"
35 | }
36 | },
37 | "node_modules/@remix-run/router": {
38 | "version": "1.9.0",
39 | "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz",
40 | "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==",
41 | "engines": {
42 | "node": ">=14.0.0"
43 | }
44 | },
45 | "node_modules/@sindresorhus/is": {
46 | "version": "0.14.0",
47 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
48 | "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
49 | "dev": true,
50 | "engines": {
51 | "node": ">=6"
52 | }
53 | },
54 | "node_modules/@szmarczak/http-timer": {
55 | "version": "1.1.2",
56 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
57 | "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
58 | "dev": true,
59 | "dependencies": {
60 | "defer-to-connect": "^1.0.1"
61 | },
62 | "engines": {
63 | "node": ">=6"
64 | }
65 | },
66 | "node_modules/@types/color-name": {
67 | "version": "1.1.1",
68 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
69 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
70 | "dev": true
71 | },
72 | "node_modules/@types/node": {
73 | "version": "20.8.2",
74 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz",
75 | "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w=="
76 | },
77 | "node_modules/@types/webidl-conversions": {
78 | "version": "7.0.1",
79 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.1.tgz",
80 | "integrity": "sha512-8hKOnOan+Uu+NgMaCouhg3cT9x5fFZ92Jwf+uDLXLu/MFRbXxlWwGeQY7KVHkeSft6RvY+tdxklUBuyY9eIEKg=="
81 | },
82 | "node_modules/@types/whatwg-url": {
83 | "version": "8.2.2",
84 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
85 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
86 | "dependencies": {
87 | "@types/node": "*",
88 | "@types/webidl-conversions": "*"
89 | }
90 | },
91 | "node_modules/abbrev": {
92 | "version": "1.1.1",
93 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
94 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
95 | "dev": true
96 | },
97 | "node_modules/accepts": {
98 | "version": "1.3.8",
99 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
100 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
101 | "dependencies": {
102 | "mime-types": "~2.1.34",
103 | "negotiator": "0.6.3"
104 | },
105 | "engines": {
106 | "node": ">= 0.6"
107 | }
108 | },
109 | "node_modules/ansi-align": {
110 | "version": "3.0.0",
111 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
112 | "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
113 | "dev": true,
114 | "dependencies": {
115 | "string-width": "^3.0.0"
116 | }
117 | },
118 | "node_modules/ansi-align/node_modules/string-width": {
119 | "version": "3.1.0",
120 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
121 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
122 | "dev": true,
123 | "dependencies": {
124 | "emoji-regex": "^7.0.1",
125 | "is-fullwidth-code-point": "^2.0.0",
126 | "strip-ansi": "^5.1.0"
127 | },
128 | "engines": {
129 | "node": ">=6"
130 | }
131 | },
132 | "node_modules/ansi-regex": {
133 | "version": "4.1.0",
134 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
135 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
136 | "dev": true,
137 | "engines": {
138 | "node": ">=6"
139 | }
140 | },
141 | "node_modules/ansi-styles": {
142 | "version": "4.2.1",
143 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
144 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
145 | "dev": true,
146 | "dependencies": {
147 | "@types/color-name": "^1.1.1",
148 | "color-convert": "^2.0.1"
149 | },
150 | "engines": {
151 | "node": ">=8"
152 | },
153 | "funding": {
154 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
155 | }
156 | },
157 | "node_modules/anymatch": {
158 | "version": "3.1.1",
159 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
160 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
161 | "dev": true,
162 | "dependencies": {
163 | "normalize-path": "^3.0.0",
164 | "picomatch": "^2.0.4"
165 | },
166 | "engines": {
167 | "node": ">= 8"
168 | }
169 | },
170 | "node_modules/append-field": {
171 | "version": "1.0.0",
172 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
173 | "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
174 | },
175 | "node_modules/array-flatten": {
176 | "version": "1.1.1",
177 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
178 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
179 | },
180 | "node_modules/balanced-match": {
181 | "version": "1.0.0",
182 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
183 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
184 | "dev": true
185 | },
186 | "node_modules/binary-extensions": {
187 | "version": "2.1.0",
188 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
189 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
190 | "dev": true,
191 | "engines": {
192 | "node": ">=8"
193 | }
194 | },
195 | "node_modules/body-parser": {
196 | "version": "1.20.1",
197 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
198 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
199 | "dependencies": {
200 | "bytes": "3.1.2",
201 | "content-type": "~1.0.4",
202 | "debug": "2.6.9",
203 | "depd": "2.0.0",
204 | "destroy": "1.2.0",
205 | "http-errors": "2.0.0",
206 | "iconv-lite": "0.4.24",
207 | "on-finished": "2.4.1",
208 | "qs": "6.11.0",
209 | "raw-body": "2.5.1",
210 | "type-is": "~1.6.18",
211 | "unpipe": "1.0.0"
212 | },
213 | "engines": {
214 | "node": ">= 0.8",
215 | "npm": "1.2.8000 || >= 1.4.16"
216 | }
217 | },
218 | "node_modules/boxen": {
219 | "version": "4.2.0",
220 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
221 | "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
222 | "dev": true,
223 | "dependencies": {
224 | "ansi-align": "^3.0.0",
225 | "camelcase": "^5.3.1",
226 | "chalk": "^3.0.0",
227 | "cli-boxes": "^2.2.0",
228 | "string-width": "^4.1.0",
229 | "term-size": "^2.1.0",
230 | "type-fest": "^0.8.1",
231 | "widest-line": "^3.1.0"
232 | },
233 | "engines": {
234 | "node": ">=8"
235 | },
236 | "funding": {
237 | "url": "https://github.com/sponsors/sindresorhus"
238 | }
239 | },
240 | "node_modules/brace-expansion": {
241 | "version": "1.1.11",
242 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
243 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
244 | "dev": true,
245 | "dependencies": {
246 | "balanced-match": "^1.0.0",
247 | "concat-map": "0.0.1"
248 | }
249 | },
250 | "node_modules/braces": {
251 | "version": "3.0.2",
252 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
253 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
254 | "dev": true,
255 | "dependencies": {
256 | "fill-range": "^7.0.1"
257 | },
258 | "engines": {
259 | "node": ">=8"
260 | }
261 | },
262 | "node_modules/bson": {
263 | "version": "5.5.0",
264 | "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.0.tgz",
265 | "integrity": "sha512-B+QB4YmDx9RStKv8LLSl/aVIEV3nYJc3cJNNTK2Cd1TL+7P+cNpw9mAPeCgc5K+j01Dv6sxUzcITXDx7ZU3F0w==",
266 | "engines": {
267 | "node": ">=14.20.1"
268 | }
269 | },
270 | "node_modules/buffer-from": {
271 | "version": "1.1.1",
272 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
273 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
274 | },
275 | "node_modules/busboy": {
276 | "version": "1.6.0",
277 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
278 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
279 | "dependencies": {
280 | "streamsearch": "^1.1.0"
281 | },
282 | "engines": {
283 | "node": ">=10.16.0"
284 | }
285 | },
286 | "node_modules/bytes": {
287 | "version": "3.1.2",
288 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
289 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
290 | "engines": {
291 | "node": ">= 0.8"
292 | }
293 | },
294 | "node_modules/cacheable-request": {
295 | "version": "6.1.0",
296 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
297 | "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
298 | "dev": true,
299 | "dependencies": {
300 | "clone-response": "^1.0.2",
301 | "get-stream": "^5.1.0",
302 | "http-cache-semantics": "^4.0.0",
303 | "keyv": "^3.0.0",
304 | "lowercase-keys": "^2.0.0",
305 | "normalize-url": "^4.1.0",
306 | "responselike": "^1.0.2"
307 | },
308 | "engines": {
309 | "node": ">=8"
310 | }
311 | },
312 | "node_modules/cacheable-request/node_modules/get-stream": {
313 | "version": "5.2.0",
314 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
315 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
316 | "dev": true,
317 | "dependencies": {
318 | "pump": "^3.0.0"
319 | },
320 | "engines": {
321 | "node": ">=8"
322 | },
323 | "funding": {
324 | "url": "https://github.com/sponsors/sindresorhus"
325 | }
326 | },
327 | "node_modules/cacheable-request/node_modules/lowercase-keys": {
328 | "version": "2.0.0",
329 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
330 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
331 | "dev": true,
332 | "engines": {
333 | "node": ">=8"
334 | }
335 | },
336 | "node_modules/call-bind": {
337 | "version": "1.0.2",
338 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
339 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
340 | "dependencies": {
341 | "function-bind": "^1.1.1",
342 | "get-intrinsic": "^1.0.2"
343 | },
344 | "funding": {
345 | "url": "https://github.com/sponsors/ljharb"
346 | }
347 | },
348 | "node_modules/camelcase": {
349 | "version": "5.3.1",
350 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
351 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
352 | "dev": true,
353 | "engines": {
354 | "node": ">=6"
355 | }
356 | },
357 | "node_modules/chalk": {
358 | "version": "3.0.0",
359 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
360 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
361 | "dev": true,
362 | "dependencies": {
363 | "ansi-styles": "^4.1.0",
364 | "supports-color": "^7.1.0"
365 | },
366 | "engines": {
367 | "node": ">=8"
368 | }
369 | },
370 | "node_modules/chalk/node_modules/has-flag": {
371 | "version": "4.0.0",
372 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
373 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
374 | "dev": true,
375 | "engines": {
376 | "node": ">=8"
377 | }
378 | },
379 | "node_modules/chalk/node_modules/supports-color": {
380 | "version": "7.2.0",
381 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
382 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
383 | "dev": true,
384 | "dependencies": {
385 | "has-flag": "^4.0.0"
386 | },
387 | "engines": {
388 | "node": ">=8"
389 | }
390 | },
391 | "node_modules/chokidar": {
392 | "version": "3.4.2",
393 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
394 | "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
395 | "dev": true,
396 | "dependencies": {
397 | "anymatch": "~3.1.1",
398 | "braces": "~3.0.2",
399 | "glob-parent": "~5.1.0",
400 | "is-binary-path": "~2.1.0",
401 | "is-glob": "~4.0.1",
402 | "normalize-path": "~3.0.0",
403 | "readdirp": "~3.4.0"
404 | },
405 | "engines": {
406 | "node": ">= 8.10.0"
407 | },
408 | "optionalDependencies": {
409 | "fsevents": "~2.1.2"
410 | }
411 | },
412 | "node_modules/ci-info": {
413 | "version": "2.0.0",
414 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
415 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
416 | "dev": true
417 | },
418 | "node_modules/cli-boxes": {
419 | "version": "2.2.1",
420 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
421 | "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
422 | "dev": true,
423 | "engines": {
424 | "node": ">=6"
425 | },
426 | "funding": {
427 | "url": "https://github.com/sponsors/sindresorhus"
428 | }
429 | },
430 | "node_modules/clone-response": {
431 | "version": "1.0.2",
432 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
433 | "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
434 | "dev": true,
435 | "dependencies": {
436 | "mimic-response": "^1.0.0"
437 | }
438 | },
439 | "node_modules/cloudinary": {
440 | "version": "1.41.0",
441 | "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.0.tgz",
442 | "integrity": "sha512-qFf2McjvILJITePf4VF1PrY/8c2zy+/q5FVV6V3VWrP/gpIZsusPqXL4QZ6ZKXibPRukzMYqsQEhaSQgJHKKow==",
443 | "dependencies": {
444 | "cloudinary-core": "^2.13.0",
445 | "core-js": "^3.30.1",
446 | "lodash": "^4.17.21",
447 | "q": "^1.5.1"
448 | },
449 | "engines": {
450 | "node": ">=0.6"
451 | }
452 | },
453 | "node_modules/cloudinary-core": {
454 | "version": "2.13.0",
455 | "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.13.0.tgz",
456 | "integrity": "sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==",
457 | "peerDependencies": {
458 | "lodash": ">=4.0"
459 | }
460 | },
461 | "node_modules/color-convert": {
462 | "version": "2.0.1",
463 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
464 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
465 | "dev": true,
466 | "dependencies": {
467 | "color-name": "~1.1.4"
468 | },
469 | "engines": {
470 | "node": ">=7.0.0"
471 | }
472 | },
473 | "node_modules/color-name": {
474 | "version": "1.1.4",
475 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
476 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
477 | "dev": true
478 | },
479 | "node_modules/concat-map": {
480 | "version": "0.0.1",
481 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
482 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
483 | "dev": true
484 | },
485 | "node_modules/concat-stream": {
486 | "version": "1.6.2",
487 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
488 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
489 | "engines": [
490 | "node >= 0.8"
491 | ],
492 | "dependencies": {
493 | "buffer-from": "^1.0.0",
494 | "inherits": "^2.0.3",
495 | "readable-stream": "^2.2.2",
496 | "typedarray": "^0.0.6"
497 | }
498 | },
499 | "node_modules/configstore": {
500 | "version": "5.0.1",
501 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
502 | "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
503 | "dev": true,
504 | "dependencies": {
505 | "dot-prop": "^5.2.0",
506 | "graceful-fs": "^4.1.2",
507 | "make-dir": "^3.0.0",
508 | "unique-string": "^2.0.0",
509 | "write-file-atomic": "^3.0.0",
510 | "xdg-basedir": "^4.0.0"
511 | },
512 | "engines": {
513 | "node": ">=8"
514 | }
515 | },
516 | "node_modules/content-disposition": {
517 | "version": "0.5.4",
518 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
519 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
520 | "dependencies": {
521 | "safe-buffer": "5.2.1"
522 | },
523 | "engines": {
524 | "node": ">= 0.6"
525 | }
526 | },
527 | "node_modules/content-disposition/node_modules/safe-buffer": {
528 | "version": "5.2.1",
529 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
530 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
531 | "funding": [
532 | {
533 | "type": "github",
534 | "url": "https://github.com/sponsors/feross"
535 | },
536 | {
537 | "type": "patreon",
538 | "url": "https://www.patreon.com/feross"
539 | },
540 | {
541 | "type": "consulting",
542 | "url": "https://feross.org/support"
543 | }
544 | ]
545 | },
546 | "node_modules/content-type": {
547 | "version": "1.0.5",
548 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
549 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
550 | "engines": {
551 | "node": ">= 0.6"
552 | }
553 | },
554 | "node_modules/cookie": {
555 | "version": "0.5.0",
556 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
557 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
558 | "engines": {
559 | "node": ">= 0.6"
560 | }
561 | },
562 | "node_modules/cookie-signature": {
563 | "version": "1.0.6",
564 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
565 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
566 | },
567 | "node_modules/core-js": {
568 | "version": "3.33.0",
569 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz",
570 | "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==",
571 | "hasInstallScript": true,
572 | "funding": {
573 | "type": "opencollective",
574 | "url": "https://opencollective.com/core-js"
575 | }
576 | },
577 | "node_modules/core-util-is": {
578 | "version": "1.0.2",
579 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
580 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
581 | },
582 | "node_modules/cors": {
583 | "version": "2.8.5",
584 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
585 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
586 | "dependencies": {
587 | "object-assign": "^4",
588 | "vary": "^1"
589 | },
590 | "engines": {
591 | "node": ">= 0.10"
592 | }
593 | },
594 | "node_modules/crypto-random-string": {
595 | "version": "2.0.0",
596 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
597 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
598 | "dev": true,
599 | "engines": {
600 | "node": ">=8"
601 | }
602 | },
603 | "node_modules/debug": {
604 | "version": "2.6.9",
605 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
606 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
607 | "dependencies": {
608 | "ms": "2.0.0"
609 | }
610 | },
611 | "node_modules/decompress-response": {
612 | "version": "3.3.0",
613 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
614 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
615 | "dev": true,
616 | "dependencies": {
617 | "mimic-response": "^1.0.0"
618 | },
619 | "engines": {
620 | "node": ">=4"
621 | }
622 | },
623 | "node_modules/deep-extend": {
624 | "version": "0.6.0",
625 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
626 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
627 | "dev": true,
628 | "engines": {
629 | "node": ">=4.0.0"
630 | }
631 | },
632 | "node_modules/defer-to-connect": {
633 | "version": "1.1.3",
634 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
635 | "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
636 | "dev": true
637 | },
638 | "node_modules/depd": {
639 | "version": "2.0.0",
640 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
641 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
642 | "engines": {
643 | "node": ">= 0.8"
644 | }
645 | },
646 | "node_modules/destroy": {
647 | "version": "1.2.0",
648 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
649 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
650 | "engines": {
651 | "node": ">= 0.8",
652 | "npm": "1.2.8000 || >= 1.4.16"
653 | }
654 | },
655 | "node_modules/dot-prop": {
656 | "version": "5.3.0",
657 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
658 | "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
659 | "dev": true,
660 | "dependencies": {
661 | "is-obj": "^2.0.0"
662 | },
663 | "engines": {
664 | "node": ">=8"
665 | }
666 | },
667 | "node_modules/dotenv": {
668 | "version": "16.3.1",
669 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
670 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
671 | "engines": {
672 | "node": ">=12"
673 | },
674 | "funding": {
675 | "url": "https://github.com/motdotla/dotenv?sponsor=1"
676 | }
677 | },
678 | "node_modules/duplexer3": {
679 | "version": "0.1.4",
680 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
681 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
682 | "dev": true
683 | },
684 | "node_modules/ee-first": {
685 | "version": "1.1.1",
686 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
687 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
688 | },
689 | "node_modules/emoji-regex": {
690 | "version": "7.0.3",
691 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
692 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
693 | "dev": true
694 | },
695 | "node_modules/encodeurl": {
696 | "version": "1.0.2",
697 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
698 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
699 | "engines": {
700 | "node": ">= 0.8"
701 | }
702 | },
703 | "node_modules/end-of-stream": {
704 | "version": "1.4.4",
705 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
706 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
707 | "dev": true,
708 | "dependencies": {
709 | "once": "^1.4.0"
710 | }
711 | },
712 | "node_modules/escape-goat": {
713 | "version": "2.1.1",
714 | "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
715 | "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
716 | "dev": true,
717 | "engines": {
718 | "node": ">=8"
719 | }
720 | },
721 | "node_modules/escape-html": {
722 | "version": "1.0.3",
723 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
724 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
725 | },
726 | "node_modules/etag": {
727 | "version": "1.8.1",
728 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
729 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
730 | "engines": {
731 | "node": ">= 0.6"
732 | }
733 | },
734 | "node_modules/express": {
735 | "version": "4.18.2",
736 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
737 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
738 | "dependencies": {
739 | "accepts": "~1.3.8",
740 | "array-flatten": "1.1.1",
741 | "body-parser": "1.20.1",
742 | "content-disposition": "0.5.4",
743 | "content-type": "~1.0.4",
744 | "cookie": "0.5.0",
745 | "cookie-signature": "1.0.6",
746 | "debug": "2.6.9",
747 | "depd": "2.0.0",
748 | "encodeurl": "~1.0.2",
749 | "escape-html": "~1.0.3",
750 | "etag": "~1.8.1",
751 | "finalhandler": "1.2.0",
752 | "fresh": "0.5.2",
753 | "http-errors": "2.0.0",
754 | "merge-descriptors": "1.0.1",
755 | "methods": "~1.1.2",
756 | "on-finished": "2.4.1",
757 | "parseurl": "~1.3.3",
758 | "path-to-regexp": "0.1.7",
759 | "proxy-addr": "~2.0.7",
760 | "qs": "6.11.0",
761 | "range-parser": "~1.2.1",
762 | "safe-buffer": "5.2.1",
763 | "send": "0.18.0",
764 | "serve-static": "1.15.0",
765 | "setprototypeof": "1.2.0",
766 | "statuses": "2.0.1",
767 | "type-is": "~1.6.18",
768 | "utils-merge": "1.0.1",
769 | "vary": "~1.1.2"
770 | },
771 | "engines": {
772 | "node": ">= 0.10.0"
773 | }
774 | },
775 | "node_modules/express/node_modules/safe-buffer": {
776 | "version": "5.2.1",
777 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
778 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
779 | "funding": [
780 | {
781 | "type": "github",
782 | "url": "https://github.com/sponsors/feross"
783 | },
784 | {
785 | "type": "patreon",
786 | "url": "https://www.patreon.com/feross"
787 | },
788 | {
789 | "type": "consulting",
790 | "url": "https://feross.org/support"
791 | }
792 | ]
793 | },
794 | "node_modules/fill-range": {
795 | "version": "7.0.1",
796 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
797 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
798 | "dev": true,
799 | "dependencies": {
800 | "to-regex-range": "^5.0.1"
801 | },
802 | "engines": {
803 | "node": ">=8"
804 | }
805 | },
806 | "node_modules/finalhandler": {
807 | "version": "1.2.0",
808 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
809 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
810 | "dependencies": {
811 | "debug": "2.6.9",
812 | "encodeurl": "~1.0.2",
813 | "escape-html": "~1.0.3",
814 | "on-finished": "2.4.1",
815 | "parseurl": "~1.3.3",
816 | "statuses": "2.0.1",
817 | "unpipe": "~1.0.0"
818 | },
819 | "engines": {
820 | "node": ">= 0.8"
821 | }
822 | },
823 | "node_modules/forwarded": {
824 | "version": "0.2.0",
825 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
826 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
827 | "engines": {
828 | "node": ">= 0.6"
829 | }
830 | },
831 | "node_modules/fresh": {
832 | "version": "0.5.2",
833 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
834 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
835 | "engines": {
836 | "node": ">= 0.6"
837 | }
838 | },
839 | "node_modules/fsevents": {
840 | "version": "2.1.3",
841 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
842 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
843 | "deprecated": "\"Please update to latest v2.3 or v2.2\"",
844 | "dev": true,
845 | "hasInstallScript": true,
846 | "optional": true,
847 | "os": [
848 | "darwin"
849 | ],
850 | "engines": {
851 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
852 | }
853 | },
854 | "node_modules/function-bind": {
855 | "version": "1.1.1",
856 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
857 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
858 | },
859 | "node_modules/get-intrinsic": {
860 | "version": "1.2.1",
861 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
862 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
863 | "dependencies": {
864 | "function-bind": "^1.1.1",
865 | "has": "^1.0.3",
866 | "has-proto": "^1.0.1",
867 | "has-symbols": "^1.0.3"
868 | },
869 | "funding": {
870 | "url": "https://github.com/sponsors/ljharb"
871 | }
872 | },
873 | "node_modules/get-stream": {
874 | "version": "4.1.0",
875 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
876 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
877 | "dev": true,
878 | "dependencies": {
879 | "pump": "^3.0.0"
880 | },
881 | "engines": {
882 | "node": ">=6"
883 | }
884 | },
885 | "node_modules/glob-parent": {
886 | "version": "5.1.1",
887 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
888 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
889 | "dev": true,
890 | "dependencies": {
891 | "is-glob": "^4.0.1"
892 | },
893 | "engines": {
894 | "node": ">= 6"
895 | }
896 | },
897 | "node_modules/global-dirs": {
898 | "version": "2.0.1",
899 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
900 | "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
901 | "dev": true,
902 | "dependencies": {
903 | "ini": "^1.3.5"
904 | },
905 | "engines": {
906 | "node": ">=8"
907 | }
908 | },
909 | "node_modules/got": {
910 | "version": "9.6.0",
911 | "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
912 | "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
913 | "dev": true,
914 | "dependencies": {
915 | "@sindresorhus/is": "^0.14.0",
916 | "@szmarczak/http-timer": "^1.1.2",
917 | "cacheable-request": "^6.0.0",
918 | "decompress-response": "^3.3.0",
919 | "duplexer3": "^0.1.4",
920 | "get-stream": "^4.1.0",
921 | "lowercase-keys": "^1.0.1",
922 | "mimic-response": "^1.0.1",
923 | "p-cancelable": "^1.0.0",
924 | "to-readable-stream": "^1.0.0",
925 | "url-parse-lax": "^3.0.0"
926 | },
927 | "engines": {
928 | "node": ">=8.6"
929 | }
930 | },
931 | "node_modules/graceful-fs": {
932 | "version": "4.2.4",
933 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
934 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
935 | "dev": true
936 | },
937 | "node_modules/has": {
938 | "version": "1.0.4",
939 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
940 | "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
941 | "engines": {
942 | "node": ">= 0.4.0"
943 | }
944 | },
945 | "node_modules/has-flag": {
946 | "version": "3.0.0",
947 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
948 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
949 | "dev": true,
950 | "engines": {
951 | "node": ">=4"
952 | }
953 | },
954 | "node_modules/has-proto": {
955 | "version": "1.0.1",
956 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
957 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
958 | "engines": {
959 | "node": ">= 0.4"
960 | },
961 | "funding": {
962 | "url": "https://github.com/sponsors/ljharb"
963 | }
964 | },
965 | "node_modules/has-symbols": {
966 | "version": "1.0.3",
967 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
968 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
969 | "engines": {
970 | "node": ">= 0.4"
971 | },
972 | "funding": {
973 | "url": "https://github.com/sponsors/ljharb"
974 | }
975 | },
976 | "node_modules/has-yarn": {
977 | "version": "2.1.0",
978 | "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
979 | "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
980 | "dev": true,
981 | "engines": {
982 | "node": ">=8"
983 | }
984 | },
985 | "node_modules/http-cache-semantics": {
986 | "version": "4.1.0",
987 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
988 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
989 | "dev": true
990 | },
991 | "node_modules/http-errors": {
992 | "version": "2.0.0",
993 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
994 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
995 | "dependencies": {
996 | "depd": "2.0.0",
997 | "inherits": "2.0.4",
998 | "setprototypeof": "1.2.0",
999 | "statuses": "2.0.1",
1000 | "toidentifier": "1.0.1"
1001 | },
1002 | "engines": {
1003 | "node": ">= 0.8"
1004 | }
1005 | },
1006 | "node_modules/iconv-lite": {
1007 | "version": "0.4.24",
1008 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1009 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1010 | "dependencies": {
1011 | "safer-buffer": ">= 2.1.2 < 3"
1012 | },
1013 | "engines": {
1014 | "node": ">=0.10.0"
1015 | }
1016 | },
1017 | "node_modules/ignore-by-default": {
1018 | "version": "1.0.1",
1019 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1020 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
1021 | "dev": true
1022 | },
1023 | "node_modules/import-lazy": {
1024 | "version": "2.1.0",
1025 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
1026 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
1027 | "dev": true,
1028 | "engines": {
1029 | "node": ">=4"
1030 | }
1031 | },
1032 | "node_modules/imurmurhash": {
1033 | "version": "0.1.4",
1034 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1035 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1036 | "dev": true,
1037 | "engines": {
1038 | "node": ">=0.8.19"
1039 | }
1040 | },
1041 | "node_modules/inherits": {
1042 | "version": "2.0.4",
1043 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1044 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1045 | },
1046 | "node_modules/ini": {
1047 | "version": "1.3.5",
1048 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1049 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1050 | "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue",
1051 | "dev": true,
1052 | "engines": {
1053 | "node": "*"
1054 | }
1055 | },
1056 | "node_modules/ip": {
1057 | "version": "2.0.0",
1058 | "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
1059 | "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
1060 | },
1061 | "node_modules/ipaddr.js": {
1062 | "version": "1.9.1",
1063 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1064 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1065 | "engines": {
1066 | "node": ">= 0.10"
1067 | }
1068 | },
1069 | "node_modules/is-binary-path": {
1070 | "version": "2.1.0",
1071 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1072 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1073 | "dev": true,
1074 | "dependencies": {
1075 | "binary-extensions": "^2.0.0"
1076 | },
1077 | "engines": {
1078 | "node": ">=8"
1079 | }
1080 | },
1081 | "node_modules/is-ci": {
1082 | "version": "2.0.0",
1083 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
1084 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
1085 | "dev": true,
1086 | "dependencies": {
1087 | "ci-info": "^2.0.0"
1088 | },
1089 | "bin": {
1090 | "is-ci": "bin.js"
1091 | }
1092 | },
1093 | "node_modules/is-extglob": {
1094 | "version": "2.1.1",
1095 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1096 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1097 | "dev": true,
1098 | "engines": {
1099 | "node": ">=0.10.0"
1100 | }
1101 | },
1102 | "node_modules/is-fullwidth-code-point": {
1103 | "version": "2.0.0",
1104 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1105 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1106 | "dev": true,
1107 | "engines": {
1108 | "node": ">=4"
1109 | }
1110 | },
1111 | "node_modules/is-glob": {
1112 | "version": "4.0.1",
1113 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1114 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1115 | "dev": true,
1116 | "dependencies": {
1117 | "is-extglob": "^2.1.1"
1118 | },
1119 | "engines": {
1120 | "node": ">=0.10.0"
1121 | }
1122 | },
1123 | "node_modules/is-installed-globally": {
1124 | "version": "0.3.2",
1125 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
1126 | "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
1127 | "dev": true,
1128 | "dependencies": {
1129 | "global-dirs": "^2.0.1",
1130 | "is-path-inside": "^3.0.1"
1131 | },
1132 | "engines": {
1133 | "node": ">=8"
1134 | },
1135 | "funding": {
1136 | "url": "https://github.com/sponsors/sindresorhus"
1137 | }
1138 | },
1139 | "node_modules/is-npm": {
1140 | "version": "4.0.0",
1141 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
1142 | "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==",
1143 | "dev": true,
1144 | "engines": {
1145 | "node": ">=8"
1146 | }
1147 | },
1148 | "node_modules/is-number": {
1149 | "version": "7.0.0",
1150 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1151 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1152 | "dev": true,
1153 | "engines": {
1154 | "node": ">=0.12.0"
1155 | }
1156 | },
1157 | "node_modules/is-obj": {
1158 | "version": "2.0.0",
1159 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
1160 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
1161 | "dev": true,
1162 | "engines": {
1163 | "node": ">=8"
1164 | }
1165 | },
1166 | "node_modules/is-path-inside": {
1167 | "version": "3.0.2",
1168 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
1169 | "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
1170 | "dev": true,
1171 | "engines": {
1172 | "node": ">=8"
1173 | }
1174 | },
1175 | "node_modules/is-typedarray": {
1176 | "version": "1.0.0",
1177 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1178 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1179 | "dev": true
1180 | },
1181 | "node_modules/is-yarn-global": {
1182 | "version": "0.3.0",
1183 | "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
1184 | "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
1185 | "dev": true
1186 | },
1187 | "node_modules/isarray": {
1188 | "version": "1.0.0",
1189 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1190 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1191 | },
1192 | "node_modules/js-tokens": {
1193 | "version": "4.0.0",
1194 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1195 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1196 | "peer": true
1197 | },
1198 | "node_modules/json-buffer": {
1199 | "version": "3.0.0",
1200 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
1201 | "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
1202 | "dev": true
1203 | },
1204 | "node_modules/kareem": {
1205 | "version": "2.5.1",
1206 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
1207 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
1208 | "engines": {
1209 | "node": ">=12.0.0"
1210 | }
1211 | },
1212 | "node_modules/keyv": {
1213 | "version": "3.1.0",
1214 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
1215 | "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
1216 | "dev": true,
1217 | "dependencies": {
1218 | "json-buffer": "3.0.0"
1219 | }
1220 | },
1221 | "node_modules/latest-version": {
1222 | "version": "5.1.0",
1223 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
1224 | "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
1225 | "dev": true,
1226 | "dependencies": {
1227 | "package-json": "^6.3.0"
1228 | },
1229 | "engines": {
1230 | "node": ">=8"
1231 | }
1232 | },
1233 | "node_modules/lodash": {
1234 | "version": "4.17.21",
1235 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
1236 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
1237 | },
1238 | "node_modules/loose-envify": {
1239 | "version": "1.4.0",
1240 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
1241 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
1242 | "peer": true,
1243 | "dependencies": {
1244 | "js-tokens": "^3.0.0 || ^4.0.0"
1245 | },
1246 | "bin": {
1247 | "loose-envify": "cli.js"
1248 | }
1249 | },
1250 | "node_modules/lowercase-keys": {
1251 | "version": "1.0.1",
1252 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
1253 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
1254 | "dev": true,
1255 | "engines": {
1256 | "node": ">=0.10.0"
1257 | }
1258 | },
1259 | "node_modules/make-dir": {
1260 | "version": "3.1.0",
1261 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1262 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1263 | "dev": true,
1264 | "dependencies": {
1265 | "semver": "^6.0.0"
1266 | },
1267 | "engines": {
1268 | "node": ">=8"
1269 | },
1270 | "funding": {
1271 | "url": "https://github.com/sponsors/sindresorhus"
1272 | }
1273 | },
1274 | "node_modules/make-dir/node_modules/semver": {
1275 | "version": "6.3.0",
1276 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1277 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1278 | "dev": true,
1279 | "bin": {
1280 | "semver": "bin/semver.js"
1281 | }
1282 | },
1283 | "node_modules/media-typer": {
1284 | "version": "0.3.0",
1285 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1286 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
1287 | "engines": {
1288 | "node": ">= 0.6"
1289 | }
1290 | },
1291 | "node_modules/memory-pager": {
1292 | "version": "1.5.0",
1293 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1294 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1295 | "optional": true
1296 | },
1297 | "node_modules/merge-descriptors": {
1298 | "version": "1.0.1",
1299 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1300 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1301 | },
1302 | "node_modules/methods": {
1303 | "version": "1.1.2",
1304 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1305 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
1306 | "engines": {
1307 | "node": ">= 0.6"
1308 | }
1309 | },
1310 | "node_modules/mime": {
1311 | "version": "1.6.0",
1312 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1313 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1314 | "bin": {
1315 | "mime": "cli.js"
1316 | },
1317 | "engines": {
1318 | "node": ">=4"
1319 | }
1320 | },
1321 | "node_modules/mime-db": {
1322 | "version": "1.52.0",
1323 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1324 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1325 | "engines": {
1326 | "node": ">= 0.6"
1327 | }
1328 | },
1329 | "node_modules/mime-types": {
1330 | "version": "2.1.35",
1331 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1332 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1333 | "dependencies": {
1334 | "mime-db": "1.52.0"
1335 | },
1336 | "engines": {
1337 | "node": ">= 0.6"
1338 | }
1339 | },
1340 | "node_modules/mimic-response": {
1341 | "version": "1.0.1",
1342 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
1343 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
1344 | "dev": true,
1345 | "engines": {
1346 | "node": ">=4"
1347 | }
1348 | },
1349 | "node_modules/minimatch": {
1350 | "version": "3.0.4",
1351 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1352 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1353 | "dev": true,
1354 | "dependencies": {
1355 | "brace-expansion": "^1.1.7"
1356 | },
1357 | "engines": {
1358 | "node": "*"
1359 | }
1360 | },
1361 | "node_modules/minimist": {
1362 | "version": "1.2.5",
1363 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1364 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1365 | },
1366 | "node_modules/mkdirp": {
1367 | "version": "0.5.5",
1368 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1369 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1370 | "dependencies": {
1371 | "minimist": "^1.2.5"
1372 | },
1373 | "bin": {
1374 | "mkdirp": "bin/cmd.js"
1375 | }
1376 | },
1377 | "node_modules/mongodb": {
1378 | "version": "5.8.1",
1379 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.8.1.tgz",
1380 | "integrity": "sha512-wKyh4kZvm6NrCPH8AxyzXm3JBoEf4Xulo0aUWh3hCgwgYJxyQ1KLST86ZZaSWdj6/kxYUA3+YZuyADCE61CMSg==",
1381 | "dependencies": {
1382 | "bson": "^5.4.0",
1383 | "mongodb-connection-string-url": "^2.6.0",
1384 | "socks": "^2.7.1"
1385 | },
1386 | "engines": {
1387 | "node": ">=14.20.1"
1388 | },
1389 | "optionalDependencies": {
1390 | "@mongodb-js/saslprep": "^1.1.0"
1391 | },
1392 | "peerDependencies": {
1393 | "@aws-sdk/credential-providers": "^3.188.0",
1394 | "@mongodb-js/zstd": "^1.0.0",
1395 | "kerberos": "^1.0.0 || ^2.0.0",
1396 | "mongodb-client-encryption": ">=2.3.0 <3",
1397 | "snappy": "^7.2.2"
1398 | },
1399 | "peerDependenciesMeta": {
1400 | "@aws-sdk/credential-providers": {
1401 | "optional": true
1402 | },
1403 | "@mongodb-js/zstd": {
1404 | "optional": true
1405 | },
1406 | "kerberos": {
1407 | "optional": true
1408 | },
1409 | "mongodb-client-encryption": {
1410 | "optional": true
1411 | },
1412 | "snappy": {
1413 | "optional": true
1414 | }
1415 | }
1416 | },
1417 | "node_modules/mongodb-connection-string-url": {
1418 | "version": "2.6.0",
1419 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
1420 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
1421 | "dependencies": {
1422 | "@types/whatwg-url": "^8.2.1",
1423 | "whatwg-url": "^11.0.0"
1424 | }
1425 | },
1426 | "node_modules/mongoose": {
1427 | "version": "7.5.4",
1428 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.5.4.tgz",
1429 | "integrity": "sha512-u97BOfBOoCxysnH5X0WeF/O39DO1di75dYU75xaSs9mL3Si0qmP0qLWvWpBRdVkiiRVw+eaqJyKwaq6RvKPVZw==",
1430 | "dependencies": {
1431 | "bson": "^5.4.0",
1432 | "kareem": "2.5.1",
1433 | "mongodb": "5.8.1",
1434 | "mpath": "0.9.0",
1435 | "mquery": "5.0.0",
1436 | "ms": "2.1.3",
1437 | "sift": "16.0.1"
1438 | },
1439 | "engines": {
1440 | "node": ">=14.20.1"
1441 | },
1442 | "funding": {
1443 | "type": "opencollective",
1444 | "url": "https://opencollective.com/mongoose"
1445 | }
1446 | },
1447 | "node_modules/mongoose/node_modules/ms": {
1448 | "version": "2.1.3",
1449 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1450 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1451 | },
1452 | "node_modules/mpath": {
1453 | "version": "0.9.0",
1454 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1455 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
1456 | "engines": {
1457 | "node": ">=4.0.0"
1458 | }
1459 | },
1460 | "node_modules/mquery": {
1461 | "version": "5.0.0",
1462 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
1463 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
1464 | "dependencies": {
1465 | "debug": "4.x"
1466 | },
1467 | "engines": {
1468 | "node": ">=14.0.0"
1469 | }
1470 | },
1471 | "node_modules/mquery/node_modules/debug": {
1472 | "version": "4.3.4",
1473 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1474 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1475 | "dependencies": {
1476 | "ms": "2.1.2"
1477 | },
1478 | "engines": {
1479 | "node": ">=6.0"
1480 | },
1481 | "peerDependenciesMeta": {
1482 | "supports-color": {
1483 | "optional": true
1484 | }
1485 | }
1486 | },
1487 | "node_modules/mquery/node_modules/ms": {
1488 | "version": "2.1.2",
1489 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1490 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1491 | },
1492 | "node_modules/ms": {
1493 | "version": "2.0.0",
1494 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1495 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1496 | },
1497 | "node_modules/multer": {
1498 | "version": "1.4.5-lts.1",
1499 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
1500 | "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
1501 | "dependencies": {
1502 | "append-field": "^1.0.0",
1503 | "busboy": "^1.0.0",
1504 | "concat-stream": "^1.5.2",
1505 | "mkdirp": "^0.5.4",
1506 | "object-assign": "^4.1.1",
1507 | "type-is": "^1.6.4",
1508 | "xtend": "^4.0.0"
1509 | },
1510 | "engines": {
1511 | "node": ">= 6.0.0"
1512 | }
1513 | },
1514 | "node_modules/negotiator": {
1515 | "version": "0.6.3",
1516 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1517 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1518 | "engines": {
1519 | "node": ">= 0.6"
1520 | }
1521 | },
1522 | "node_modules/nodemon": {
1523 | "version": "2.0.4",
1524 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz",
1525 | "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==",
1526 | "dev": true,
1527 | "hasInstallScript": true,
1528 | "dependencies": {
1529 | "chokidar": "^3.2.2",
1530 | "debug": "^3.2.6",
1531 | "ignore-by-default": "^1.0.1",
1532 | "minimatch": "^3.0.4",
1533 | "pstree.remy": "^1.1.7",
1534 | "semver": "^5.7.1",
1535 | "supports-color": "^5.5.0",
1536 | "touch": "^3.1.0",
1537 | "undefsafe": "^2.0.2",
1538 | "update-notifier": "^4.0.0"
1539 | },
1540 | "bin": {
1541 | "nodemon": "bin/nodemon.js"
1542 | },
1543 | "engines": {
1544 | "node": ">=8.10.0"
1545 | },
1546 | "funding": {
1547 | "type": "opencollective",
1548 | "url": "https://opencollective.com/nodemon"
1549 | }
1550 | },
1551 | "node_modules/nodemon/node_modules/debug": {
1552 | "version": "3.2.6",
1553 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1554 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1555 | "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
1556 | "dev": true,
1557 | "dependencies": {
1558 | "ms": "^2.1.1"
1559 | }
1560 | },
1561 | "node_modules/nodemon/node_modules/ms": {
1562 | "version": "2.1.2",
1563 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1564 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1565 | "dev": true
1566 | },
1567 | "node_modules/nopt": {
1568 | "version": "1.0.10",
1569 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1570 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1571 | "dev": true,
1572 | "dependencies": {
1573 | "abbrev": "1"
1574 | },
1575 | "bin": {
1576 | "nopt": "bin/nopt.js"
1577 | },
1578 | "engines": {
1579 | "node": "*"
1580 | }
1581 | },
1582 | "node_modules/normalize-path": {
1583 | "version": "3.0.0",
1584 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1585 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1586 | "dev": true,
1587 | "engines": {
1588 | "node": ">=0.10.0"
1589 | }
1590 | },
1591 | "node_modules/normalize-url": {
1592 | "version": "4.5.0",
1593 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
1594 | "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
1595 | "dev": true,
1596 | "engines": {
1597 | "node": ">=8"
1598 | }
1599 | },
1600 | "node_modules/object-assign": {
1601 | "version": "4.1.1",
1602 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1603 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1604 | "engines": {
1605 | "node": ">=0.10.0"
1606 | }
1607 | },
1608 | "node_modules/object-inspect": {
1609 | "version": "1.12.3",
1610 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
1611 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
1612 | "funding": {
1613 | "url": "https://github.com/sponsors/ljharb"
1614 | }
1615 | },
1616 | "node_modules/on-finished": {
1617 | "version": "2.4.1",
1618 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1619 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1620 | "dependencies": {
1621 | "ee-first": "1.1.1"
1622 | },
1623 | "engines": {
1624 | "node": ">= 0.8"
1625 | }
1626 | },
1627 | "node_modules/once": {
1628 | "version": "1.4.0",
1629 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1630 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1631 | "dev": true,
1632 | "dependencies": {
1633 | "wrappy": "1"
1634 | }
1635 | },
1636 | "node_modules/p-cancelable": {
1637 | "version": "1.1.0",
1638 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
1639 | "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
1640 | "dev": true,
1641 | "engines": {
1642 | "node": ">=6"
1643 | }
1644 | },
1645 | "node_modules/package-json": {
1646 | "version": "6.5.0",
1647 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
1648 | "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
1649 | "dev": true,
1650 | "dependencies": {
1651 | "got": "^9.6.0",
1652 | "registry-auth-token": "^4.0.0",
1653 | "registry-url": "^5.0.0",
1654 | "semver": "^6.2.0"
1655 | },
1656 | "engines": {
1657 | "node": ">=8"
1658 | }
1659 | },
1660 | "node_modules/package-json/node_modules/semver": {
1661 | "version": "6.3.0",
1662 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1663 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1664 | "dev": true,
1665 | "bin": {
1666 | "semver": "bin/semver.js"
1667 | }
1668 | },
1669 | "node_modules/parseurl": {
1670 | "version": "1.3.3",
1671 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1672 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1673 | "engines": {
1674 | "node": ">= 0.8"
1675 | }
1676 | },
1677 | "node_modules/path-to-regexp": {
1678 | "version": "0.1.7",
1679 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1680 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1681 | },
1682 | "node_modules/picomatch": {
1683 | "version": "2.2.2",
1684 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1685 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1686 | "dev": true,
1687 | "engines": {
1688 | "node": ">=8.6"
1689 | },
1690 | "funding": {
1691 | "url": "https://github.com/sponsors/jonschlinkert"
1692 | }
1693 | },
1694 | "node_modules/prepend-http": {
1695 | "version": "2.0.0",
1696 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
1697 | "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
1698 | "dev": true,
1699 | "engines": {
1700 | "node": ">=4"
1701 | }
1702 | },
1703 | "node_modules/process-nextick-args": {
1704 | "version": "2.0.1",
1705 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1706 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1707 | },
1708 | "node_modules/proxy-addr": {
1709 | "version": "2.0.7",
1710 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1711 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1712 | "dependencies": {
1713 | "forwarded": "0.2.0",
1714 | "ipaddr.js": "1.9.1"
1715 | },
1716 | "engines": {
1717 | "node": ">= 0.10"
1718 | }
1719 | },
1720 | "node_modules/pstree.remy": {
1721 | "version": "1.1.8",
1722 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1723 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1724 | "dev": true
1725 | },
1726 | "node_modules/pump": {
1727 | "version": "3.0.0",
1728 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1729 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1730 | "dev": true,
1731 | "dependencies": {
1732 | "end-of-stream": "^1.1.0",
1733 | "once": "^1.3.1"
1734 | }
1735 | },
1736 | "node_modules/punycode": {
1737 | "version": "2.3.0",
1738 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
1739 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
1740 | "engines": {
1741 | "node": ">=6"
1742 | }
1743 | },
1744 | "node_modules/pupa": {
1745 | "version": "2.0.1",
1746 | "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
1747 | "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
1748 | "dev": true,
1749 | "dependencies": {
1750 | "escape-goat": "^2.0.0"
1751 | },
1752 | "engines": {
1753 | "node": ">=8"
1754 | }
1755 | },
1756 | "node_modules/q": {
1757 | "version": "1.5.1",
1758 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1759 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
1760 | "engines": {
1761 | "node": ">=0.6.0",
1762 | "teleport": ">=0.2.0"
1763 | }
1764 | },
1765 | "node_modules/qs": {
1766 | "version": "6.11.0",
1767 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1768 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1769 | "dependencies": {
1770 | "side-channel": "^1.0.4"
1771 | },
1772 | "engines": {
1773 | "node": ">=0.6"
1774 | },
1775 | "funding": {
1776 | "url": "https://github.com/sponsors/ljharb"
1777 | }
1778 | },
1779 | "node_modules/range-parser": {
1780 | "version": "1.2.1",
1781 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1782 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1783 | "engines": {
1784 | "node": ">= 0.6"
1785 | }
1786 | },
1787 | "node_modules/raw-body": {
1788 | "version": "2.5.1",
1789 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1790 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1791 | "dependencies": {
1792 | "bytes": "3.1.2",
1793 | "http-errors": "2.0.0",
1794 | "iconv-lite": "0.4.24",
1795 | "unpipe": "1.0.0"
1796 | },
1797 | "engines": {
1798 | "node": ">= 0.8"
1799 | }
1800 | },
1801 | "node_modules/rc": {
1802 | "version": "1.2.8",
1803 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1804 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1805 | "dev": true,
1806 | "dependencies": {
1807 | "deep-extend": "^0.6.0",
1808 | "ini": "~1.3.0",
1809 | "minimist": "^1.2.0",
1810 | "strip-json-comments": "~2.0.1"
1811 | },
1812 | "bin": {
1813 | "rc": "cli.js"
1814 | }
1815 | },
1816 | "node_modules/react": {
1817 | "version": "18.2.0",
1818 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
1819 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
1820 | "peer": true,
1821 | "dependencies": {
1822 | "loose-envify": "^1.1.0"
1823 | },
1824 | "engines": {
1825 | "node": ">=0.10.0"
1826 | }
1827 | },
1828 | "node_modules/react-dom": {
1829 | "version": "18.2.0",
1830 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
1831 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
1832 | "peer": true,
1833 | "dependencies": {
1834 | "loose-envify": "^1.1.0",
1835 | "scheduler": "^0.23.0"
1836 | },
1837 | "peerDependencies": {
1838 | "react": "^18.2.0"
1839 | }
1840 | },
1841 | "node_modules/react-router": {
1842 | "version": "6.16.0",
1843 | "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.16.0.tgz",
1844 | "integrity": "sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==",
1845 | "dependencies": {
1846 | "@remix-run/router": "1.9.0"
1847 | },
1848 | "engines": {
1849 | "node": ">=14.0.0"
1850 | },
1851 | "peerDependencies": {
1852 | "react": ">=16.8"
1853 | }
1854 | },
1855 | "node_modules/react-router-dom": {
1856 | "version": "6.16.0",
1857 | "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.16.0.tgz",
1858 | "integrity": "sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==",
1859 | "dependencies": {
1860 | "@remix-run/router": "1.9.0",
1861 | "react-router": "6.16.0"
1862 | },
1863 | "engines": {
1864 | "node": ">=14.0.0"
1865 | },
1866 | "peerDependencies": {
1867 | "react": ">=16.8",
1868 | "react-dom": ">=16.8"
1869 | }
1870 | },
1871 | "node_modules/readable-stream": {
1872 | "version": "2.3.7",
1873 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1874 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1875 | "dependencies": {
1876 | "core-util-is": "~1.0.0",
1877 | "inherits": "~2.0.3",
1878 | "isarray": "~1.0.0",
1879 | "process-nextick-args": "~2.0.0",
1880 | "safe-buffer": "~5.1.1",
1881 | "string_decoder": "~1.1.1",
1882 | "util-deprecate": "~1.0.1"
1883 | }
1884 | },
1885 | "node_modules/readdirp": {
1886 | "version": "3.4.0",
1887 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
1888 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
1889 | "dev": true,
1890 | "dependencies": {
1891 | "picomatch": "^2.2.1"
1892 | },
1893 | "engines": {
1894 | "node": ">=8.10.0"
1895 | }
1896 | },
1897 | "node_modules/registry-auth-token": {
1898 | "version": "4.2.0",
1899 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
1900 | "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
1901 | "dev": true,
1902 | "dependencies": {
1903 | "rc": "^1.2.8"
1904 | },
1905 | "engines": {
1906 | "node": ">=6.0.0"
1907 | }
1908 | },
1909 | "node_modules/registry-url": {
1910 | "version": "5.1.0",
1911 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
1912 | "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
1913 | "dev": true,
1914 | "dependencies": {
1915 | "rc": "^1.2.8"
1916 | },
1917 | "engines": {
1918 | "node": ">=8"
1919 | }
1920 | },
1921 | "node_modules/responselike": {
1922 | "version": "1.0.2",
1923 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
1924 | "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
1925 | "dev": true,
1926 | "dependencies": {
1927 | "lowercase-keys": "^1.0.0"
1928 | }
1929 | },
1930 | "node_modules/safe-buffer": {
1931 | "version": "5.1.2",
1932 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1933 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1934 | },
1935 | "node_modules/safer-buffer": {
1936 | "version": "2.1.2",
1937 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1938 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1939 | },
1940 | "node_modules/scheduler": {
1941 | "version": "0.23.0",
1942 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
1943 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
1944 | "peer": true,
1945 | "dependencies": {
1946 | "loose-envify": "^1.1.0"
1947 | }
1948 | },
1949 | "node_modules/semver": {
1950 | "version": "5.7.1",
1951 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1952 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1953 | "dev": true,
1954 | "bin": {
1955 | "semver": "bin/semver"
1956 | }
1957 | },
1958 | "node_modules/semver-diff": {
1959 | "version": "3.1.1",
1960 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
1961 | "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
1962 | "dev": true,
1963 | "dependencies": {
1964 | "semver": "^6.3.0"
1965 | },
1966 | "engines": {
1967 | "node": ">=8"
1968 | }
1969 | },
1970 | "node_modules/semver-diff/node_modules/semver": {
1971 | "version": "6.3.0",
1972 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1973 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
1974 | "dev": true,
1975 | "bin": {
1976 | "semver": "bin/semver.js"
1977 | }
1978 | },
1979 | "node_modules/send": {
1980 | "version": "0.18.0",
1981 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1982 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1983 | "dependencies": {
1984 | "debug": "2.6.9",
1985 | "depd": "2.0.0",
1986 | "destroy": "1.2.0",
1987 | "encodeurl": "~1.0.2",
1988 | "escape-html": "~1.0.3",
1989 | "etag": "~1.8.1",
1990 | "fresh": "0.5.2",
1991 | "http-errors": "2.0.0",
1992 | "mime": "1.6.0",
1993 | "ms": "2.1.3",
1994 | "on-finished": "2.4.1",
1995 | "range-parser": "~1.2.1",
1996 | "statuses": "2.0.1"
1997 | },
1998 | "engines": {
1999 | "node": ">= 0.8.0"
2000 | }
2001 | },
2002 | "node_modules/send/node_modules/ms": {
2003 | "version": "2.1.3",
2004 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2005 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
2006 | },
2007 | "node_modules/serve-static": {
2008 | "version": "1.15.0",
2009 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
2010 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
2011 | "dependencies": {
2012 | "encodeurl": "~1.0.2",
2013 | "escape-html": "~1.0.3",
2014 | "parseurl": "~1.3.3",
2015 | "send": "0.18.0"
2016 | },
2017 | "engines": {
2018 | "node": ">= 0.8.0"
2019 | }
2020 | },
2021 | "node_modules/setprototypeof": {
2022 | "version": "1.2.0",
2023 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
2024 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
2025 | },
2026 | "node_modules/side-channel": {
2027 | "version": "1.0.4",
2028 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
2029 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
2030 | "dependencies": {
2031 | "call-bind": "^1.0.0",
2032 | "get-intrinsic": "^1.0.2",
2033 | "object-inspect": "^1.9.0"
2034 | },
2035 | "funding": {
2036 | "url": "https://github.com/sponsors/ljharb"
2037 | }
2038 | },
2039 | "node_modules/sift": {
2040 | "version": "16.0.1",
2041 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
2042 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
2043 | },
2044 | "node_modules/signal-exit": {
2045 | "version": "3.0.3",
2046 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2047 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2048 | "dev": true
2049 | },
2050 | "node_modules/smart-buffer": {
2051 | "version": "4.2.0",
2052 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
2053 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
2054 | "engines": {
2055 | "node": ">= 6.0.0",
2056 | "npm": ">= 3.0.0"
2057 | }
2058 | },
2059 | "node_modules/socks": {
2060 | "version": "2.7.1",
2061 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
2062 | "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
2063 | "dependencies": {
2064 | "ip": "^2.0.0",
2065 | "smart-buffer": "^4.2.0"
2066 | },
2067 | "engines": {
2068 | "node": ">= 10.13.0",
2069 | "npm": ">= 3.0.0"
2070 | }
2071 | },
2072 | "node_modules/sparse-bitfield": {
2073 | "version": "3.0.3",
2074 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
2075 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
2076 | "optional": true,
2077 | "dependencies": {
2078 | "memory-pager": "^1.0.2"
2079 | }
2080 | },
2081 | "node_modules/statuses": {
2082 | "version": "2.0.1",
2083 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
2084 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
2085 | "engines": {
2086 | "node": ">= 0.8"
2087 | }
2088 | },
2089 | "node_modules/streamsearch": {
2090 | "version": "1.1.0",
2091 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
2092 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
2093 | "engines": {
2094 | "node": ">=10.0.0"
2095 | }
2096 | },
2097 | "node_modules/string_decoder": {
2098 | "version": "1.1.1",
2099 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2100 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2101 | "dependencies": {
2102 | "safe-buffer": "~5.1.0"
2103 | }
2104 | },
2105 | "node_modules/string-width": {
2106 | "version": "4.2.0",
2107 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
2108 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
2109 | "dev": true,
2110 | "dependencies": {
2111 | "emoji-regex": "^8.0.0",
2112 | "is-fullwidth-code-point": "^3.0.0",
2113 | "strip-ansi": "^6.0.0"
2114 | },
2115 | "engines": {
2116 | "node": ">=8"
2117 | }
2118 | },
2119 | "node_modules/string-width/node_modules/ansi-regex": {
2120 | "version": "5.0.0",
2121 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2122 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
2123 | "dev": true,
2124 | "engines": {
2125 | "node": ">=8"
2126 | }
2127 | },
2128 | "node_modules/string-width/node_modules/emoji-regex": {
2129 | "version": "8.0.0",
2130 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2131 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2132 | "dev": true
2133 | },
2134 | "node_modules/string-width/node_modules/is-fullwidth-code-point": {
2135 | "version": "3.0.0",
2136 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2137 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2138 | "dev": true,
2139 | "engines": {
2140 | "node": ">=8"
2141 | }
2142 | },
2143 | "node_modules/string-width/node_modules/strip-ansi": {
2144 | "version": "6.0.0",
2145 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2146 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2147 | "dev": true,
2148 | "dependencies": {
2149 | "ansi-regex": "^5.0.0"
2150 | },
2151 | "engines": {
2152 | "node": ">=8"
2153 | }
2154 | },
2155 | "node_modules/strip-ansi": {
2156 | "version": "5.2.0",
2157 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2158 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2159 | "dev": true,
2160 | "dependencies": {
2161 | "ansi-regex": "^4.1.0"
2162 | },
2163 | "engines": {
2164 | "node": ">=6"
2165 | }
2166 | },
2167 | "node_modules/strip-json-comments": {
2168 | "version": "2.0.1",
2169 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2170 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
2171 | "dev": true,
2172 | "engines": {
2173 | "node": ">=0.10.0"
2174 | }
2175 | },
2176 | "node_modules/supports-color": {
2177 | "version": "5.5.0",
2178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2179 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2180 | "dev": true,
2181 | "dependencies": {
2182 | "has-flag": "^3.0.0"
2183 | },
2184 | "engines": {
2185 | "node": ">=4"
2186 | }
2187 | },
2188 | "node_modules/term-size": {
2189 | "version": "2.2.0",
2190 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
2191 | "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
2192 | "dev": true,
2193 | "engines": {
2194 | "node": ">=8"
2195 | },
2196 | "funding": {
2197 | "url": "https://github.com/sponsors/sindresorhus"
2198 | }
2199 | },
2200 | "node_modules/to-readable-stream": {
2201 | "version": "1.0.0",
2202 | "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
2203 | "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
2204 | "dev": true,
2205 | "engines": {
2206 | "node": ">=6"
2207 | }
2208 | },
2209 | "node_modules/to-regex-range": {
2210 | "version": "5.0.1",
2211 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2212 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2213 | "dev": true,
2214 | "dependencies": {
2215 | "is-number": "^7.0.0"
2216 | },
2217 | "engines": {
2218 | "node": ">=8.0"
2219 | }
2220 | },
2221 | "node_modules/toidentifier": {
2222 | "version": "1.0.1",
2223 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
2224 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
2225 | "engines": {
2226 | "node": ">=0.6"
2227 | }
2228 | },
2229 | "node_modules/touch": {
2230 | "version": "3.1.0",
2231 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
2232 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
2233 | "dev": true,
2234 | "dependencies": {
2235 | "nopt": "~1.0.10"
2236 | },
2237 | "bin": {
2238 | "nodetouch": "bin/nodetouch.js"
2239 | }
2240 | },
2241 | "node_modules/tr46": {
2242 | "version": "3.0.0",
2243 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
2244 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
2245 | "dependencies": {
2246 | "punycode": "^2.1.1"
2247 | },
2248 | "engines": {
2249 | "node": ">=12"
2250 | }
2251 | },
2252 | "node_modules/type-fest": {
2253 | "version": "0.8.1",
2254 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
2255 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
2256 | "dev": true,
2257 | "engines": {
2258 | "node": ">=8"
2259 | }
2260 | },
2261 | "node_modules/type-is": {
2262 | "version": "1.6.18",
2263 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2264 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2265 | "dependencies": {
2266 | "media-typer": "0.3.0",
2267 | "mime-types": "~2.1.24"
2268 | },
2269 | "engines": {
2270 | "node": ">= 0.6"
2271 | }
2272 | },
2273 | "node_modules/typedarray": {
2274 | "version": "0.0.6",
2275 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
2276 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
2277 | },
2278 | "node_modules/typedarray-to-buffer": {
2279 | "version": "3.1.5",
2280 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
2281 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
2282 | "dev": true,
2283 | "dependencies": {
2284 | "is-typedarray": "^1.0.0"
2285 | }
2286 | },
2287 | "node_modules/undefsafe": {
2288 | "version": "2.0.3",
2289 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
2290 | "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
2291 | "dev": true,
2292 | "dependencies": {
2293 | "debug": "^2.2.0"
2294 | }
2295 | },
2296 | "node_modules/unique-string": {
2297 | "version": "2.0.0",
2298 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
2299 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
2300 | "dev": true,
2301 | "dependencies": {
2302 | "crypto-random-string": "^2.0.0"
2303 | },
2304 | "engines": {
2305 | "node": ">=8"
2306 | }
2307 | },
2308 | "node_modules/unpipe": {
2309 | "version": "1.0.0",
2310 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2311 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
2312 | "engines": {
2313 | "node": ">= 0.8"
2314 | }
2315 | },
2316 | "node_modules/update-notifier": {
2317 | "version": "4.1.3",
2318 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz",
2319 | "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==",
2320 | "dev": true,
2321 | "dependencies": {
2322 | "boxen": "^4.2.0",
2323 | "chalk": "^3.0.0",
2324 | "configstore": "^5.0.1",
2325 | "has-yarn": "^2.1.0",
2326 | "import-lazy": "^2.1.0",
2327 | "is-ci": "^2.0.0",
2328 | "is-installed-globally": "^0.3.1",
2329 | "is-npm": "^4.0.0",
2330 | "is-yarn-global": "^0.3.0",
2331 | "latest-version": "^5.0.0",
2332 | "pupa": "^2.0.1",
2333 | "semver-diff": "^3.1.1",
2334 | "xdg-basedir": "^4.0.0"
2335 | },
2336 | "engines": {
2337 | "node": ">=8"
2338 | },
2339 | "funding": {
2340 | "url": "https://github.com/yeoman/update-notifier?sponsor=1"
2341 | }
2342 | },
2343 | "node_modules/url-parse-lax": {
2344 | "version": "3.0.0",
2345 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
2346 | "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
2347 | "dev": true,
2348 | "dependencies": {
2349 | "prepend-http": "^2.0.0"
2350 | },
2351 | "engines": {
2352 | "node": ">=4"
2353 | }
2354 | },
2355 | "node_modules/util-deprecate": {
2356 | "version": "1.0.2",
2357 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2358 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2359 | },
2360 | "node_modules/utils-merge": {
2361 | "version": "1.0.1",
2362 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2363 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
2364 | "engines": {
2365 | "node": ">= 0.4.0"
2366 | }
2367 | },
2368 | "node_modules/vary": {
2369 | "version": "1.1.2",
2370 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2371 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
2372 | "engines": {
2373 | "node": ">= 0.8"
2374 | }
2375 | },
2376 | "node_modules/webidl-conversions": {
2377 | "version": "7.0.0",
2378 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2379 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
2380 | "engines": {
2381 | "node": ">=12"
2382 | }
2383 | },
2384 | "node_modules/whatwg-url": {
2385 | "version": "11.0.0",
2386 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
2387 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
2388 | "dependencies": {
2389 | "tr46": "^3.0.0",
2390 | "webidl-conversions": "^7.0.0"
2391 | },
2392 | "engines": {
2393 | "node": ">=12"
2394 | }
2395 | },
2396 | "node_modules/widest-line": {
2397 | "version": "3.1.0",
2398 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
2399 | "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
2400 | "dev": true,
2401 | "dependencies": {
2402 | "string-width": "^4.0.0"
2403 | },
2404 | "engines": {
2405 | "node": ">=8"
2406 | }
2407 | },
2408 | "node_modules/wrappy": {
2409 | "version": "1.0.2",
2410 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2411 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2412 | "dev": true
2413 | },
2414 | "node_modules/write-file-atomic": {
2415 | "version": "3.0.3",
2416 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
2417 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
2418 | "dev": true,
2419 | "dependencies": {
2420 | "imurmurhash": "^0.1.4",
2421 | "is-typedarray": "^1.0.0",
2422 | "signal-exit": "^3.0.2",
2423 | "typedarray-to-buffer": "^3.1.5"
2424 | }
2425 | },
2426 | "node_modules/xdg-basedir": {
2427 | "version": "4.0.0",
2428 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
2429 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
2430 | "dev": true,
2431 | "engines": {
2432 | "node": ">=8"
2433 | }
2434 | },
2435 | "node_modules/xtend": {
2436 | "version": "4.0.2",
2437 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
2438 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
2439 | "engines": {
2440 | "node": ">=0.4"
2441 | }
2442 | }
2443 | }
2444 | }
2445 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "imgcrud",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index",
8 | "server": "nodemon index"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "cloudinary": "^1.41.0",
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.3.1",
17 | "express": "^4.18.2",
18 | "mongoose": "^7.5.4",
19 | "multer": "^1.4.5-lts.1",
20 | "react-router-dom": "^6.16.0"
21 | },
22 | "engines": {
23 | "node": ">=18.17.0",
24 | "npm": ">=9.8.1"
25 | },
26 | "devDependencies": {
27 | "nodemon": "^2.0.4"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/server/routes/user.js:
--------------------------------------------------------------------------------
1 | const router = require("express").Router();
2 | const cloudinary = require("../utils/cloudinary");
3 | const upload = require("../utils/multer");
4 | const User = require("../model/user");
5 |
6 | router.post("/", upload.single("image"), async (req, res) => {
7 | try {
8 | // Upload image to cloudinary
9 | const result = await cloudinary.uploader.upload(req.file.path);
10 | // Create new user
11 | let user = new User({
12 | name: req.body.name,
13 | avatar: result.secure_url,
14 | cloudinary_id: result.public_id,
15 | });
16 | // Save user
17 | await user.save();
18 | res.json(user);
19 | } catch (err) {
20 | console.log(err);
21 | }
22 | });
23 |
24 | router.get("/", async (req, res) => {
25 | try {
26 | let user = await User.find();
27 | res.json(user);
28 | } catch (err) {
29 | console.log(err);
30 | }
31 | });
32 |
33 | router.delete("/:id", async (req, res) => {
34 | try {
35 | // Find user by id
36 | let user = await User.findById(req.params.id);
37 |
38 | // Check if the user is found
39 | if (!user) {
40 | return res
41 | .status(404)
42 | .json({ success: false, message: "User not found" });
43 | }
44 |
45 | // Delete image from cloudinary
46 | await cloudinary.uploader.destroy(user.cloudinary_id);
47 |
48 | // Delete user from db
49 | await user.deleteOne();
50 |
51 | res.json(user);
52 | } catch (err) {
53 | console.log(err);
54 | res.status(500).json({ success: false, message: "Internal Server Error" });
55 | }
56 | });
57 |
58 | router.put("/:id", upload.single("image"), async (req, res) => {
59 | try {
60 | let user = await User.findById(req.params.id);
61 | // Delete image from cloudinary
62 |
63 | // Check if the user is found
64 | if (!user) {
65 | return res
66 | .status(404)
67 | .json({ success: false, message: "User not found" });
68 | }
69 |
70 | await cloudinary.uploader.destroy(user.cloudinary_id);
71 | // Upload image to cloudinary
72 | let result;
73 | if (req.file) {
74 | result = await cloudinary.uploader.upload(req.file.path);
75 | }
76 | const data = {
77 | name: req.body.name || user.name,
78 | avatar: result?.secure_url || user.avatar,
79 | cloudinary_id: result?.public_id || user.cloudinary_id,
80 | };
81 | user = await User.findByIdAndUpdate(req.params.id, data, { new: true });
82 | res.json(user);
83 | } catch (err) {
84 | console.log(err);
85 | }
86 | });
87 |
88 | router.get("/:id", async (req, res) => {
89 | try {
90 | // Find user by id
91 | let user = await User.findById(req.params.id);
92 |
93 | // Check if the user is found
94 | if (!user) {
95 | return res
96 | .status(404)
97 | .json({ success: false, message: "User not found" });
98 | }
99 | res.json(user);
100 | } catch (err) {
101 | console.log(err);
102 | }
103 | });
104 |
105 | module.exports = router;
106 |
--------------------------------------------------------------------------------
/server/utils/cloudinary.js:
--------------------------------------------------------------------------------
1 | const cloudinary = require("cloudinary").v2;
2 |
3 | cloudinary.config({
4 | cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
5 | api_key: process.env.CLOUDINARY_API_KEY,
6 | api_secret: process.env.CLOUDINARY_API_SECRET,
7 | });
8 |
9 | module.exports = cloudinary;
10 |
--------------------------------------------------------------------------------
/server/utils/multer.js:
--------------------------------------------------------------------------------
1 | const multer = require("multer");
2 | const path = require("path");
3 |
4 | // Multer config
5 | module.exports = multer({
6 | storage: multer.diskStorage({}),
7 | fileFilter: (req, file, cb) => {
8 | let ext = path.extname(file.originalname);
9 | if (ext !== ".jpg" && ext !== ".jpeg" && ext !== ".png") {
10 | cb(new Error("File type is not supported"), false);
11 | return;
12 | }
13 | cb(null, true);
14 | },
15 | });
--------------------------------------------------------------------------------