├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── README.md ├── backend ├── .dockerignore ├── .env.example ├── .gitignore ├── Dockerfile ├── app.js ├── config │ └── db.js ├── controllers │ ├── courseController.js │ └── userController.js ├── middlewares │ ├── asyncHandler.js │ └── errorHandler.js ├── models │ ├── Course.js │ └── user.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── routes │ ├── courseRoutes.js │ └── userRoutes.js └── validations │ ├── apiErrors.js │ └── courseValidation.js ├── docker-compose.yml └── frontend ├── IDE.html ├── Images ├── c++-thumbnail.jpg ├── codex100-logo.png ├── java-thumbnail.jpg ├── javascript-thumbnail.jpg └── python-thumbnail.jpg ├── index.html ├── login.html ├── script.js └── styles.css /.gitignore: -------------------------------------------------------------------------------- 1 | # Backend (Express.js) 2 | backend/node_modules/ 3 | backend/npm-debug.log 4 | backend/yarn-error.log 5 | backend/.env 6 | backend/logs/ 7 | backend/*.log 8 | backend/pids/ 9 | backend/*.pid 10 | backend/*.pid.lock 11 | 12 | # Frontend (HTML, CSS, JS) 13 | frontend/node_modules/ 14 | frontend/dist/ 15 | frontend/build/ 16 | frontend/*.cache 17 | frontend/*.bak 18 | 19 | # Common dependency directories 20 | node_modules/ 21 | 22 | # IDE files 23 | .vscode/ 24 | .idea/ 25 | *.suo 26 | .ntvs 27 | *.njsproj 28 | *.sln 29 | 30 | # Operating system files 31 | .DS_Store 32 | Thumbs.db 33 | 34 | # Temporary files 35 | *.tmp 36 | *.swp 37 | 38 | # Coverage directory 39 | backend/coverage/ 40 | frontend/coverage/ 41 | 42 | # Log and error files 43 | *.log 44 | *.error.log 45 | 46 | # Build and dist files for both backend and frontend 47 | backend/build/ 48 | frontend/build/ -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | As contributors and maintainers of this project, we pledge to respect everyone who contributes by following these principles: 4 | 5 | - Be respectful and inclusive. 6 | - Avoid discriminatory or inappropriate language. 7 | - Provide constructive feedback and help others grow. 8 | 9 | If you encounter behavior that violates this code, please report it by contacting us at [LinkedIn](https://www.linkedin.com/in/arshad-patel/) 10 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to codeX100 2 | 3 | Thank you for considering contributing to **codeX100**! We appreciate your help in improving our platform. Please read these guidelines before starting your contributions. 4 | 5 | ## How to Contribute 6 | 7 | 1. Fork this repository. 8 | 2. Clone your forked repo to your local machine. 9 | 3. Create a new branch for your feature or bug fix: `git checkout -b feature-branch` 10 | 4. Make your changes, and commit them: `git commit -m "Description of changes"` 11 | 5. Push the changes to your fork: `git push origin feature-branch` 12 | 6. Submit a pull request to the `main` branch of this repository. 13 | 14 | ## Guidelines 15 | 16 | - Ensure your code is clean, readable, and follows our coding standards. 17 | - Document any new functionality in the `README.md` file. 18 | - Ensure all tests pass before submitting a pull request. 19 | - Please reference the issue number in your pull request. 20 | - If you're working on a feature, ensure it’s well-scoped and self-contained. 21 | 22 | ## Reporting Issues 23 | 24 | If you find any bugs or have ideas for new features, please create an issue. Describe the problem or suggestion in detail to help us understand how to address it. 25 | 26 | ## Code of Conduct 27 | 28 | By participating in this project, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md). 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Course Management API 2 | 3 | This API provides a robust solution for managing courses, enabling users to create, read, update, and delete course information. 4 | 5 | ## Installation 6 | 7 | ### With Docker 8 | 9 |
10 | 11 | Click Me 12 | 13 | 14 | 1. Clone the repository 15 | 2. Use docker-compose to run the server 16 | 17 | ```bash 18 | git clone https://github.com/arshadpatel/codeX100.git 19 | cd codeX100 20 | docker-compose up -d 21 | ``` 22 | 23 |
24 | 25 | ### Without Docker 26 | 27 |
28 | 29 | Click Me 30 | 31 | 32 | 1. Clone the repository 33 | 2. Install the dependencies 34 | 3. Run the server 35 | 36 | ```bash 37 | git clone https://github.com/arshadpatel/codeX100.git 38 | cd codeX100 39 | cd backend 40 | pnpm install 41 | pnpm dev 42 | ``` 43 | 44 |
45 | 46 | 47 | ### NOTE: Setup environment variable in .env from .env.example 48 | 49 | ## Usage 50 | To use the API, you can make HTTP requests to the endpoints provided. 51 | 52 | ## Endpoints: 53 | - **POST /courses**: Add a new course (requires name, price, and description). 54 | - **GET /courses**: Retrieve a list of available courses. 55 | - **GET /courses/:id**: Retrieve details of a specific course. 56 | - **PUT /courses/:id**: Update an existing course's details. 57 | - **DELETE /courses/:id**: Remove a course from the system. 58 | 59 | ## Validation: 60 | All endpoints ensure proper validation using zod for course data, including name, price, and description, to maintain data integrity. 61 | 62 | ## Contributing 63 | If you would like to contribute, please read our [Contributing Guide](CONTRIBUTING.md). 64 | 65 | -------------------------------------------------------------------------------- /backend/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .git 4 | .gitignore 5 | .env.example -------------------------------------------------------------------------------- /backend/.env.example: -------------------------------------------------------------------------------- 1 | DB_URI= 2 | PORT= 3 | REFRESH_TOKEN_SECRET= 4 | REFRESH_TOKEN_EXPIRY= 5 | ACCESS_TOKEN_SECRET= 6 | ACCESS_TOKEN_EXPIRY= 7 | 8 | # For Docker 9 | DB_URI=mongodb://mongodb:27017/codex100 10 | 11 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules/ 3 | /build 4 | /dist -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:22-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | RUN corepack enable pnpm && corepack prepare pnpm@latest --activate 6 | 7 | COPY package.json pnpm-lock.yaml ./ 8 | 9 | RUN \ 10 | if [ -f pnpm-lock.yaml ]; then \ 11 | pnpm install --frozen-lockfile --ignore-scripts; \ 12 | else \ 13 | echo "pnpm-lock.yaml not found" && exit 1; \ 14 | fi 15 | 16 | COPY . . 17 | 18 | CMD ["pnpm", "dev"] -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import express from 'express'; 3 | import connectDB from './config/db.js'; 4 | import courseRoutes from './routes/courseRoutes.js'; 5 | import userRoutes from './routes/userRoutes.js'; 6 | import morgan from 'morgan'; 7 | dotenv.config(); 8 | const app = express(); 9 | 10 | // Notice: Use bcryptjs or argon2 for hashing instead of bcrypt to prevent error in docker enviornment 11 | 12 | const PORT = process.env.PORT || 5000; 13 | const DB_URI = process.env.DB_URI; 14 | // Connect Database 15 | connectDB(); 16 | 17 | // Middleware 18 | app.use(express.json()); // For parsing application/json 19 | app.use(morgan('dev')); 20 | app.use(express.urlencoded({ extended: true })); 21 | 22 | // API Routes 23 | app.use('/api', courseRoutes); 24 | app.use('/api/user', userRoutes); 25 | 26 | // Healthcheck route for development 27 | app.get("/healtcheck", (_, res) => { 28 | res.send("Everything is fine & server is listening on port " + PORT); 29 | }); 30 | 31 | // Handle 404 32 | app.use("*", (req, res) => { 33 | res.status(404).json({ success: false, message: "Route not found" }); 34 | }); 35 | 36 | app.listen(PORT, () => { 37 | console.log(`Server running on port ${PORT}`); 38 | }); 39 | -------------------------------------------------------------------------------- /backend/config/db.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | import dotenv from 'dotenv'; 3 | 4 | dotenv.config(); 5 | 6 | const connectDB = async () => { 7 | try { 8 | const uri = process.env.DB_URI; // Use DB_URI instead of MONGODB_URI 9 | if (!uri) { 10 | throw new Error('DB_URI is not defined in .env file'); 11 | } 12 | 13 | await mongoose.connect(uri, { 14 | useNewUrlParser: true, 15 | useUnifiedTopology: true, 16 | }); 17 | console.log('MongoDB connected successfully.'); 18 | } catch (error) { 19 | console.error('MongoDB connection failed:', error.message); 20 | process.exit(1); 21 | } 22 | }; 23 | 24 | export default connectDB; 25 | -------------------------------------------------------------------------------- /backend/controllers/courseController.js: -------------------------------------------------------------------------------- 1 | import Course from '../models/Course.js'; 2 | import { courseSchema } from '../validations/courseValidation.js'; 3 | 4 | // Create a new course 5 | export const createCourse = async (req, res) => { 6 | try { 7 | const validatedData = courseSchema.parse(req.body); 8 | const course = new Course(validatedData); 9 | await course.save(); 10 | res.status(201).json(course); 11 | } catch (error) { 12 | res.status(400).json({ error: error.errors || error.message }); 13 | } 14 | }; 15 | 16 | // Get all courses 17 | export const getCourses = async (req, res) => { 18 | try { 19 | const courses = await Course.find(); 20 | res.json(courses); 21 | } catch (error) { 22 | res.status(500).json({ error: error.message }); 23 | } 24 | }; 25 | 26 | // Update a course 27 | export const updateCourse = async (req, res) => { 28 | try { 29 | const validatedData = courseSchema.parse(req.body); 30 | const course = await Course.findByIdAndUpdate(req.params.id, validatedData, { new: true }); 31 | if (!course) return res.status(404).json({ error: 'Course not found.' }); 32 | res.json(course); 33 | } catch (error) { 34 | res.status(400).json({ error: error.errors || error.message }); 35 | } 36 | }; 37 | 38 | // Delete a course 39 | export const deleteCourse = async (req, res) => { 40 | try { 41 | const course = await Course.findByIdAndDelete(req.params.id); 42 | if (!course) return res.status(404).json({ error: 'Course not found.' }); 43 | res.status(200).json({ message: 'Course deleted successfully.' }); 44 | } catch (error) { 45 | res.status(500).json({ error: error.message }); 46 | } 47 | }; 48 | -------------------------------------------------------------------------------- /backend/controllers/userController.js: -------------------------------------------------------------------------------- 1 | import { User } from "../models/user.js"; 2 | import { asyncHandler } from "../middlewares/asyncHandler.js"; 3 | import {ApiError} from "../validations/apiErrors.js"; 4 | 5 | const generateAccessAndRefereshTokens = async (userId) => { 6 | try { 7 | const user = await User.findById(userId); 8 | const accessToken = user.generateAccessToken(); 9 | const refreshToken = user.generateRefreshToken(); 10 | user.refreshToken = refreshToken; 11 | await user.save({ validateBeforeSave: false }); 12 | 13 | return { accessToken, refreshToken }; 14 | } catch (error) { 15 | throw new ApiError( 16 | 500, "Something went wrong while generating referesh and access token" 17 | ); 18 | } 19 | }; 20 | 21 | export const signupUser = asyncHandler(async (req, res) => { 22 | const { fullName, email, username, password } = req.body; 23 | 24 | if ( 25 | [fullName, email, username, password].some((field) => field?.trim() === "") 26 | ) { 27 | throw new ApiError(400, "All fields are required"); 28 | } 29 | 30 | const existUser = await User.findOne({ 31 | $or: [{ email }, { username }], 32 | }); 33 | 34 | if (existUser) { 35 | throw new ApiError(409, "User with email or username already exists") 36 | } 37 | 38 | 39 | const user = await User.create({ 40 | fullName, 41 | email, 42 | password, 43 | username: username.toLowerCase(), 44 | }); 45 | 46 | const createdUser = await User.findById(user._id).select( 47 | "-password -refreshToken" 48 | ); 49 | 50 | if (!createdUser) { 51 | throw new ApiError(500, "Something went wrong while registering the user") 52 | } 53 | 54 | return res.status(200).json({ createdUser }); 55 | }); 56 | 57 | export const loginUser = asyncHandler(async (req, res) => { 58 | const { email, username, password } = req.body; 59 | 60 | if (!username && !email) { 61 | throw new ApiError(400, "username or email is required") 62 | } 63 | 64 | const user = await User.findOne({ 65 | $or: [{ username }, { email }], 66 | }); 67 | 68 | if (!user) { 69 | throw new ApiError(404, "User does not exist") 70 | } 71 | 72 | const isPasswordValid = await user.isPasswordCorrect(password); 73 | 74 | if (!isPasswordValid) { 75 | throw new ApiError(401, "Invalid user credentials") 76 | } 77 | 78 | const { accessToken, refreshToken } = await generateAccessAndRefereshTokens( 79 | user._id 80 | ); 81 | 82 | const loggedInUser = await User.findById(user._id).select( 83 | "-password -refreshToken" 84 | ); 85 | 86 | const options = { 87 | httpOnly: true, 88 | secure: true, 89 | }; 90 | 91 | return res 92 | .status(200) 93 | .cookie("accessToken", accessToken, options) 94 | .cookie("refreshToken", refreshToken, options) 95 | .json({ 96 | user: loggedInUser, 97 | accessToken, 98 | refreshToken, 99 | }); 100 | }); 101 | -------------------------------------------------------------------------------- /backend/middlewares/asyncHandler.js: -------------------------------------------------------------------------------- 1 | const asyncHandler = (fn) => { 2 | return async (req, res, next) => { 3 | try { 4 | await fn(req, res, next); 5 | } catch (error) { 6 | console.log("asyncHandler error: ", error); 7 | 8 | } 9 | } 10 | 11 | } 12 | 13 | export {asyncHandler}; -------------------------------------------------------------------------------- /backend/middlewares/errorHandler.js: -------------------------------------------------------------------------------- 1 | const errorHandler = (err, req, res, next) => { 2 | res.status(err.status || 500).json({ error: err.message || 'Server Error' }); 3 | }; 4 | 5 | export default errorHandler; 6 | -------------------------------------------------------------------------------- /backend/models/Course.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | 3 | const courseSchema = new mongoose.Schema({ 4 | name: { 5 | type: String, 6 | required: true, 7 | trim: true, 8 | }, 9 | price: { 10 | type: Number, 11 | required: true, 12 | min: 0 13 | }, 14 | description: { 15 | type: String, 16 | required: true, 17 | trim: true 18 | }, 19 | }); 20 | 21 | const Course = mongoose.model("Course", courseSchema); 22 | export default Course; 23 | -------------------------------------------------------------------------------- /backend/models/user.js: -------------------------------------------------------------------------------- 1 | import mongoose, { Schema } from "mongoose"; 2 | import jwt from "jsonwebtoken"; 3 | import bcrypt from "bcrypt"; 4 | 5 | const userSchema = new Schema( 6 | { 7 | username: { 8 | type: String, 9 | required: true, 10 | unique: true, 11 | lowercase: true, 12 | trim: true, 13 | }, 14 | email: { 15 | type: String, 16 | required: true, 17 | lowercase: true, 18 | unique: true, 19 | trim: true, 20 | }, 21 | password: { 22 | type: String, 23 | required: true, 24 | }, 25 | fullName: { 26 | type: String, 27 | trim: true, 28 | }, 29 | refreshToken: { 30 | type: String, 31 | }, 32 | }, 33 | { 34 | timestamps: true, 35 | } 36 | ); 37 | userSchema.pre("save", async function (next) { 38 | if (!this.isModified("password")) return next(); 39 | 40 | this.password = await bcrypt.hash(this.password, 10); 41 | next(); 42 | }); 43 | 44 | userSchema.methods.isPasswordCorrect = async function (password) { 45 | return await bcrypt.compare(password, this.password); 46 | }; 47 | 48 | userSchema.methods.generateAccessToken = function () { 49 | return jwt.sign( 50 | { 51 | _id: this._id, 52 | username: this.username, 53 | email: this.email, 54 | fullName: this.fullName, 55 | }, 56 | process.env.ACCESS_TOKEN_SECRET, 57 | { 58 | expiresIn: process.env.ACCESS_TOKEN_EXPIRY, 59 | } 60 | ); 61 | }; 62 | 63 | userSchema.methods.generateRefreshToken = function () { 64 | return jwt.sign( 65 | { 66 | _id: this._id, 67 | }, 68 | process.env.REFRESH_TOKEN_SECRET, 69 | { 70 | expiresIn: process.env.REFRESH_TOKEN_EXPIRY, 71 | } 72 | ); 73 | }; 74 | 75 | export const User = mongoose.model("User", userSchema); 76 | -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codex100", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "codex100", 9 | "version": "1.0.0", 10 | "hasInstallScript": true, 11 | "license": "ISC", 12 | "dependencies": { 13 | "dotenv": "^16.4.5", 14 | "express": "^4.21.0", 15 | "mongoose": "^8.7.0", 16 | "morgan": "^1.10.0", 17 | "zod": "^3.23.8" 18 | }, 19 | "devDependencies": { 20 | "nodemon": "^3.1.7" 21 | } 22 | }, 23 | "node_modules/@mongodb-js/saslprep": { 24 | "version": "1.1.9", 25 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", 26 | "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", 27 | "license": "MIT", 28 | "dependencies": { 29 | "sparse-bitfield": "^3.0.3" 30 | } 31 | }, 32 | "node_modules/@types/webidl-conversions": { 33 | "version": "7.0.3", 34 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 35 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", 36 | "license": "MIT" 37 | }, 38 | "node_modules/@types/whatwg-url": { 39 | "version": "11.0.5", 40 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", 41 | "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", 42 | "license": "MIT", 43 | "dependencies": { 44 | "@types/webidl-conversions": "*" 45 | } 46 | }, 47 | "node_modules/accepts": { 48 | "version": "1.3.8", 49 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 50 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 51 | "license": "MIT", 52 | "dependencies": { 53 | "mime-types": "~2.1.34", 54 | "negotiator": "0.6.3" 55 | }, 56 | "engines": { 57 | "node": ">= 0.6" 58 | } 59 | }, 60 | "node_modules/anymatch": { 61 | "version": "3.1.3", 62 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 63 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 64 | "dev": true, 65 | "license": "ISC", 66 | "dependencies": { 67 | "normalize-path": "^3.0.0", 68 | "picomatch": "^2.0.4" 69 | }, 70 | "engines": { 71 | "node": ">= 8" 72 | } 73 | }, 74 | "node_modules/array-flatten": { 75 | "version": "1.1.1", 76 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 77 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 78 | "license": "MIT" 79 | }, 80 | "node_modules/balanced-match": { 81 | "version": "1.0.2", 82 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 83 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 84 | "dev": true, 85 | "license": "MIT" 86 | }, 87 | "node_modules/basic-auth": { 88 | "version": "2.0.1", 89 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 90 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 91 | "license": "MIT", 92 | "dependencies": { 93 | "safe-buffer": "5.1.2" 94 | }, 95 | "engines": { 96 | "node": ">= 0.8" 97 | } 98 | }, 99 | "node_modules/basic-auth/node_modules/safe-buffer": { 100 | "version": "5.1.2", 101 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 102 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 103 | "license": "MIT" 104 | }, 105 | "node_modules/binary-extensions": { 106 | "version": "2.3.0", 107 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 108 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 109 | "dev": true, 110 | "license": "MIT", 111 | "engines": { 112 | "node": ">=8" 113 | }, 114 | "funding": { 115 | "url": "https://github.com/sponsors/sindresorhus" 116 | } 117 | }, 118 | "node_modules/body-parser": { 119 | "version": "1.20.3", 120 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 121 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 122 | "license": "MIT", 123 | "dependencies": { 124 | "bytes": "3.1.2", 125 | "content-type": "~1.0.5", 126 | "debug": "2.6.9", 127 | "depd": "2.0.0", 128 | "destroy": "1.2.0", 129 | "http-errors": "2.0.0", 130 | "iconv-lite": "0.4.24", 131 | "on-finished": "2.4.1", 132 | "qs": "6.13.0", 133 | "raw-body": "2.5.2", 134 | "type-is": "~1.6.18", 135 | "unpipe": "1.0.0" 136 | }, 137 | "engines": { 138 | "node": ">= 0.8", 139 | "npm": "1.2.8000 || >= 1.4.16" 140 | } 141 | }, 142 | "node_modules/brace-expansion": { 143 | "version": "1.1.11", 144 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 145 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 146 | "dev": true, 147 | "license": "MIT", 148 | "dependencies": { 149 | "balanced-match": "^1.0.0", 150 | "concat-map": "0.0.1" 151 | } 152 | }, 153 | "node_modules/braces": { 154 | "version": "3.0.3", 155 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 156 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 157 | "dev": true, 158 | "license": "MIT", 159 | "dependencies": { 160 | "fill-range": "^7.1.1" 161 | }, 162 | "engines": { 163 | "node": ">=8" 164 | } 165 | }, 166 | "node_modules/bson": { 167 | "version": "6.8.0", 168 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", 169 | "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", 170 | "license": "Apache-2.0", 171 | "engines": { 172 | "node": ">=16.20.1" 173 | } 174 | }, 175 | "node_modules/bytes": { 176 | "version": "3.1.2", 177 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 178 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 179 | "license": "MIT", 180 | "engines": { 181 | "node": ">= 0.8" 182 | } 183 | }, 184 | "node_modules/call-bind": { 185 | "version": "1.0.7", 186 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 187 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 188 | "license": "MIT", 189 | "dependencies": { 190 | "es-define-property": "^1.0.0", 191 | "es-errors": "^1.3.0", 192 | "function-bind": "^1.1.2", 193 | "get-intrinsic": "^1.2.4", 194 | "set-function-length": "^1.2.1" 195 | }, 196 | "engines": { 197 | "node": ">= 0.4" 198 | }, 199 | "funding": { 200 | "url": "https://github.com/sponsors/ljharb" 201 | } 202 | }, 203 | "node_modules/chokidar": { 204 | "version": "3.6.0", 205 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 206 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 207 | "dev": true, 208 | "license": "MIT", 209 | "dependencies": { 210 | "anymatch": "~3.1.2", 211 | "braces": "~3.0.2", 212 | "glob-parent": "~5.1.2", 213 | "is-binary-path": "~2.1.0", 214 | "is-glob": "~4.0.1", 215 | "normalize-path": "~3.0.0", 216 | "readdirp": "~3.6.0" 217 | }, 218 | "engines": { 219 | "node": ">= 8.10.0" 220 | }, 221 | "funding": { 222 | "url": "https://paulmillr.com/funding/" 223 | }, 224 | "optionalDependencies": { 225 | "fsevents": "~2.3.2" 226 | } 227 | }, 228 | "node_modules/concat-map": { 229 | "version": "0.0.1", 230 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 231 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 232 | "dev": true, 233 | "license": "MIT" 234 | }, 235 | "node_modules/content-disposition": { 236 | "version": "0.5.4", 237 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 238 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 239 | "license": "MIT", 240 | "dependencies": { 241 | "safe-buffer": "5.2.1" 242 | }, 243 | "engines": { 244 | "node": ">= 0.6" 245 | } 246 | }, 247 | "node_modules/content-type": { 248 | "version": "1.0.5", 249 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 250 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 251 | "license": "MIT", 252 | "engines": { 253 | "node": ">= 0.6" 254 | } 255 | }, 256 | "node_modules/cookie": { 257 | "version": "0.6.0", 258 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 259 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 260 | "license": "MIT", 261 | "engines": { 262 | "node": ">= 0.6" 263 | } 264 | }, 265 | "node_modules/cookie-signature": { 266 | "version": "1.0.6", 267 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 268 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 269 | "license": "MIT" 270 | }, 271 | "node_modules/debug": { 272 | "version": "2.6.9", 273 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 274 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 275 | "license": "MIT", 276 | "dependencies": { 277 | "ms": "2.0.0" 278 | } 279 | }, 280 | "node_modules/define-data-property": { 281 | "version": "1.1.4", 282 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 283 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 284 | "license": "MIT", 285 | "dependencies": { 286 | "es-define-property": "^1.0.0", 287 | "es-errors": "^1.3.0", 288 | "gopd": "^1.0.1" 289 | }, 290 | "engines": { 291 | "node": ">= 0.4" 292 | }, 293 | "funding": { 294 | "url": "https://github.com/sponsors/ljharb" 295 | } 296 | }, 297 | "node_modules/depd": { 298 | "version": "2.0.0", 299 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 300 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 301 | "license": "MIT", 302 | "engines": { 303 | "node": ">= 0.8" 304 | } 305 | }, 306 | "node_modules/destroy": { 307 | "version": "1.2.0", 308 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 309 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 310 | "license": "MIT", 311 | "engines": { 312 | "node": ">= 0.8", 313 | "npm": "1.2.8000 || >= 1.4.16" 314 | } 315 | }, 316 | "node_modules/dotenv": { 317 | "version": "16.4.5", 318 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 319 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 320 | "license": "BSD-2-Clause", 321 | "engines": { 322 | "node": ">=12" 323 | }, 324 | "funding": { 325 | "url": "https://dotenvx.com" 326 | } 327 | }, 328 | "node_modules/ee-first": { 329 | "version": "1.1.1", 330 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 331 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 332 | "license": "MIT" 333 | }, 334 | "node_modules/encodeurl": { 335 | "version": "2.0.0", 336 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 337 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 338 | "license": "MIT", 339 | "engines": { 340 | "node": ">= 0.8" 341 | } 342 | }, 343 | "node_modules/es-define-property": { 344 | "version": "1.0.0", 345 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 346 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 347 | "license": "MIT", 348 | "dependencies": { 349 | "get-intrinsic": "^1.2.4" 350 | }, 351 | "engines": { 352 | "node": ">= 0.4" 353 | } 354 | }, 355 | "node_modules/es-errors": { 356 | "version": "1.3.0", 357 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 358 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 359 | "license": "MIT", 360 | "engines": { 361 | "node": ">= 0.4" 362 | } 363 | }, 364 | "node_modules/escape-html": { 365 | "version": "1.0.3", 366 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 367 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 368 | "license": "MIT" 369 | }, 370 | "node_modules/etag": { 371 | "version": "1.8.1", 372 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 373 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 374 | "license": "MIT", 375 | "engines": { 376 | "node": ">= 0.6" 377 | } 378 | }, 379 | "node_modules/express": { 380 | "version": "4.21.0", 381 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", 382 | "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", 383 | "license": "MIT", 384 | "dependencies": { 385 | "accepts": "~1.3.8", 386 | "array-flatten": "1.1.1", 387 | "body-parser": "1.20.3", 388 | "content-disposition": "0.5.4", 389 | "content-type": "~1.0.4", 390 | "cookie": "0.6.0", 391 | "cookie-signature": "1.0.6", 392 | "debug": "2.6.9", 393 | "depd": "2.0.0", 394 | "encodeurl": "~2.0.0", 395 | "escape-html": "~1.0.3", 396 | "etag": "~1.8.1", 397 | "finalhandler": "1.3.1", 398 | "fresh": "0.5.2", 399 | "http-errors": "2.0.0", 400 | "merge-descriptors": "1.0.3", 401 | "methods": "~1.1.2", 402 | "on-finished": "2.4.1", 403 | "parseurl": "~1.3.3", 404 | "path-to-regexp": "0.1.10", 405 | "proxy-addr": "~2.0.7", 406 | "qs": "6.13.0", 407 | "range-parser": "~1.2.1", 408 | "safe-buffer": "5.2.1", 409 | "send": "0.19.0", 410 | "serve-static": "1.16.2", 411 | "setprototypeof": "1.2.0", 412 | "statuses": "2.0.1", 413 | "type-is": "~1.6.18", 414 | "utils-merge": "1.0.1", 415 | "vary": "~1.1.2" 416 | }, 417 | "engines": { 418 | "node": ">= 0.10.0" 419 | } 420 | }, 421 | "node_modules/fill-range": { 422 | "version": "7.1.1", 423 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 424 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 425 | "dev": true, 426 | "license": "MIT", 427 | "dependencies": { 428 | "to-regex-range": "^5.0.1" 429 | }, 430 | "engines": { 431 | "node": ">=8" 432 | } 433 | }, 434 | "node_modules/finalhandler": { 435 | "version": "1.3.1", 436 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 437 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 438 | "license": "MIT", 439 | "dependencies": { 440 | "debug": "2.6.9", 441 | "encodeurl": "~2.0.0", 442 | "escape-html": "~1.0.3", 443 | "on-finished": "2.4.1", 444 | "parseurl": "~1.3.3", 445 | "statuses": "2.0.1", 446 | "unpipe": "~1.0.0" 447 | }, 448 | "engines": { 449 | "node": ">= 0.8" 450 | } 451 | }, 452 | "node_modules/forwarded": { 453 | "version": "0.2.0", 454 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 455 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 456 | "license": "MIT", 457 | "engines": { 458 | "node": ">= 0.6" 459 | } 460 | }, 461 | "node_modules/fresh": { 462 | "version": "0.5.2", 463 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 464 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 465 | "license": "MIT", 466 | "engines": { 467 | "node": ">= 0.6" 468 | } 469 | }, 470 | "node_modules/fsevents": { 471 | "version": "2.3.3", 472 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 473 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 474 | "dev": true, 475 | "hasInstallScript": true, 476 | "license": "MIT", 477 | "optional": true, 478 | "os": [ 479 | "darwin" 480 | ], 481 | "engines": { 482 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 483 | } 484 | }, 485 | "node_modules/function-bind": { 486 | "version": "1.1.2", 487 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 488 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 489 | "license": "MIT", 490 | "funding": { 491 | "url": "https://github.com/sponsors/ljharb" 492 | } 493 | }, 494 | "node_modules/get-intrinsic": { 495 | "version": "1.2.4", 496 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 497 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 498 | "license": "MIT", 499 | "dependencies": { 500 | "es-errors": "^1.3.0", 501 | "function-bind": "^1.1.2", 502 | "has-proto": "^1.0.1", 503 | "has-symbols": "^1.0.3", 504 | "hasown": "^2.0.0" 505 | }, 506 | "engines": { 507 | "node": ">= 0.4" 508 | }, 509 | "funding": { 510 | "url": "https://github.com/sponsors/ljharb" 511 | } 512 | }, 513 | "node_modules/glob-parent": { 514 | "version": "5.1.2", 515 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 516 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 517 | "dev": true, 518 | "license": "ISC", 519 | "dependencies": { 520 | "is-glob": "^4.0.1" 521 | }, 522 | "engines": { 523 | "node": ">= 6" 524 | } 525 | }, 526 | "node_modules/gopd": { 527 | "version": "1.0.1", 528 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 529 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 530 | "license": "MIT", 531 | "dependencies": { 532 | "get-intrinsic": "^1.1.3" 533 | }, 534 | "funding": { 535 | "url": "https://github.com/sponsors/ljharb" 536 | } 537 | }, 538 | "node_modules/has-flag": { 539 | "version": "3.0.0", 540 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 541 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 542 | "dev": true, 543 | "license": "MIT", 544 | "engines": { 545 | "node": ">=4" 546 | } 547 | }, 548 | "node_modules/has-property-descriptors": { 549 | "version": "1.0.2", 550 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 551 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 552 | "license": "MIT", 553 | "dependencies": { 554 | "es-define-property": "^1.0.0" 555 | }, 556 | "funding": { 557 | "url": "https://github.com/sponsors/ljharb" 558 | } 559 | }, 560 | "node_modules/has-proto": { 561 | "version": "1.0.3", 562 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 563 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 564 | "license": "MIT", 565 | "engines": { 566 | "node": ">= 0.4" 567 | }, 568 | "funding": { 569 | "url": "https://github.com/sponsors/ljharb" 570 | } 571 | }, 572 | "node_modules/has-symbols": { 573 | "version": "1.0.3", 574 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 575 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 576 | "license": "MIT", 577 | "engines": { 578 | "node": ">= 0.4" 579 | }, 580 | "funding": { 581 | "url": "https://github.com/sponsors/ljharb" 582 | } 583 | }, 584 | "node_modules/hasown": { 585 | "version": "2.0.2", 586 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 587 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 588 | "license": "MIT", 589 | "dependencies": { 590 | "function-bind": "^1.1.2" 591 | }, 592 | "engines": { 593 | "node": ">= 0.4" 594 | } 595 | }, 596 | "node_modules/http-errors": { 597 | "version": "2.0.0", 598 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 599 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 600 | "license": "MIT", 601 | "dependencies": { 602 | "depd": "2.0.0", 603 | "inherits": "2.0.4", 604 | "setprototypeof": "1.2.0", 605 | "statuses": "2.0.1", 606 | "toidentifier": "1.0.1" 607 | }, 608 | "engines": { 609 | "node": ">= 0.8" 610 | } 611 | }, 612 | "node_modules/iconv-lite": { 613 | "version": "0.4.24", 614 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 615 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 616 | "license": "MIT", 617 | "dependencies": { 618 | "safer-buffer": ">= 2.1.2 < 3" 619 | }, 620 | "engines": { 621 | "node": ">=0.10.0" 622 | } 623 | }, 624 | "node_modules/ignore-by-default": { 625 | "version": "1.0.1", 626 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 627 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 628 | "dev": true, 629 | "license": "ISC" 630 | }, 631 | "node_modules/inherits": { 632 | "version": "2.0.4", 633 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 634 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 635 | "license": "ISC" 636 | }, 637 | "node_modules/ipaddr.js": { 638 | "version": "1.9.1", 639 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 640 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 641 | "license": "MIT", 642 | "engines": { 643 | "node": ">= 0.10" 644 | } 645 | }, 646 | "node_modules/is-binary-path": { 647 | "version": "2.1.0", 648 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 649 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 650 | "dev": true, 651 | "license": "MIT", 652 | "dependencies": { 653 | "binary-extensions": "^2.0.0" 654 | }, 655 | "engines": { 656 | "node": ">=8" 657 | } 658 | }, 659 | "node_modules/is-extglob": { 660 | "version": "2.1.1", 661 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 662 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 663 | "dev": true, 664 | "license": "MIT", 665 | "engines": { 666 | "node": ">=0.10.0" 667 | } 668 | }, 669 | "node_modules/is-glob": { 670 | "version": "4.0.3", 671 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 672 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 673 | "dev": true, 674 | "license": "MIT", 675 | "dependencies": { 676 | "is-extglob": "^2.1.1" 677 | }, 678 | "engines": { 679 | "node": ">=0.10.0" 680 | } 681 | }, 682 | "node_modules/is-number": { 683 | "version": "7.0.0", 684 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 685 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 686 | "dev": true, 687 | "license": "MIT", 688 | "engines": { 689 | "node": ">=0.12.0" 690 | } 691 | }, 692 | "node_modules/kareem": { 693 | "version": "2.6.3", 694 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", 695 | "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", 696 | "license": "Apache-2.0", 697 | "engines": { 698 | "node": ">=12.0.0" 699 | } 700 | }, 701 | "node_modules/media-typer": { 702 | "version": "0.3.0", 703 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 704 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 705 | "license": "MIT", 706 | "engines": { 707 | "node": ">= 0.6" 708 | } 709 | }, 710 | "node_modules/memory-pager": { 711 | "version": "1.5.0", 712 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 713 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 714 | "license": "MIT" 715 | }, 716 | "node_modules/merge-descriptors": { 717 | "version": "1.0.3", 718 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 719 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 720 | "license": "MIT", 721 | "funding": { 722 | "url": "https://github.com/sponsors/sindresorhus" 723 | } 724 | }, 725 | "node_modules/methods": { 726 | "version": "1.1.2", 727 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 728 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 729 | "license": "MIT", 730 | "engines": { 731 | "node": ">= 0.6" 732 | } 733 | }, 734 | "node_modules/mime": { 735 | "version": "1.6.0", 736 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 737 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 738 | "license": "MIT", 739 | "bin": { 740 | "mime": "cli.js" 741 | }, 742 | "engines": { 743 | "node": ">=4" 744 | } 745 | }, 746 | "node_modules/mime-db": { 747 | "version": "1.52.0", 748 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 749 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 750 | "license": "MIT", 751 | "engines": { 752 | "node": ">= 0.6" 753 | } 754 | }, 755 | "node_modules/mime-types": { 756 | "version": "2.1.35", 757 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 758 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 759 | "license": "MIT", 760 | "dependencies": { 761 | "mime-db": "1.52.0" 762 | }, 763 | "engines": { 764 | "node": ">= 0.6" 765 | } 766 | }, 767 | "node_modules/minimatch": { 768 | "version": "3.1.2", 769 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 770 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 771 | "dev": true, 772 | "license": "ISC", 773 | "dependencies": { 774 | "brace-expansion": "^1.1.7" 775 | }, 776 | "engines": { 777 | "node": "*" 778 | } 779 | }, 780 | "node_modules/mongodb": { 781 | "version": "6.9.0", 782 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.9.0.tgz", 783 | "integrity": "sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==", 784 | "license": "Apache-2.0", 785 | "dependencies": { 786 | "@mongodb-js/saslprep": "^1.1.5", 787 | "bson": "^6.7.0", 788 | "mongodb-connection-string-url": "^3.0.0" 789 | }, 790 | "engines": { 791 | "node": ">=16.20.1" 792 | }, 793 | "peerDependencies": { 794 | "@aws-sdk/credential-providers": "^3.188.0", 795 | "@mongodb-js/zstd": "^1.1.0", 796 | "gcp-metadata": "^5.2.0", 797 | "kerberos": "^2.0.1", 798 | "mongodb-client-encryption": ">=6.0.0 <7", 799 | "snappy": "^7.2.2", 800 | "socks": "^2.7.1" 801 | }, 802 | "peerDependenciesMeta": { 803 | "@aws-sdk/credential-providers": { 804 | "optional": true 805 | }, 806 | "@mongodb-js/zstd": { 807 | "optional": true 808 | }, 809 | "gcp-metadata": { 810 | "optional": true 811 | }, 812 | "kerberos": { 813 | "optional": true 814 | }, 815 | "mongodb-client-encryption": { 816 | "optional": true 817 | }, 818 | "snappy": { 819 | "optional": true 820 | }, 821 | "socks": { 822 | "optional": true 823 | } 824 | } 825 | }, 826 | "node_modules/mongodb-connection-string-url": { 827 | "version": "3.0.1", 828 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", 829 | "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", 830 | "license": "Apache-2.0", 831 | "dependencies": { 832 | "@types/whatwg-url": "^11.0.2", 833 | "whatwg-url": "^13.0.0" 834 | } 835 | }, 836 | "node_modules/mongoose": { 837 | "version": "8.7.0", 838 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.7.0.tgz", 839 | "integrity": "sha512-rUCSF1mMYQXjXYdqEQLLlMD3xbcj2j1/hRn+9VnVj7ipzru/UoUZxlj/hWmteKMAh4EFnDZ+BIrmma9l/0Hi1g==", 840 | "license": "MIT", 841 | "dependencies": { 842 | "bson": "^6.7.0", 843 | "kareem": "2.6.3", 844 | "mongodb": "6.9.0", 845 | "mpath": "0.9.0", 846 | "mquery": "5.0.0", 847 | "ms": "2.1.3", 848 | "sift": "17.1.3" 849 | }, 850 | "engines": { 851 | "node": ">=16.20.1" 852 | }, 853 | "funding": { 854 | "type": "opencollective", 855 | "url": "https://opencollective.com/mongoose" 856 | } 857 | }, 858 | "node_modules/mongoose/node_modules/ms": { 859 | "version": "2.1.3", 860 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 861 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 862 | "license": "MIT" 863 | }, 864 | "node_modules/morgan": { 865 | "version": "1.10.0", 866 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", 867 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 868 | "license": "MIT", 869 | "dependencies": { 870 | "basic-auth": "~2.0.1", 871 | "debug": "2.6.9", 872 | "depd": "~2.0.0", 873 | "on-finished": "~2.3.0", 874 | "on-headers": "~1.0.2" 875 | }, 876 | "engines": { 877 | "node": ">= 0.8.0" 878 | } 879 | }, 880 | "node_modules/morgan/node_modules/on-finished": { 881 | "version": "2.3.0", 882 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 883 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 884 | "license": "MIT", 885 | "dependencies": { 886 | "ee-first": "1.1.1" 887 | }, 888 | "engines": { 889 | "node": ">= 0.8" 890 | } 891 | }, 892 | "node_modules/mpath": { 893 | "version": "0.9.0", 894 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 895 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 896 | "license": "MIT", 897 | "engines": { 898 | "node": ">=4.0.0" 899 | } 900 | }, 901 | "node_modules/mquery": { 902 | "version": "5.0.0", 903 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 904 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 905 | "license": "MIT", 906 | "dependencies": { 907 | "debug": "4.x" 908 | }, 909 | "engines": { 910 | "node": ">=14.0.0" 911 | } 912 | }, 913 | "node_modules/mquery/node_modules/debug": { 914 | "version": "4.3.7", 915 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 916 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 917 | "license": "MIT", 918 | "dependencies": { 919 | "ms": "^2.1.3" 920 | }, 921 | "engines": { 922 | "node": ">=6.0" 923 | }, 924 | "peerDependenciesMeta": { 925 | "supports-color": { 926 | "optional": true 927 | } 928 | } 929 | }, 930 | "node_modules/mquery/node_modules/ms": { 931 | "version": "2.1.3", 932 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 933 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 934 | "license": "MIT" 935 | }, 936 | "node_modules/ms": { 937 | "version": "2.0.0", 938 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 939 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 940 | "license": "MIT" 941 | }, 942 | "node_modules/negotiator": { 943 | "version": "0.6.3", 944 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 945 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 946 | "license": "MIT", 947 | "engines": { 948 | "node": ">= 0.6" 949 | } 950 | }, 951 | "node_modules/nodemon": { 952 | "version": "3.1.7", 953 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", 954 | "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", 955 | "dev": true, 956 | "license": "MIT", 957 | "dependencies": { 958 | "chokidar": "^3.5.2", 959 | "debug": "^4", 960 | "ignore-by-default": "^1.0.1", 961 | "minimatch": "^3.1.2", 962 | "pstree.remy": "^1.1.8", 963 | "semver": "^7.5.3", 964 | "simple-update-notifier": "^2.0.0", 965 | "supports-color": "^5.5.0", 966 | "touch": "^3.1.0", 967 | "undefsafe": "^2.0.5" 968 | }, 969 | "bin": { 970 | "nodemon": "bin/nodemon.js" 971 | }, 972 | "engines": { 973 | "node": ">=10" 974 | }, 975 | "funding": { 976 | "type": "opencollective", 977 | "url": "https://opencollective.com/nodemon" 978 | } 979 | }, 980 | "node_modules/nodemon/node_modules/debug": { 981 | "version": "4.3.7", 982 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 983 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 984 | "dev": true, 985 | "license": "MIT", 986 | "dependencies": { 987 | "ms": "^2.1.3" 988 | }, 989 | "engines": { 990 | "node": ">=6.0" 991 | }, 992 | "peerDependenciesMeta": { 993 | "supports-color": { 994 | "optional": true 995 | } 996 | } 997 | }, 998 | "node_modules/nodemon/node_modules/ms": { 999 | "version": "2.1.3", 1000 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1001 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1002 | "dev": true, 1003 | "license": "MIT" 1004 | }, 1005 | "node_modules/normalize-path": { 1006 | "version": "3.0.0", 1007 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1008 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1009 | "dev": true, 1010 | "license": "MIT", 1011 | "engines": { 1012 | "node": ">=0.10.0" 1013 | } 1014 | }, 1015 | "node_modules/object-inspect": { 1016 | "version": "1.13.2", 1017 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1018 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1019 | "license": "MIT", 1020 | "engines": { 1021 | "node": ">= 0.4" 1022 | }, 1023 | "funding": { 1024 | "url": "https://github.com/sponsors/ljharb" 1025 | } 1026 | }, 1027 | "node_modules/on-finished": { 1028 | "version": "2.4.1", 1029 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1030 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1031 | "license": "MIT", 1032 | "dependencies": { 1033 | "ee-first": "1.1.1" 1034 | }, 1035 | "engines": { 1036 | "node": ">= 0.8" 1037 | } 1038 | }, 1039 | "node_modules/on-headers": { 1040 | "version": "1.0.2", 1041 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1042 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 1043 | "license": "MIT", 1044 | "engines": { 1045 | "node": ">= 0.8" 1046 | } 1047 | }, 1048 | "node_modules/parseurl": { 1049 | "version": "1.3.3", 1050 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1051 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1052 | "license": "MIT", 1053 | "engines": { 1054 | "node": ">= 0.8" 1055 | } 1056 | }, 1057 | "node_modules/path-to-regexp": { 1058 | "version": "0.1.10", 1059 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 1060 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", 1061 | "license": "MIT" 1062 | }, 1063 | "node_modules/picomatch": { 1064 | "version": "2.3.1", 1065 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1066 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1067 | "dev": true, 1068 | "license": "MIT", 1069 | "engines": { 1070 | "node": ">=8.6" 1071 | }, 1072 | "funding": { 1073 | "url": "https://github.com/sponsors/jonschlinkert" 1074 | } 1075 | }, 1076 | "node_modules/proxy-addr": { 1077 | "version": "2.0.7", 1078 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1079 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1080 | "license": "MIT", 1081 | "dependencies": { 1082 | "forwarded": "0.2.0", 1083 | "ipaddr.js": "1.9.1" 1084 | }, 1085 | "engines": { 1086 | "node": ">= 0.10" 1087 | } 1088 | }, 1089 | "node_modules/pstree.remy": { 1090 | "version": "1.1.8", 1091 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1092 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1093 | "dev": true, 1094 | "license": "MIT" 1095 | }, 1096 | "node_modules/punycode": { 1097 | "version": "2.3.1", 1098 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1099 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1100 | "license": "MIT", 1101 | "engines": { 1102 | "node": ">=6" 1103 | } 1104 | }, 1105 | "node_modules/qs": { 1106 | "version": "6.13.0", 1107 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1108 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1109 | "license": "BSD-3-Clause", 1110 | "dependencies": { 1111 | "side-channel": "^1.0.6" 1112 | }, 1113 | "engines": { 1114 | "node": ">=0.6" 1115 | }, 1116 | "funding": { 1117 | "url": "https://github.com/sponsors/ljharb" 1118 | } 1119 | }, 1120 | "node_modules/range-parser": { 1121 | "version": "1.2.1", 1122 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1123 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1124 | "license": "MIT", 1125 | "engines": { 1126 | "node": ">= 0.6" 1127 | } 1128 | }, 1129 | "node_modules/raw-body": { 1130 | "version": "2.5.2", 1131 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1132 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1133 | "license": "MIT", 1134 | "dependencies": { 1135 | "bytes": "3.1.2", 1136 | "http-errors": "2.0.0", 1137 | "iconv-lite": "0.4.24", 1138 | "unpipe": "1.0.0" 1139 | }, 1140 | "engines": { 1141 | "node": ">= 0.8" 1142 | } 1143 | }, 1144 | "node_modules/readdirp": { 1145 | "version": "3.6.0", 1146 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1147 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1148 | "dev": true, 1149 | "license": "MIT", 1150 | "dependencies": { 1151 | "picomatch": "^2.2.1" 1152 | }, 1153 | "engines": { 1154 | "node": ">=8.10.0" 1155 | } 1156 | }, 1157 | "node_modules/safe-buffer": { 1158 | "version": "5.2.1", 1159 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1160 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1161 | "funding": [ 1162 | { 1163 | "type": "github", 1164 | "url": "https://github.com/sponsors/feross" 1165 | }, 1166 | { 1167 | "type": "patreon", 1168 | "url": "https://www.patreon.com/feross" 1169 | }, 1170 | { 1171 | "type": "consulting", 1172 | "url": "https://feross.org/support" 1173 | } 1174 | ], 1175 | "license": "MIT" 1176 | }, 1177 | "node_modules/safer-buffer": { 1178 | "version": "2.1.2", 1179 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1180 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1181 | "license": "MIT" 1182 | }, 1183 | "node_modules/semver": { 1184 | "version": "7.6.3", 1185 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1186 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1187 | "dev": true, 1188 | "license": "ISC", 1189 | "bin": { 1190 | "semver": "bin/semver.js" 1191 | }, 1192 | "engines": { 1193 | "node": ">=10" 1194 | } 1195 | }, 1196 | "node_modules/send": { 1197 | "version": "0.19.0", 1198 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 1199 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 1200 | "license": "MIT", 1201 | "dependencies": { 1202 | "debug": "2.6.9", 1203 | "depd": "2.0.0", 1204 | "destroy": "1.2.0", 1205 | "encodeurl": "~1.0.2", 1206 | "escape-html": "~1.0.3", 1207 | "etag": "~1.8.1", 1208 | "fresh": "0.5.2", 1209 | "http-errors": "2.0.0", 1210 | "mime": "1.6.0", 1211 | "ms": "2.1.3", 1212 | "on-finished": "2.4.1", 1213 | "range-parser": "~1.2.1", 1214 | "statuses": "2.0.1" 1215 | }, 1216 | "engines": { 1217 | "node": ">= 0.8.0" 1218 | } 1219 | }, 1220 | "node_modules/send/node_modules/encodeurl": { 1221 | "version": "1.0.2", 1222 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1223 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1224 | "license": "MIT", 1225 | "engines": { 1226 | "node": ">= 0.8" 1227 | } 1228 | }, 1229 | "node_modules/send/node_modules/ms": { 1230 | "version": "2.1.3", 1231 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1232 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1233 | "license": "MIT" 1234 | }, 1235 | "node_modules/serve-static": { 1236 | "version": "1.16.2", 1237 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 1238 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 1239 | "license": "MIT", 1240 | "dependencies": { 1241 | "encodeurl": "~2.0.0", 1242 | "escape-html": "~1.0.3", 1243 | "parseurl": "~1.3.3", 1244 | "send": "0.19.0" 1245 | }, 1246 | "engines": { 1247 | "node": ">= 0.8.0" 1248 | } 1249 | }, 1250 | "node_modules/set-function-length": { 1251 | "version": "1.2.2", 1252 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1253 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1254 | "license": "MIT", 1255 | "dependencies": { 1256 | "define-data-property": "^1.1.4", 1257 | "es-errors": "^1.3.0", 1258 | "function-bind": "^1.1.2", 1259 | "get-intrinsic": "^1.2.4", 1260 | "gopd": "^1.0.1", 1261 | "has-property-descriptors": "^1.0.2" 1262 | }, 1263 | "engines": { 1264 | "node": ">= 0.4" 1265 | } 1266 | }, 1267 | "node_modules/setprototypeof": { 1268 | "version": "1.2.0", 1269 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1270 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1271 | "license": "ISC" 1272 | }, 1273 | "node_modules/side-channel": { 1274 | "version": "1.0.6", 1275 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1276 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1277 | "license": "MIT", 1278 | "dependencies": { 1279 | "call-bind": "^1.0.7", 1280 | "es-errors": "^1.3.0", 1281 | "get-intrinsic": "^1.2.4", 1282 | "object-inspect": "^1.13.1" 1283 | }, 1284 | "engines": { 1285 | "node": ">= 0.4" 1286 | }, 1287 | "funding": { 1288 | "url": "https://github.com/sponsors/ljharb" 1289 | } 1290 | }, 1291 | "node_modules/sift": { 1292 | "version": "17.1.3", 1293 | "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", 1294 | "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", 1295 | "license": "MIT" 1296 | }, 1297 | "node_modules/simple-update-notifier": { 1298 | "version": "2.0.0", 1299 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 1300 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 1301 | "dev": true, 1302 | "license": "MIT", 1303 | "dependencies": { 1304 | "semver": "^7.5.3" 1305 | }, 1306 | "engines": { 1307 | "node": ">=10" 1308 | } 1309 | }, 1310 | "node_modules/sparse-bitfield": { 1311 | "version": "3.0.3", 1312 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1313 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1314 | "license": "MIT", 1315 | "dependencies": { 1316 | "memory-pager": "^1.0.2" 1317 | } 1318 | }, 1319 | "node_modules/statuses": { 1320 | "version": "2.0.1", 1321 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1322 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1323 | "license": "MIT", 1324 | "engines": { 1325 | "node": ">= 0.8" 1326 | } 1327 | }, 1328 | "node_modules/supports-color": { 1329 | "version": "5.5.0", 1330 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1331 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1332 | "dev": true, 1333 | "license": "MIT", 1334 | "dependencies": { 1335 | "has-flag": "^3.0.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">=4" 1339 | } 1340 | }, 1341 | "node_modules/to-regex-range": { 1342 | "version": "5.0.1", 1343 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1344 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1345 | "dev": true, 1346 | "license": "MIT", 1347 | "dependencies": { 1348 | "is-number": "^7.0.0" 1349 | }, 1350 | "engines": { 1351 | "node": ">=8.0" 1352 | } 1353 | }, 1354 | "node_modules/toidentifier": { 1355 | "version": "1.0.1", 1356 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1357 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1358 | "license": "MIT", 1359 | "engines": { 1360 | "node": ">=0.6" 1361 | } 1362 | }, 1363 | "node_modules/touch": { 1364 | "version": "3.1.1", 1365 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", 1366 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", 1367 | "dev": true, 1368 | "license": "ISC", 1369 | "bin": { 1370 | "nodetouch": "bin/nodetouch.js" 1371 | } 1372 | }, 1373 | "node_modules/tr46": { 1374 | "version": "4.1.1", 1375 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", 1376 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", 1377 | "license": "MIT", 1378 | "dependencies": { 1379 | "punycode": "^2.3.0" 1380 | }, 1381 | "engines": { 1382 | "node": ">=14" 1383 | } 1384 | }, 1385 | "node_modules/type-is": { 1386 | "version": "1.6.18", 1387 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1388 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1389 | "license": "MIT", 1390 | "dependencies": { 1391 | "media-typer": "0.3.0", 1392 | "mime-types": "~2.1.24" 1393 | }, 1394 | "engines": { 1395 | "node": ">= 0.6" 1396 | } 1397 | }, 1398 | "node_modules/undefsafe": { 1399 | "version": "2.0.5", 1400 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1401 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1402 | "dev": true, 1403 | "license": "MIT" 1404 | }, 1405 | "node_modules/unpipe": { 1406 | "version": "1.0.0", 1407 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1408 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1409 | "license": "MIT", 1410 | "engines": { 1411 | "node": ">= 0.8" 1412 | } 1413 | }, 1414 | "node_modules/utils-merge": { 1415 | "version": "1.0.1", 1416 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1417 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1418 | "license": "MIT", 1419 | "engines": { 1420 | "node": ">= 0.4.0" 1421 | } 1422 | }, 1423 | "node_modules/vary": { 1424 | "version": "1.1.2", 1425 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1426 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1427 | "license": "MIT", 1428 | "engines": { 1429 | "node": ">= 0.8" 1430 | } 1431 | }, 1432 | "node_modules/webidl-conversions": { 1433 | "version": "7.0.0", 1434 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1435 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1436 | "license": "BSD-2-Clause", 1437 | "engines": { 1438 | "node": ">=12" 1439 | } 1440 | }, 1441 | "node_modules/whatwg-url": { 1442 | "version": "13.0.0", 1443 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", 1444 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", 1445 | "license": "MIT", 1446 | "dependencies": { 1447 | "tr46": "^4.1.1", 1448 | "webidl-conversions": "^7.0.0" 1449 | }, 1450 | "engines": { 1451 | "node": ">=16" 1452 | } 1453 | }, 1454 | "node_modules/zod": { 1455 | "version": "3.23.8", 1456 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1457 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1458 | "license": "MIT", 1459 | "funding": { 1460 | "url": "https://github.com/sponsors/colinhacks" 1461 | } 1462 | } 1463 | } 1464 | } 1465 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codex100", 3 | "version": "1.0.0", 4 | "description": "", 5 | "type": "module", 6 | "main": "app.js", 7 | "scripts": { 8 | "preinstall": "npx only-allow pnpm", 9 | "start": "node app.js", 10 | "dev": "nodemon app.js" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/arshadpatel/codeX100/issues" 17 | }, 18 | "homepage": "https://github.com/arshadpatel/codeX100#readme", 19 | "dependencies": { 20 | "bcrypt": "^5.1.1", 21 | "cookie-parser": "^1.4.6", 22 | "dotenv": "^16.4.5", 23 | "express": "^4.21.0", 24 | "jsonwebtoken": "^9.0.2", 25 | "mongoose": "^8.7.0", 26 | "morgan": "^1.10.0", 27 | "zod": "^3.23.8" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "git+https://github.com/arshadpatel/codeX100.git" 32 | }, 33 | "devDependencies": { 34 | "nodemon": "^3.1.7" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /backend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | bcrypt: 12 | specifier: ^5.1.1 13 | version: 5.1.1 14 | cookie-parser: 15 | specifier: ^1.4.6 16 | version: 1.4.6 17 | dotenv: 18 | specifier: ^16.4.5 19 | version: 16.4.5 20 | express: 21 | specifier: ^4.21.0 22 | version: 4.21.0 23 | jsonwebtoken: 24 | specifier: ^9.0.2 25 | version: 9.0.2 26 | mongoose: 27 | specifier: ^8.7.0 28 | version: 8.7.0 29 | morgan: 30 | specifier: ^1.10.0 31 | version: 1.10.0 32 | zod: 33 | specifier: ^3.23.8 34 | version: 3.23.8 35 | devDependencies: 36 | nodemon: 37 | specifier: ^3.1.7 38 | version: 3.1.7 39 | 40 | packages: 41 | 42 | '@mapbox/node-pre-gyp@1.0.11': 43 | resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} 44 | hasBin: true 45 | 46 | '@mongodb-js/saslprep@1.1.9': 47 | resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} 48 | 49 | '@types/webidl-conversions@7.0.3': 50 | resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} 51 | 52 | '@types/whatwg-url@11.0.5': 53 | resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} 54 | 55 | abbrev@1.1.1: 56 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 57 | 58 | accepts@1.3.8: 59 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 60 | engines: {node: '>= 0.6'} 61 | 62 | agent-base@6.0.2: 63 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 64 | engines: {node: '>= 6.0.0'} 65 | 66 | ansi-regex@5.0.1: 67 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 68 | engines: {node: '>=8'} 69 | 70 | anymatch@3.1.3: 71 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 72 | engines: {node: '>= 8'} 73 | 74 | aproba@2.0.0: 75 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 76 | 77 | are-we-there-yet@2.0.0: 78 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} 79 | engines: {node: '>=10'} 80 | deprecated: This package is no longer supported. 81 | 82 | array-flatten@1.1.1: 83 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 84 | 85 | balanced-match@1.0.2: 86 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 87 | 88 | basic-auth@2.0.1: 89 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} 90 | engines: {node: '>= 0.8'} 91 | 92 | bcrypt@5.1.1: 93 | resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} 94 | engines: {node: '>= 10.0.0'} 95 | 96 | binary-extensions@2.3.0: 97 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 98 | engines: {node: '>=8'} 99 | 100 | body-parser@1.20.3: 101 | resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} 102 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 103 | 104 | brace-expansion@1.1.11: 105 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 106 | 107 | braces@3.0.3: 108 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 109 | engines: {node: '>=8'} 110 | 111 | bson@6.8.0: 112 | resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} 113 | engines: {node: '>=16.20.1'} 114 | 115 | buffer-equal-constant-time@1.0.1: 116 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} 117 | 118 | bytes@3.1.2: 119 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 120 | engines: {node: '>= 0.8'} 121 | 122 | call-bind@1.0.7: 123 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 124 | engines: {node: '>= 0.4'} 125 | 126 | chokidar@3.6.0: 127 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 128 | engines: {node: '>= 8.10.0'} 129 | 130 | chownr@2.0.0: 131 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 132 | engines: {node: '>=10'} 133 | 134 | color-support@1.1.3: 135 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 136 | hasBin: true 137 | 138 | concat-map@0.0.1: 139 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 140 | 141 | console-control-strings@1.1.0: 142 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 143 | 144 | content-disposition@0.5.4: 145 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 146 | engines: {node: '>= 0.6'} 147 | 148 | content-type@1.0.5: 149 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 150 | engines: {node: '>= 0.6'} 151 | 152 | cookie-parser@1.4.6: 153 | resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} 154 | engines: {node: '>= 0.8.0'} 155 | 156 | cookie-signature@1.0.6: 157 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 158 | 159 | cookie@0.4.1: 160 | resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} 161 | engines: {node: '>= 0.6'} 162 | 163 | cookie@0.6.0: 164 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 165 | engines: {node: '>= 0.6'} 166 | 167 | debug@2.6.9: 168 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 169 | peerDependencies: 170 | supports-color: '*' 171 | peerDependenciesMeta: 172 | supports-color: 173 | optional: true 174 | 175 | debug@4.3.7: 176 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 177 | engines: {node: '>=6.0'} 178 | peerDependencies: 179 | supports-color: '*' 180 | peerDependenciesMeta: 181 | supports-color: 182 | optional: true 183 | 184 | define-data-property@1.1.4: 185 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 186 | engines: {node: '>= 0.4'} 187 | 188 | delegates@1.0.0: 189 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 190 | 191 | depd@2.0.0: 192 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 193 | engines: {node: '>= 0.8'} 194 | 195 | destroy@1.2.0: 196 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 197 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 198 | 199 | detect-libc@2.0.3: 200 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 201 | engines: {node: '>=8'} 202 | 203 | dotenv@16.4.5: 204 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 205 | engines: {node: '>=12'} 206 | 207 | ecdsa-sig-formatter@1.0.11: 208 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} 209 | 210 | ee-first@1.1.1: 211 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 212 | 213 | emoji-regex@8.0.0: 214 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 215 | 216 | encodeurl@1.0.2: 217 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 218 | engines: {node: '>= 0.8'} 219 | 220 | encodeurl@2.0.0: 221 | resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 222 | engines: {node: '>= 0.8'} 223 | 224 | es-define-property@1.0.0: 225 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 226 | engines: {node: '>= 0.4'} 227 | 228 | es-errors@1.3.0: 229 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 230 | engines: {node: '>= 0.4'} 231 | 232 | escape-html@1.0.3: 233 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 234 | 235 | etag@1.8.1: 236 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 237 | engines: {node: '>= 0.6'} 238 | 239 | express@4.21.0: 240 | resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} 241 | engines: {node: '>= 0.10.0'} 242 | 243 | fill-range@7.1.1: 244 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 245 | engines: {node: '>=8'} 246 | 247 | finalhandler@1.3.1: 248 | resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} 249 | engines: {node: '>= 0.8'} 250 | 251 | forwarded@0.2.0: 252 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 253 | engines: {node: '>= 0.6'} 254 | 255 | fresh@0.5.2: 256 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 257 | engines: {node: '>= 0.6'} 258 | 259 | fs-minipass@2.1.0: 260 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 261 | engines: {node: '>= 8'} 262 | 263 | fs.realpath@1.0.0: 264 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 265 | 266 | fsevents@2.3.3: 267 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 268 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 269 | os: [darwin] 270 | 271 | function-bind@1.1.2: 272 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 273 | 274 | gauge@3.0.2: 275 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} 276 | engines: {node: '>=10'} 277 | deprecated: This package is no longer supported. 278 | 279 | get-intrinsic@1.2.4: 280 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 281 | engines: {node: '>= 0.4'} 282 | 283 | glob-parent@5.1.2: 284 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 285 | engines: {node: '>= 6'} 286 | 287 | glob@7.2.3: 288 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 289 | deprecated: Glob versions prior to v9 are no longer supported 290 | 291 | gopd@1.0.1: 292 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 293 | 294 | has-flag@3.0.0: 295 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 296 | engines: {node: '>=4'} 297 | 298 | has-property-descriptors@1.0.2: 299 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 300 | 301 | has-proto@1.0.3: 302 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} 303 | engines: {node: '>= 0.4'} 304 | 305 | has-symbols@1.0.3: 306 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 307 | engines: {node: '>= 0.4'} 308 | 309 | has-unicode@2.0.1: 310 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 311 | 312 | hasown@2.0.2: 313 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 314 | engines: {node: '>= 0.4'} 315 | 316 | http-errors@2.0.0: 317 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 318 | engines: {node: '>= 0.8'} 319 | 320 | https-proxy-agent@5.0.1: 321 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 322 | engines: {node: '>= 6'} 323 | 324 | iconv-lite@0.4.24: 325 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 326 | engines: {node: '>=0.10.0'} 327 | 328 | ignore-by-default@1.0.1: 329 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 330 | 331 | inflight@1.0.6: 332 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 333 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 334 | 335 | inherits@2.0.4: 336 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 337 | 338 | ipaddr.js@1.9.1: 339 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 340 | engines: {node: '>= 0.10'} 341 | 342 | is-binary-path@2.1.0: 343 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 344 | engines: {node: '>=8'} 345 | 346 | is-extglob@2.1.1: 347 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 348 | engines: {node: '>=0.10.0'} 349 | 350 | is-fullwidth-code-point@3.0.0: 351 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 352 | engines: {node: '>=8'} 353 | 354 | is-glob@4.0.3: 355 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 356 | engines: {node: '>=0.10.0'} 357 | 358 | is-number@7.0.0: 359 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 360 | engines: {node: '>=0.12.0'} 361 | 362 | jsonwebtoken@9.0.2: 363 | resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} 364 | engines: {node: '>=12', npm: '>=6'} 365 | 366 | jwa@1.4.1: 367 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} 368 | 369 | jws@3.2.2: 370 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} 371 | 372 | kareem@2.6.3: 373 | resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} 374 | engines: {node: '>=12.0.0'} 375 | 376 | lodash.includes@4.3.0: 377 | resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} 378 | 379 | lodash.isboolean@3.0.3: 380 | resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} 381 | 382 | lodash.isinteger@4.0.4: 383 | resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} 384 | 385 | lodash.isnumber@3.0.3: 386 | resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} 387 | 388 | lodash.isplainobject@4.0.6: 389 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 390 | 391 | lodash.isstring@4.0.1: 392 | resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} 393 | 394 | lodash.once@4.1.1: 395 | resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} 396 | 397 | make-dir@3.1.0: 398 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 399 | engines: {node: '>=8'} 400 | 401 | media-typer@0.3.0: 402 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 403 | engines: {node: '>= 0.6'} 404 | 405 | memory-pager@1.5.0: 406 | resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} 407 | 408 | merge-descriptors@1.0.3: 409 | resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} 410 | 411 | methods@1.1.2: 412 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 413 | engines: {node: '>= 0.6'} 414 | 415 | mime-db@1.52.0: 416 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 417 | engines: {node: '>= 0.6'} 418 | 419 | mime-types@2.1.35: 420 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 421 | engines: {node: '>= 0.6'} 422 | 423 | mime@1.6.0: 424 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 425 | engines: {node: '>=4'} 426 | hasBin: true 427 | 428 | minimatch@3.1.2: 429 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 430 | 431 | minipass@3.3.6: 432 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 433 | engines: {node: '>=8'} 434 | 435 | minipass@5.0.0: 436 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 437 | engines: {node: '>=8'} 438 | 439 | minizlib@2.1.2: 440 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 441 | engines: {node: '>= 8'} 442 | 443 | mkdirp@1.0.4: 444 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 445 | engines: {node: '>=10'} 446 | hasBin: true 447 | 448 | mongodb-connection-string-url@3.0.1: 449 | resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} 450 | 451 | mongodb@6.9.0: 452 | resolution: {integrity: sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==} 453 | engines: {node: '>=16.20.1'} 454 | peerDependencies: 455 | '@aws-sdk/credential-providers': ^3.188.0 456 | '@mongodb-js/zstd': ^1.1.0 457 | gcp-metadata: ^5.2.0 458 | kerberos: ^2.0.1 459 | mongodb-client-encryption: '>=6.0.0 <7' 460 | snappy: ^7.2.2 461 | socks: ^2.7.1 462 | peerDependenciesMeta: 463 | '@aws-sdk/credential-providers': 464 | optional: true 465 | '@mongodb-js/zstd': 466 | optional: true 467 | gcp-metadata: 468 | optional: true 469 | kerberos: 470 | optional: true 471 | mongodb-client-encryption: 472 | optional: true 473 | snappy: 474 | optional: true 475 | socks: 476 | optional: true 477 | 478 | mongoose@8.7.0: 479 | resolution: {integrity: sha512-rUCSF1mMYQXjXYdqEQLLlMD3xbcj2j1/hRn+9VnVj7ipzru/UoUZxlj/hWmteKMAh4EFnDZ+BIrmma9l/0Hi1g==} 480 | engines: {node: '>=16.20.1'} 481 | 482 | morgan@1.10.0: 483 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} 484 | engines: {node: '>= 0.8.0'} 485 | 486 | mpath@0.9.0: 487 | resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} 488 | engines: {node: '>=4.0.0'} 489 | 490 | mquery@5.0.0: 491 | resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} 492 | engines: {node: '>=14.0.0'} 493 | 494 | ms@2.0.0: 495 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 496 | 497 | ms@2.1.3: 498 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 499 | 500 | negotiator@0.6.3: 501 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 502 | engines: {node: '>= 0.6'} 503 | 504 | node-addon-api@5.1.0: 505 | resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} 506 | 507 | node-fetch@2.7.0: 508 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 509 | engines: {node: 4.x || >=6.0.0} 510 | peerDependencies: 511 | encoding: ^0.1.0 512 | peerDependenciesMeta: 513 | encoding: 514 | optional: true 515 | 516 | nodemon@3.1.7: 517 | resolution: {integrity: sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==} 518 | engines: {node: '>=10'} 519 | hasBin: true 520 | 521 | nopt@5.0.0: 522 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} 523 | engines: {node: '>=6'} 524 | hasBin: true 525 | 526 | normalize-path@3.0.0: 527 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 528 | engines: {node: '>=0.10.0'} 529 | 530 | npmlog@5.0.1: 531 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} 532 | deprecated: This package is no longer supported. 533 | 534 | object-assign@4.1.1: 535 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 536 | engines: {node: '>=0.10.0'} 537 | 538 | object-inspect@1.13.2: 539 | resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} 540 | engines: {node: '>= 0.4'} 541 | 542 | on-finished@2.3.0: 543 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 544 | engines: {node: '>= 0.8'} 545 | 546 | on-finished@2.4.1: 547 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 548 | engines: {node: '>= 0.8'} 549 | 550 | on-headers@1.0.2: 551 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} 552 | engines: {node: '>= 0.8'} 553 | 554 | once@1.4.0: 555 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 556 | 557 | parseurl@1.3.3: 558 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 559 | engines: {node: '>= 0.8'} 560 | 561 | path-is-absolute@1.0.1: 562 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 563 | engines: {node: '>=0.10.0'} 564 | 565 | path-to-regexp@0.1.10: 566 | resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} 567 | 568 | picomatch@2.3.1: 569 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 570 | engines: {node: '>=8.6'} 571 | 572 | proxy-addr@2.0.7: 573 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 574 | engines: {node: '>= 0.10'} 575 | 576 | pstree.remy@1.1.8: 577 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 578 | 579 | punycode@2.3.1: 580 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 581 | engines: {node: '>=6'} 582 | 583 | qs@6.13.0: 584 | resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} 585 | engines: {node: '>=0.6'} 586 | 587 | range-parser@1.2.1: 588 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 589 | engines: {node: '>= 0.6'} 590 | 591 | raw-body@2.5.2: 592 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 593 | engines: {node: '>= 0.8'} 594 | 595 | readable-stream@3.6.2: 596 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 597 | engines: {node: '>= 6'} 598 | 599 | readdirp@3.6.0: 600 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 601 | engines: {node: '>=8.10.0'} 602 | 603 | rimraf@3.0.2: 604 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 605 | deprecated: Rimraf versions prior to v4 are no longer supported 606 | hasBin: true 607 | 608 | safe-buffer@5.1.2: 609 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 610 | 611 | safe-buffer@5.2.1: 612 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 613 | 614 | safer-buffer@2.1.2: 615 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 616 | 617 | semver@6.3.1: 618 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 619 | hasBin: true 620 | 621 | semver@7.6.3: 622 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 623 | engines: {node: '>=10'} 624 | hasBin: true 625 | 626 | send@0.19.0: 627 | resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} 628 | engines: {node: '>= 0.8.0'} 629 | 630 | serve-static@1.16.2: 631 | resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} 632 | engines: {node: '>= 0.8.0'} 633 | 634 | set-blocking@2.0.0: 635 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 636 | 637 | set-function-length@1.2.2: 638 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 639 | engines: {node: '>= 0.4'} 640 | 641 | setprototypeof@1.2.0: 642 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 643 | 644 | side-channel@1.0.6: 645 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} 646 | engines: {node: '>= 0.4'} 647 | 648 | sift@17.1.3: 649 | resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} 650 | 651 | signal-exit@3.0.7: 652 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 653 | 654 | simple-update-notifier@2.0.0: 655 | resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} 656 | engines: {node: '>=10'} 657 | 658 | sparse-bitfield@3.0.3: 659 | resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} 660 | 661 | statuses@2.0.1: 662 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 663 | engines: {node: '>= 0.8'} 664 | 665 | string-width@4.2.3: 666 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 667 | engines: {node: '>=8'} 668 | 669 | string_decoder@1.3.0: 670 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 671 | 672 | strip-ansi@6.0.1: 673 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 674 | engines: {node: '>=8'} 675 | 676 | supports-color@5.5.0: 677 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 678 | engines: {node: '>=4'} 679 | 680 | tar@6.2.1: 681 | resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 682 | engines: {node: '>=10'} 683 | 684 | to-regex-range@5.0.1: 685 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 686 | engines: {node: '>=8.0'} 687 | 688 | toidentifier@1.0.1: 689 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 690 | engines: {node: '>=0.6'} 691 | 692 | touch@3.1.1: 693 | resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} 694 | hasBin: true 695 | 696 | tr46@0.0.3: 697 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 698 | 699 | tr46@4.1.1: 700 | resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} 701 | engines: {node: '>=14'} 702 | 703 | type-is@1.6.18: 704 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 705 | engines: {node: '>= 0.6'} 706 | 707 | undefsafe@2.0.5: 708 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 709 | 710 | unpipe@1.0.0: 711 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 712 | engines: {node: '>= 0.8'} 713 | 714 | util-deprecate@1.0.2: 715 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 716 | 717 | utils-merge@1.0.1: 718 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 719 | engines: {node: '>= 0.4.0'} 720 | 721 | vary@1.1.2: 722 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 723 | engines: {node: '>= 0.8'} 724 | 725 | webidl-conversions@3.0.1: 726 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 727 | 728 | webidl-conversions@7.0.0: 729 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 730 | engines: {node: '>=12'} 731 | 732 | whatwg-url@13.0.0: 733 | resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} 734 | engines: {node: '>=16'} 735 | 736 | whatwg-url@5.0.0: 737 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 738 | 739 | wide-align@1.1.5: 740 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 741 | 742 | wrappy@1.0.2: 743 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 744 | 745 | yallist@4.0.0: 746 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 747 | 748 | zod@3.23.8: 749 | resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} 750 | 751 | snapshots: 752 | 753 | '@mapbox/node-pre-gyp@1.0.11': 754 | dependencies: 755 | detect-libc: 2.0.3 756 | https-proxy-agent: 5.0.1 757 | make-dir: 3.1.0 758 | node-fetch: 2.7.0 759 | nopt: 5.0.0 760 | npmlog: 5.0.1 761 | rimraf: 3.0.2 762 | semver: 7.6.3 763 | tar: 6.2.1 764 | transitivePeerDependencies: 765 | - encoding 766 | - supports-color 767 | 768 | '@mongodb-js/saslprep@1.1.9': 769 | dependencies: 770 | sparse-bitfield: 3.0.3 771 | 772 | '@types/webidl-conversions@7.0.3': {} 773 | 774 | '@types/whatwg-url@11.0.5': 775 | dependencies: 776 | '@types/webidl-conversions': 7.0.3 777 | 778 | abbrev@1.1.1: {} 779 | 780 | accepts@1.3.8: 781 | dependencies: 782 | mime-types: 2.1.35 783 | negotiator: 0.6.3 784 | 785 | agent-base@6.0.2: 786 | dependencies: 787 | debug: 4.3.7(supports-color@5.5.0) 788 | transitivePeerDependencies: 789 | - supports-color 790 | 791 | ansi-regex@5.0.1: {} 792 | 793 | anymatch@3.1.3: 794 | dependencies: 795 | normalize-path: 3.0.0 796 | picomatch: 2.3.1 797 | 798 | aproba@2.0.0: {} 799 | 800 | are-we-there-yet@2.0.0: 801 | dependencies: 802 | delegates: 1.0.0 803 | readable-stream: 3.6.2 804 | 805 | array-flatten@1.1.1: {} 806 | 807 | balanced-match@1.0.2: {} 808 | 809 | basic-auth@2.0.1: 810 | dependencies: 811 | safe-buffer: 5.1.2 812 | 813 | bcrypt@5.1.1: 814 | dependencies: 815 | '@mapbox/node-pre-gyp': 1.0.11 816 | node-addon-api: 5.1.0 817 | transitivePeerDependencies: 818 | - encoding 819 | - supports-color 820 | 821 | binary-extensions@2.3.0: {} 822 | 823 | body-parser@1.20.3: 824 | dependencies: 825 | bytes: 3.1.2 826 | content-type: 1.0.5 827 | debug: 2.6.9 828 | depd: 2.0.0 829 | destroy: 1.2.0 830 | http-errors: 2.0.0 831 | iconv-lite: 0.4.24 832 | on-finished: 2.4.1 833 | qs: 6.13.0 834 | raw-body: 2.5.2 835 | type-is: 1.6.18 836 | unpipe: 1.0.0 837 | transitivePeerDependencies: 838 | - supports-color 839 | 840 | brace-expansion@1.1.11: 841 | dependencies: 842 | balanced-match: 1.0.2 843 | concat-map: 0.0.1 844 | 845 | braces@3.0.3: 846 | dependencies: 847 | fill-range: 7.1.1 848 | 849 | bson@6.8.0: {} 850 | 851 | buffer-equal-constant-time@1.0.1: {} 852 | 853 | bytes@3.1.2: {} 854 | 855 | call-bind@1.0.7: 856 | dependencies: 857 | es-define-property: 1.0.0 858 | es-errors: 1.3.0 859 | function-bind: 1.1.2 860 | get-intrinsic: 1.2.4 861 | set-function-length: 1.2.2 862 | 863 | chokidar@3.6.0: 864 | dependencies: 865 | anymatch: 3.1.3 866 | braces: 3.0.3 867 | glob-parent: 5.1.2 868 | is-binary-path: 2.1.0 869 | is-glob: 4.0.3 870 | normalize-path: 3.0.0 871 | readdirp: 3.6.0 872 | optionalDependencies: 873 | fsevents: 2.3.3 874 | 875 | chownr@2.0.0: {} 876 | 877 | color-support@1.1.3: {} 878 | 879 | concat-map@0.0.1: {} 880 | 881 | console-control-strings@1.1.0: {} 882 | 883 | content-disposition@0.5.4: 884 | dependencies: 885 | safe-buffer: 5.2.1 886 | 887 | content-type@1.0.5: {} 888 | 889 | cookie-parser@1.4.6: 890 | dependencies: 891 | cookie: 0.4.1 892 | cookie-signature: 1.0.6 893 | 894 | cookie-signature@1.0.6: {} 895 | 896 | cookie@0.4.1: {} 897 | 898 | cookie@0.6.0: {} 899 | 900 | debug@2.6.9: 901 | dependencies: 902 | ms: 2.0.0 903 | 904 | debug@4.3.7(supports-color@5.5.0): 905 | dependencies: 906 | ms: 2.1.3 907 | optionalDependencies: 908 | supports-color: 5.5.0 909 | 910 | define-data-property@1.1.4: 911 | dependencies: 912 | es-define-property: 1.0.0 913 | es-errors: 1.3.0 914 | gopd: 1.0.1 915 | 916 | delegates@1.0.0: {} 917 | 918 | depd@2.0.0: {} 919 | 920 | destroy@1.2.0: {} 921 | 922 | detect-libc@2.0.3: {} 923 | 924 | dotenv@16.4.5: {} 925 | 926 | ecdsa-sig-formatter@1.0.11: 927 | dependencies: 928 | safe-buffer: 5.2.1 929 | 930 | ee-first@1.1.1: {} 931 | 932 | emoji-regex@8.0.0: {} 933 | 934 | encodeurl@1.0.2: {} 935 | 936 | encodeurl@2.0.0: {} 937 | 938 | es-define-property@1.0.0: 939 | dependencies: 940 | get-intrinsic: 1.2.4 941 | 942 | es-errors@1.3.0: {} 943 | 944 | escape-html@1.0.3: {} 945 | 946 | etag@1.8.1: {} 947 | 948 | express@4.21.0: 949 | dependencies: 950 | accepts: 1.3.8 951 | array-flatten: 1.1.1 952 | body-parser: 1.20.3 953 | content-disposition: 0.5.4 954 | content-type: 1.0.5 955 | cookie: 0.6.0 956 | cookie-signature: 1.0.6 957 | debug: 2.6.9 958 | depd: 2.0.0 959 | encodeurl: 2.0.0 960 | escape-html: 1.0.3 961 | etag: 1.8.1 962 | finalhandler: 1.3.1 963 | fresh: 0.5.2 964 | http-errors: 2.0.0 965 | merge-descriptors: 1.0.3 966 | methods: 1.1.2 967 | on-finished: 2.4.1 968 | parseurl: 1.3.3 969 | path-to-regexp: 0.1.10 970 | proxy-addr: 2.0.7 971 | qs: 6.13.0 972 | range-parser: 1.2.1 973 | safe-buffer: 5.2.1 974 | send: 0.19.0 975 | serve-static: 1.16.2 976 | setprototypeof: 1.2.0 977 | statuses: 2.0.1 978 | type-is: 1.6.18 979 | utils-merge: 1.0.1 980 | vary: 1.1.2 981 | transitivePeerDependencies: 982 | - supports-color 983 | 984 | fill-range@7.1.1: 985 | dependencies: 986 | to-regex-range: 5.0.1 987 | 988 | finalhandler@1.3.1: 989 | dependencies: 990 | debug: 2.6.9 991 | encodeurl: 2.0.0 992 | escape-html: 1.0.3 993 | on-finished: 2.4.1 994 | parseurl: 1.3.3 995 | statuses: 2.0.1 996 | unpipe: 1.0.0 997 | transitivePeerDependencies: 998 | - supports-color 999 | 1000 | forwarded@0.2.0: {} 1001 | 1002 | fresh@0.5.2: {} 1003 | 1004 | fs-minipass@2.1.0: 1005 | dependencies: 1006 | minipass: 3.3.6 1007 | 1008 | fs.realpath@1.0.0: {} 1009 | 1010 | fsevents@2.3.3: 1011 | optional: true 1012 | 1013 | function-bind@1.1.2: {} 1014 | 1015 | gauge@3.0.2: 1016 | dependencies: 1017 | aproba: 2.0.0 1018 | color-support: 1.1.3 1019 | console-control-strings: 1.1.0 1020 | has-unicode: 2.0.1 1021 | object-assign: 4.1.1 1022 | signal-exit: 3.0.7 1023 | string-width: 4.2.3 1024 | strip-ansi: 6.0.1 1025 | wide-align: 1.1.5 1026 | 1027 | get-intrinsic@1.2.4: 1028 | dependencies: 1029 | es-errors: 1.3.0 1030 | function-bind: 1.1.2 1031 | has-proto: 1.0.3 1032 | has-symbols: 1.0.3 1033 | hasown: 2.0.2 1034 | 1035 | glob-parent@5.1.2: 1036 | dependencies: 1037 | is-glob: 4.0.3 1038 | 1039 | glob@7.2.3: 1040 | dependencies: 1041 | fs.realpath: 1.0.0 1042 | inflight: 1.0.6 1043 | inherits: 2.0.4 1044 | minimatch: 3.1.2 1045 | once: 1.4.0 1046 | path-is-absolute: 1.0.1 1047 | 1048 | gopd@1.0.1: 1049 | dependencies: 1050 | get-intrinsic: 1.2.4 1051 | 1052 | has-flag@3.0.0: {} 1053 | 1054 | has-property-descriptors@1.0.2: 1055 | dependencies: 1056 | es-define-property: 1.0.0 1057 | 1058 | has-proto@1.0.3: {} 1059 | 1060 | has-symbols@1.0.3: {} 1061 | 1062 | has-unicode@2.0.1: {} 1063 | 1064 | hasown@2.0.2: 1065 | dependencies: 1066 | function-bind: 1.1.2 1067 | 1068 | http-errors@2.0.0: 1069 | dependencies: 1070 | depd: 2.0.0 1071 | inherits: 2.0.4 1072 | setprototypeof: 1.2.0 1073 | statuses: 2.0.1 1074 | toidentifier: 1.0.1 1075 | 1076 | https-proxy-agent@5.0.1: 1077 | dependencies: 1078 | agent-base: 6.0.2 1079 | debug: 4.3.7(supports-color@5.5.0) 1080 | transitivePeerDependencies: 1081 | - supports-color 1082 | 1083 | iconv-lite@0.4.24: 1084 | dependencies: 1085 | safer-buffer: 2.1.2 1086 | 1087 | ignore-by-default@1.0.1: {} 1088 | 1089 | inflight@1.0.6: 1090 | dependencies: 1091 | once: 1.4.0 1092 | wrappy: 1.0.2 1093 | 1094 | inherits@2.0.4: {} 1095 | 1096 | ipaddr.js@1.9.1: {} 1097 | 1098 | is-binary-path@2.1.0: 1099 | dependencies: 1100 | binary-extensions: 2.3.0 1101 | 1102 | is-extglob@2.1.1: {} 1103 | 1104 | is-fullwidth-code-point@3.0.0: {} 1105 | 1106 | is-glob@4.0.3: 1107 | dependencies: 1108 | is-extglob: 2.1.1 1109 | 1110 | is-number@7.0.0: {} 1111 | 1112 | jsonwebtoken@9.0.2: 1113 | dependencies: 1114 | jws: 3.2.2 1115 | lodash.includes: 4.3.0 1116 | lodash.isboolean: 3.0.3 1117 | lodash.isinteger: 4.0.4 1118 | lodash.isnumber: 3.0.3 1119 | lodash.isplainobject: 4.0.6 1120 | lodash.isstring: 4.0.1 1121 | lodash.once: 4.1.1 1122 | ms: 2.1.3 1123 | semver: 7.6.3 1124 | 1125 | jwa@1.4.1: 1126 | dependencies: 1127 | buffer-equal-constant-time: 1.0.1 1128 | ecdsa-sig-formatter: 1.0.11 1129 | safe-buffer: 5.2.1 1130 | 1131 | jws@3.2.2: 1132 | dependencies: 1133 | jwa: 1.4.1 1134 | safe-buffer: 5.2.1 1135 | 1136 | kareem@2.6.3: {} 1137 | 1138 | lodash.includes@4.3.0: {} 1139 | 1140 | lodash.isboolean@3.0.3: {} 1141 | 1142 | lodash.isinteger@4.0.4: {} 1143 | 1144 | lodash.isnumber@3.0.3: {} 1145 | 1146 | lodash.isplainobject@4.0.6: {} 1147 | 1148 | lodash.isstring@4.0.1: {} 1149 | 1150 | lodash.once@4.1.1: {} 1151 | 1152 | make-dir@3.1.0: 1153 | dependencies: 1154 | semver: 6.3.1 1155 | 1156 | media-typer@0.3.0: {} 1157 | 1158 | memory-pager@1.5.0: {} 1159 | 1160 | merge-descriptors@1.0.3: {} 1161 | 1162 | methods@1.1.2: {} 1163 | 1164 | mime-db@1.52.0: {} 1165 | 1166 | mime-types@2.1.35: 1167 | dependencies: 1168 | mime-db: 1.52.0 1169 | 1170 | mime@1.6.0: {} 1171 | 1172 | minimatch@3.1.2: 1173 | dependencies: 1174 | brace-expansion: 1.1.11 1175 | 1176 | minipass@3.3.6: 1177 | dependencies: 1178 | yallist: 4.0.0 1179 | 1180 | minipass@5.0.0: {} 1181 | 1182 | minizlib@2.1.2: 1183 | dependencies: 1184 | minipass: 3.3.6 1185 | yallist: 4.0.0 1186 | 1187 | mkdirp@1.0.4: {} 1188 | 1189 | mongodb-connection-string-url@3.0.1: 1190 | dependencies: 1191 | '@types/whatwg-url': 11.0.5 1192 | whatwg-url: 13.0.0 1193 | 1194 | mongodb@6.9.0: 1195 | dependencies: 1196 | '@mongodb-js/saslprep': 1.1.9 1197 | bson: 6.8.0 1198 | mongodb-connection-string-url: 3.0.1 1199 | 1200 | mongoose@8.7.0: 1201 | dependencies: 1202 | bson: 6.8.0 1203 | kareem: 2.6.3 1204 | mongodb: 6.9.0 1205 | mpath: 0.9.0 1206 | mquery: 5.0.0 1207 | ms: 2.1.3 1208 | sift: 17.1.3 1209 | transitivePeerDependencies: 1210 | - '@aws-sdk/credential-providers' 1211 | - '@mongodb-js/zstd' 1212 | - gcp-metadata 1213 | - kerberos 1214 | - mongodb-client-encryption 1215 | - snappy 1216 | - socks 1217 | - supports-color 1218 | 1219 | morgan@1.10.0: 1220 | dependencies: 1221 | basic-auth: 2.0.1 1222 | debug: 2.6.9 1223 | depd: 2.0.0 1224 | on-finished: 2.3.0 1225 | on-headers: 1.0.2 1226 | transitivePeerDependencies: 1227 | - supports-color 1228 | 1229 | mpath@0.9.0: {} 1230 | 1231 | mquery@5.0.0: 1232 | dependencies: 1233 | debug: 4.3.7(supports-color@5.5.0) 1234 | transitivePeerDependencies: 1235 | - supports-color 1236 | 1237 | ms@2.0.0: {} 1238 | 1239 | ms@2.1.3: {} 1240 | 1241 | negotiator@0.6.3: {} 1242 | 1243 | node-addon-api@5.1.0: {} 1244 | 1245 | node-fetch@2.7.0: 1246 | dependencies: 1247 | whatwg-url: 5.0.0 1248 | 1249 | nodemon@3.1.7: 1250 | dependencies: 1251 | chokidar: 3.6.0 1252 | debug: 4.3.7(supports-color@5.5.0) 1253 | ignore-by-default: 1.0.1 1254 | minimatch: 3.1.2 1255 | pstree.remy: 1.1.8 1256 | semver: 7.6.3 1257 | simple-update-notifier: 2.0.0 1258 | supports-color: 5.5.0 1259 | touch: 3.1.1 1260 | undefsafe: 2.0.5 1261 | 1262 | nopt@5.0.0: 1263 | dependencies: 1264 | abbrev: 1.1.1 1265 | 1266 | normalize-path@3.0.0: {} 1267 | 1268 | npmlog@5.0.1: 1269 | dependencies: 1270 | are-we-there-yet: 2.0.0 1271 | console-control-strings: 1.1.0 1272 | gauge: 3.0.2 1273 | set-blocking: 2.0.0 1274 | 1275 | object-assign@4.1.1: {} 1276 | 1277 | object-inspect@1.13.2: {} 1278 | 1279 | on-finished@2.3.0: 1280 | dependencies: 1281 | ee-first: 1.1.1 1282 | 1283 | on-finished@2.4.1: 1284 | dependencies: 1285 | ee-first: 1.1.1 1286 | 1287 | on-headers@1.0.2: {} 1288 | 1289 | once@1.4.0: 1290 | dependencies: 1291 | wrappy: 1.0.2 1292 | 1293 | parseurl@1.3.3: {} 1294 | 1295 | path-is-absolute@1.0.1: {} 1296 | 1297 | path-to-regexp@0.1.10: {} 1298 | 1299 | picomatch@2.3.1: {} 1300 | 1301 | proxy-addr@2.0.7: 1302 | dependencies: 1303 | forwarded: 0.2.0 1304 | ipaddr.js: 1.9.1 1305 | 1306 | pstree.remy@1.1.8: {} 1307 | 1308 | punycode@2.3.1: {} 1309 | 1310 | qs@6.13.0: 1311 | dependencies: 1312 | side-channel: 1.0.6 1313 | 1314 | range-parser@1.2.1: {} 1315 | 1316 | raw-body@2.5.2: 1317 | dependencies: 1318 | bytes: 3.1.2 1319 | http-errors: 2.0.0 1320 | iconv-lite: 0.4.24 1321 | unpipe: 1.0.0 1322 | 1323 | readable-stream@3.6.2: 1324 | dependencies: 1325 | inherits: 2.0.4 1326 | string_decoder: 1.3.0 1327 | util-deprecate: 1.0.2 1328 | 1329 | readdirp@3.6.0: 1330 | dependencies: 1331 | picomatch: 2.3.1 1332 | 1333 | rimraf@3.0.2: 1334 | dependencies: 1335 | glob: 7.2.3 1336 | 1337 | safe-buffer@5.1.2: {} 1338 | 1339 | safe-buffer@5.2.1: {} 1340 | 1341 | safer-buffer@2.1.2: {} 1342 | 1343 | semver@6.3.1: {} 1344 | 1345 | semver@7.6.3: {} 1346 | 1347 | send@0.19.0: 1348 | dependencies: 1349 | debug: 2.6.9 1350 | depd: 2.0.0 1351 | destroy: 1.2.0 1352 | encodeurl: 1.0.2 1353 | escape-html: 1.0.3 1354 | etag: 1.8.1 1355 | fresh: 0.5.2 1356 | http-errors: 2.0.0 1357 | mime: 1.6.0 1358 | ms: 2.1.3 1359 | on-finished: 2.4.1 1360 | range-parser: 1.2.1 1361 | statuses: 2.0.1 1362 | transitivePeerDependencies: 1363 | - supports-color 1364 | 1365 | serve-static@1.16.2: 1366 | dependencies: 1367 | encodeurl: 2.0.0 1368 | escape-html: 1.0.3 1369 | parseurl: 1.3.3 1370 | send: 0.19.0 1371 | transitivePeerDependencies: 1372 | - supports-color 1373 | 1374 | set-blocking@2.0.0: {} 1375 | 1376 | set-function-length@1.2.2: 1377 | dependencies: 1378 | define-data-property: 1.1.4 1379 | es-errors: 1.3.0 1380 | function-bind: 1.1.2 1381 | get-intrinsic: 1.2.4 1382 | gopd: 1.0.1 1383 | has-property-descriptors: 1.0.2 1384 | 1385 | setprototypeof@1.2.0: {} 1386 | 1387 | side-channel@1.0.6: 1388 | dependencies: 1389 | call-bind: 1.0.7 1390 | es-errors: 1.3.0 1391 | get-intrinsic: 1.2.4 1392 | object-inspect: 1.13.2 1393 | 1394 | sift@17.1.3: {} 1395 | 1396 | signal-exit@3.0.7: {} 1397 | 1398 | simple-update-notifier@2.0.0: 1399 | dependencies: 1400 | semver: 7.6.3 1401 | 1402 | sparse-bitfield@3.0.3: 1403 | dependencies: 1404 | memory-pager: 1.5.0 1405 | 1406 | statuses@2.0.1: {} 1407 | 1408 | string-width@4.2.3: 1409 | dependencies: 1410 | emoji-regex: 8.0.0 1411 | is-fullwidth-code-point: 3.0.0 1412 | strip-ansi: 6.0.1 1413 | 1414 | string_decoder@1.3.0: 1415 | dependencies: 1416 | safe-buffer: 5.2.1 1417 | 1418 | strip-ansi@6.0.1: 1419 | dependencies: 1420 | ansi-regex: 5.0.1 1421 | 1422 | supports-color@5.5.0: 1423 | dependencies: 1424 | has-flag: 3.0.0 1425 | 1426 | tar@6.2.1: 1427 | dependencies: 1428 | chownr: 2.0.0 1429 | fs-minipass: 2.1.0 1430 | minipass: 5.0.0 1431 | minizlib: 2.1.2 1432 | mkdirp: 1.0.4 1433 | yallist: 4.0.0 1434 | 1435 | to-regex-range@5.0.1: 1436 | dependencies: 1437 | is-number: 7.0.0 1438 | 1439 | toidentifier@1.0.1: {} 1440 | 1441 | touch@3.1.1: {} 1442 | 1443 | tr46@0.0.3: {} 1444 | 1445 | tr46@4.1.1: 1446 | dependencies: 1447 | punycode: 2.3.1 1448 | 1449 | type-is@1.6.18: 1450 | dependencies: 1451 | media-typer: 0.3.0 1452 | mime-types: 2.1.35 1453 | 1454 | undefsafe@2.0.5: {} 1455 | 1456 | unpipe@1.0.0: {} 1457 | 1458 | util-deprecate@1.0.2: {} 1459 | 1460 | utils-merge@1.0.1: {} 1461 | 1462 | vary@1.1.2: {} 1463 | 1464 | webidl-conversions@3.0.1: {} 1465 | 1466 | webidl-conversions@7.0.0: {} 1467 | 1468 | whatwg-url@13.0.0: 1469 | dependencies: 1470 | tr46: 4.1.1 1471 | webidl-conversions: 7.0.0 1472 | 1473 | whatwg-url@5.0.0: 1474 | dependencies: 1475 | tr46: 0.0.3 1476 | webidl-conversions: 3.0.1 1477 | 1478 | wide-align@1.1.5: 1479 | dependencies: 1480 | string-width: 4.2.3 1481 | 1482 | wrappy@1.0.2: {} 1483 | 1484 | yallist@4.0.0: {} 1485 | 1486 | zod@3.23.8: {} 1487 | -------------------------------------------------------------------------------- /backend/routes/courseRoutes.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import { 3 | createCourse, 4 | getCourses, 5 | updateCourse, 6 | deleteCourse, 7 | } from '../controllers/courseController.js'; 8 | 9 | const router = express.Router(); 10 | 11 | router.post('/courses', createCourse); 12 | router.get('/courses', getCourses); 13 | router.put('/courses/:id', updateCourse); 14 | router.delete('/courses/:id', deleteCourse); 15 | 16 | export default router; 17 | -------------------------------------------------------------------------------- /backend/routes/userRoutes.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import { signupUser, loginUser } from "../controllers/userController.js"; 3 | const router = Router(); 4 | 5 | router.route("/signup").post(signupUser); 6 | router.route("/login").post(loginUser); 7 | 8 | 9 | export default router; -------------------------------------------------------------------------------- /backend/validations/apiErrors.js: -------------------------------------------------------------------------------- 1 | class ApiError extends Error { 2 | constructor( 3 | statusCode, 4 | message= "Something went wrong!", 5 | errors = [], 6 | stack="" 7 | ){ 8 | super(message) 9 | this.statusCode = statusCode 10 | this.data = null 11 | this.message = message 12 | this.success = false 13 | this.errors = errors 14 | 15 | if(stack){ 16 | this.stack = stack 17 | }else{ 18 | Error.captureStackTrace(this, this.constructor) 19 | } 20 | } 21 | } 22 | 23 | export {ApiError}; 24 | -------------------------------------------------------------------------------- /backend/validations/courseValidation.js: -------------------------------------------------------------------------------- 1 | import { z } from 'zod'; 2 | 3 | const courseSchema = z.object({ 4 | name: z.string().min(1, 'Course name is required.'), 5 | price: z.number().nonnegative('Price must be a positive number.'), 6 | description: z.string().min(1, 'Description is required.'), 7 | }); 8 | 9 | export { courseSchema }; 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mongodb: 3 | image: mongo:latest 4 | container_name: mongo 5 | ports: 6 | - "27017:27017" 7 | volumes: 8 | - mongodb_data:/data/db 9 | restart: always 10 | 11 | backend: 12 | build: 13 | context: ./backend 14 | container_name: backend 15 | env_file: 16 | - ./backend/.env 17 | ports: 18 | - "3000:3000" 19 | depends_on: 20 | - mongodb 21 | restart: always 22 | volumes: 23 | - ./backend:/usr/src/app 24 | - /usr/src/app/node_modules 25 | 26 | frontend: 27 | image: nginx:latest 28 | container_name: frontend 29 | ports: 30 | - "8080:80" 31 | volumes: 32 | - ./frontend:/usr/share/nginx/html:ro 33 | restart: always 34 | 35 | volumes: 36 | mongodb_data: 37 | external: false 38 | -------------------------------------------------------------------------------- /frontend/IDE.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | IDE - codeX100 7 | 8 | 9 | 10 | 11 | 12 | 28 |
29 |

Online IDE

30 |

Select a language to write and execute your code:

31 | 32 |

Write, execute, and debug your code online:

33 | 34 |
35 | 36 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /frontend/Images/c++-thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arshadpatel/codeX100/d115b87c01f1053447c9da73be66c3ad56f5f0fc/frontend/Images/c++-thumbnail.jpg -------------------------------------------------------------------------------- /frontend/Images/codex100-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arshadpatel/codeX100/d115b87c01f1053447c9da73be66c3ad56f5f0fc/frontend/Images/codex100-logo.png -------------------------------------------------------------------------------- /frontend/Images/java-thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arshadpatel/codeX100/d115b87c01f1053447c9da73be66c3ad56f5f0fc/frontend/Images/java-thumbnail.jpg -------------------------------------------------------------------------------- /frontend/Images/javascript-thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arshadpatel/codeX100/d115b87c01f1053447c9da73be66c3ad56f5f0fc/frontend/Images/javascript-thumbnail.jpg -------------------------------------------------------------------------------- /frontend/Images/python-thumbnail.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arshadpatel/codeX100/d115b87c01f1053447c9da73be66c3ad56f5f0fc/frontend/Images/python-thumbnail.jpg -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | codeX100 - Learn Programming 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 38 | 39 | 40 |
41 |

Welcome to codeX100

42 |

Master programming with live classes and curated content

43 | Explore Courses 44 |
45 | 46 | 47 |
48 |

Your Courses

49 |
50 | 51 |

You haven't bought any courses yet.

52 |
53 | 54 |

Recommended Courses

55 | 90 |
91 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | -------------------------------------------------------------------------------- /frontend/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Login Form 7 | 83 | 84 | 85 | 86 | 103 | 104 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /frontend/script.js: -------------------------------------------------------------------------------- 1 | // JavaScript to handle future interactions 2 | 3 | // Placeholder for login function 4 | function login() { 5 | alert('Login functionality coming soon!'); 6 | } 7 | 8 | // Placeholder for sign-up function 9 | function signup() { 10 | alert('Sign-up functionality coming soon!'); 11 | } 12 | 13 | // add functionality to hamburger 14 | // Select the hamburger icon and navigation links 15 | document.getElementById('hamburger').addEventListener('click', function() { 16 | const navLinks = document.querySelector('.nav-links'); 17 | const icon = this.querySelector('i'); 18 | 19 | navLinks.classList.toggle('active'); 20 | 21 | if (navLinks.classList.contains('active')) { 22 | icon.classList.remove('fa-bars'); 23 | icon.classList.add('fa-times'); // Change to cross icon 24 | } else { 25 | icon.classList.remove('fa-times'); 26 | icon.classList.add('fa-bars'); // Revert to hamburger icon 27 | } 28 | }); 29 | 30 | -------------------------------------------------------------------------------- /frontend/styles.css: -------------------------------------------------------------------------------- 1 | /* Basic resets */ 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | } 7 | 8 | body { 9 | font-family: Arial, sans-serif; 10 | background-color: #f4f4f4; 11 | color: #333; 12 | } 13 | 14 | /* Navigation Bar */ 15 | .navbar { 16 | background-color: #333; 17 | color: white; 18 | padding: 1rem; 19 | display: flex; 20 | justify-content: space-between; 21 | align-items: center; 22 | position: relative; 23 | } 24 | 25 | .logo > a > img{ 26 | width: 200px; 27 | height: auto; 28 | } 29 | .navbar .nav-links { 30 | list-style: none; 31 | display: flex; 32 | align-items: center; 33 | justify-content: center; 34 | 35 | } 36 | 37 | .navbar .nav-links li { 38 | margin-left: 20px; 39 | 40 | } 41 | 42 | .navbar .nav-links a { 43 | color: white; 44 | text-decoration: none; 45 | font-size: 1rem; 46 | } 47 | .navbar .nav-links a:hover{ 48 | opacity: 0.7; 49 | } 50 | 51 | .hide,.cross { 52 | display: none; 53 | } 54 | 55 | @media (max-width: 1000px) { 56 | 57 | .hide1 a{ 58 | display:none; 59 | } 60 | .hide{ 61 | display: block; 62 | list-style: none; 63 | color: white; 64 | text-decoration: none; 65 | font-size: 2rem; 66 | margin-left: 20px; 67 | margin-right: 10px; 68 | } 69 | .hide{ 70 | opacity: 0.7; 71 | } 72 | } 73 | 74 | .show-nav-links { 75 | display: block; 76 | position: absolute; 77 | top: 60px; 78 | left: 0; 79 | background-color: #333; 80 | width: 100%; 81 | padding-top: 20px; 82 | padding-bottom: 20px; 83 | display: flex; 84 | flex-direction: column; 85 | align-items: center; 86 | opacity: 0.9; 87 | } 88 | 89 | .show-nav-links li { 90 | margin-bottom: 20px; 91 | 92 | } 93 | 94 | .show-nav-links a { 95 | color: #fff; 96 | font-size: 2rem; 97 | text-decoration: none; 98 | } 99 | 100 | 101 | .navbar .btn { 102 | padding: 0.5rem 1rem; 103 | background-color: #007bff; 104 | color: white; 105 | border-radius: 5px; 106 | } 107 | 108 | .navbar .btn:hover { 109 | background-color: #0056b3; 110 | } 111 | 112 | 113 | /* Hero Section */ 114 | .hero-section { 115 | text-align: center; 116 | padding: 50px 0; 117 | background-color: #007bff; 118 | color: white; 119 | } 120 | 121 | .hero-section h2 { 122 | font-size: 2.5rem; 123 | } 124 | 125 | .hero-section p { 126 | margin: 20px 0; 127 | font-size: 1.2rem; 128 | } 129 | 130 | .btn-primary { 131 | 132 | padding: 0.7rem 2rem; 133 | background-color: #ff5722; 134 | color: white; 135 | border-radius: 7px; 136 | text-decoration: none; 137 | } 138 | 139 | .btn-primary:hover { 140 | background-color: #e64a19; 141 | } 142 | 143 | /* Course Recommendations Section */ 144 | .course-recommendations { 145 | padding: 30px; 146 | background-color: #f9f9f9; 147 | border-radius: 8px; 148 | max-width: 1200px; 149 | margin: 20px auto; 150 | box-shadow: 0 8px 12px rgba(0, 0, 0, 0.1); 151 | } 152 | 153 | /* Heading styles */ 154 | .course-recommendations h2, 155 | .course-recommendations h3 { 156 | color: #333; 157 | font-family: 'Arial', sans-serif; 158 | margin-bottom: 15px; 159 | } 160 | 161 | .course-recommendations h2 { 162 | font-size: 2rem; 163 | font-weight: bold; 164 | text-align: center; 165 | } 166 | 167 | .course-recommendations h3 { 168 | font-size: 20px; 169 | font-weight: 600; 170 | 171 | } 172 | 173 | 174 | .course-list { 175 | margin-bottom: 30px; 176 | } 177 | 178 | .course-list p { 179 | font-size: 16px; 180 | color: #666; 181 | font-family: 'Roboto', sans-serif; 182 | text-align: center; 183 | } 184 | 185 | 186 | .recommended-courses { 187 | display: flex; 188 | flex-wrap: wrap; 189 | gap: 40px; 190 | margin: 20px 30px; 191 | } 192 | 193 | /* Course card styling */ 194 | .course-card { 195 | background-color: #fff; 196 | padding: 0; 197 | border-radius: 8px; 198 | box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); 199 | flex: 1 1 calc(50% - 20px); 200 | display: flex; 201 | flex-direction: column; 202 | transition: transform 0.3s ease, box-shadow 0.3s ease; 203 | max-width: 100%; 204 | overflow: hidden; 205 | } 206 | 207 | .course-card:hover { 208 | transform: translateY(-10px); 209 | box-shadow: 0 6px 16px rgba(0, 0, 0, 0.15); 210 | } 211 | 212 | /* Course thumbnail */ 213 | .course-thumbnail { 214 | width: 100%; 215 | height: 300px; 216 | object-fit: cover; 217 | border-bottom: 2px solid #eee; 218 | } 219 | 220 | /* Course info */ 221 | .course-info { 222 | padding: 15px 20px; 223 | display: flex; 224 | flex-direction: column; 225 | justify-content: space-between; 226 | } 227 | 228 | /* Course title and description */ 229 | .course-card h4 { 230 | font-size: 18px; 231 | color: #007bff; 232 | margin-bottom: 10px; 233 | } 234 | 235 | .course-card p { 236 | font-size: 14px; 237 | color: #555; 238 | flex-grow: 1; 239 | } 240 | 241 | /* Button styling */ 242 | .btn-secondary { 243 | padding: 10px 15px; 244 | background-color: #007bff; 245 | color: white; 246 | border: none; 247 | border-radius: 5px; 248 | cursor: pointer; 249 | font-family: 'Arial', sans-serif; 250 | font-size: 14px; 251 | transition: background-color 0.3s ease; 252 | text-align: center; 253 | margin-top: 10px; 254 | } 255 | 256 | .btn-secondary:hover { 257 | background-color: #0056b3; 258 | } 259 | 260 | /* Responsive design */ 261 | @media (max-width: 768px) { 262 | .course-recommendations { 263 | padding: 25px; 264 | } 265 | .course-recommendations h3{ 266 | text-align: center; 267 | } 268 | .recommended-courses { 269 | flex-direction: column; 270 | gap: 20px; 271 | margin: 10px 5px; 272 | } 273 | .course-card { 274 | flex: 1 1 100%; 275 | } 276 | } 277 | 278 | /* Footer */ 279 | 280 | .site-footer { 281 | background-color: #333; 282 | color: #fff; 283 | padding: 2rem 0; 284 | font-family: Arial, sans-serif; 285 | } 286 | 287 | .footer-container { 288 | display: flex; 289 | flex-wrap: wrap; 290 | justify-content: space-around; 291 | max-width: 1200px; 292 | margin: 0 auto; 293 | padding: 0 1rem; 294 | } 295 | 296 | .footer-section { 297 | flex: 1; 298 | min-width: 200px; 299 | margin-bottom: 1rem; 300 | } 301 | 302 | .footer-section h3 { 303 | font-size: 1.2rem; 304 | margin-bottom: 1rem; 305 | } 306 | 307 | .footer-section ul { 308 | list-style-type: none; 309 | padding: 0; 310 | } 311 | 312 | .footer-section ul li { 313 | margin-bottom: 0.5rem; 314 | } 315 | 316 | .footer-section a { 317 | color: #ddd; 318 | text-decoration: none; 319 | transition: color 0.3s ease; 320 | } 321 | 322 | .footer-section a:hover { 323 | color: #fff; 324 | } 325 | 326 | .social-icons { 327 | display: flex; 328 | gap: 1rem; 329 | } 330 | 331 | .social-icon { 332 | display: inline-flex; 333 | align-items: center; 334 | justify-content: center; 335 | width: 40px; 336 | height: 40px; 337 | background-color: #555; 338 | border-radius: 50%; 339 | transition: background-color 0.3s ease; 340 | } 341 | 342 | .social-icon:hover { 343 | background-color: #777; 344 | } 345 | 346 | .social-icon i { 347 | color: #fff; 348 | font-size: 1.2rem; 349 | } 350 | 351 | /* Specific colors for each social media platform */ 352 | .social-icon.linkedin:hover { 353 | background-color: #0077b5; 354 | } 355 | 356 | .social-icon.instagram:hover { 357 | background-color: #e4405f; 358 | } 359 | 360 | .social-icon.youtube:hover { 361 | background-color: #ff0000; 362 | } 363 | 364 | .footer-bottom { 365 | text-align: center; 366 | margin-top: 2rem; 367 | padding-top: 1rem; 368 | border-top: 1px solid #555; 369 | } 370 | 371 | .hamburger { 372 | display: none; 373 | cursor: pointer; 374 | } 375 | 376 | .hamburger i { 377 | font-size: 1.5rem; 378 | color: white; 379 | } 380 | 381 | @media (max-width: 768px) { 382 | .hamburger { 383 | display: block; 384 | } 385 | 386 | .nav-links { 387 | display: flex; 388 | flex-direction: column; 389 | position: absolute; 390 | top: 100%; 391 | left: 0; 392 | right: 0; 393 | background-color: #333; 394 | max-height: 0; 395 | overflow: hidden; 396 | transition: 0.3s ease-out; 397 | } 398 | .nav-links.active { 399 | max-height: 500px; /* Allows menu expansion */ 400 | background-color: rgb(51, 51, 51,0.9); 401 | 402 | } 403 | .nav-links li { 404 | margin-left: 0; 405 | margin-bottom: 20px; 406 | width: 70%; 407 | text-align: center; 408 | } 409 | 410 | .nav-links a { 411 | -links a { 412 | max-height: 0; 413 | display: block; 414 | padding: 10px; 415 | text-align: center; 416 | width: 100%; 417 | } 418 | 419 | .btn { 420 | background-color: #007bff; 421 | color: white; 422 | width: 100%; 423 | border-radius: 5px; 424 | padding: 10px; 425 | text-align: center; 426 | } 427 | .hero-section h2 { 428 | font-size: 2rem; 429 | } 430 | 431 | .hero-section p { 432 | font-size: 1rem; 433 | } 434 | 435 | .btn-primary { 436 | padding: 0.8rem 1.5rem; 437 | } 438 | .recommended-courses { 439 | display: flex; 440 | flex-direction: column; 441 | width: 100%; 442 | } 443 | .recommended-courses > div { 444 | width: 100%; 445 | } 446 | 447 | .course-card { 448 | width: 100%; 449 | margin: 10px auto; 450 | padding: 20px; 451 | text-align: center; 452 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); 453 | } 454 | 455 | .course-card h4 { 456 | font-size: 1rem; 457 | } 458 | 459 | .course-card p { 460 | font-size: 0.9rem; 461 | margin: 10px 0; 462 | } 463 | 464 | .btn-secondary { 465 | padding: 0.8rem 1.5rem; 466 | display: inline-block; 467 | margin-top: 10px; 468 | } 469 | 470 | .footer-container { 471 | flex-direction: column; 472 | text-align: center; 473 | } 474 | 475 | .social-icons { 476 | justify-content: center; 477 | } 478 | } 479 | 480 | 481 | 482 | 483 | /* Tablets (max-width: 1024px) */ 484 | @media (max-width: 1024px) { 485 | .navbar .nav-links li { 486 | margin-left: 15px; 487 | } 488 | 489 | .hero-section h2 { 490 | font-size: 2.2rem; 491 | } 492 | 493 | .hero-section p { 494 | font-size: 1.1rem; 495 | } 496 | .recommended-courses { 497 | display: flex; 498 | flex-direction: column; 499 | width: 100%; 500 | } 501 | .recommended-courses > div { 502 | width: 100%; 503 | } 504 | } 505 | } --------------------------------------------------------------------------------