Prathamesh2403 commited on
Commit
a44b98c
·
1 Parent(s): 2ad2028

Readme.md

Browse files
.dockerignore ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+ npm-debug.log
3
+ .git
4
+ .gitignore
5
+ README.md
6
+ .env
7
+ .nyc_output
8
+ coverage
9
+ .cache
10
+ .DS_Store
11
+ *.log
12
+ logs
13
+ pids
14
+ *.pid
15
+ *.seed
16
+ *.pid.lock
17
+ lib-cov
18
+ coverage
19
+ .nyc_output
20
+ .grunt
21
+ bower_components
22
+ .lock-wscript
23
+ build/Release
24
+ node_modules/
25
+ jspm_packages/
26
+ .npm
27
+ .eslintcache
28
+ .node_repl_history
29
+ *.tgz
30
+ .yarn-integrity
31
+ .env.local
32
+ .env.development.local
33
+ .env.test.local
34
+ .env.production.local
.gitignore ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Dependencies
2
+ node_modules/
3
+
4
+ # Environment variables
5
+ .env
6
+
7
+ # Logs
8
+ npm-debug.log*
Dockerfile ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use the official Node.js runtime as the base image
2
+ FROM node:18-alpine
3
+
4
+ # Set the working directory inside the container
5
+ WORKDIR /app
6
+
7
+ # Copy package.json and package-lock.json (if available)
8
+ COPY package*.json ./
9
+
10
+ # Install dependencies
11
+ RUN npm install --production
12
+
13
+ # Copy the rest of the application code
14
+ COPY . .
15
+
16
+ # Create a non-root user to run the app
17
+ RUN addgroup -g 1001 -S nodejs
18
+ RUN adduser -S nodejs -u 1001
19
+
20
+ # Change ownership of the app directory to the nodejs user
21
+ RUN chown -R nodejs:nodejs /app
22
+ USER nodejs
23
+
24
+ # Expose the port that the app runs on
25
+ EXPOSE 5000
26
+
27
+ # Define environment variables
28
+ ENV NODE_ENV=production
29
+ ENV PORT=5000
30
+
31
+ # Health check
32
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
33
+ CMD node healthcheck.js
34
+
35
+ # Start the application
36
+ CMD ["npm", "start"]
README_HF.md ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: RetroTech Inventory API
3
+ emoji: 🎮
4
+ colorFrom: cyan
5
+ colorTo: blue
6
+ sdk: docker
7
+ pinned: false
8
+ license: mit
9
+ short_description: A retro-themed inventory management system API
10
+ ---
11
+
12
+ # RetroTech Inventory API
13
+
14
+ A beautiful retro-themed inventory management system backend built with Node.js, Express, and MongoDB.
15
+
16
+ ## Features
17
+
18
+ - 🔐 JWT Authentication
19
+ - 📦 Product Management (CRUD operations)
20
+ - 📊 Low Stock Alerts with Email Notifications
21
+ - 🎮 Retro Tech Theme
22
+ - 📱 RESTful API
23
+
24
+ ## API Endpoints
25
+
26
+ ### Authentication
27
+ - `POST /api/users` - Register a new user
28
+ - `POST /api/users/login` - Login user
29
+
30
+ ### Products
31
+ - `GET /api/products` - Get all products (requires auth)
32
+ - `POST /api/products` - Create new product (requires auth)
33
+ - `PUT /api/products/:id` - Update product (requires auth)
34
+ - `DELETE /api/products/:id` - Delete product (requires auth)
35
+
36
+ ## Environment Variables
37
+
38
+ Set these in your Hugging Face Spaces secrets:
39
+
40
+ - `MONGODB_URI` - Your MongoDB connection string
41
+ - `JWT_SECRET` - Your JWT secret key
42
+ - `EMAIL_USER` - Email for notifications (optional)
43
+ - `EMAIL_PASS` - Email password (optional)
44
+ - `EMAIL_TO` - Admin email for alerts (optional)
45
+
46
+ ## Usage
47
+
48
+ The API is now running! You can test it by visiting the root endpoint or use it with the RetroTech Inventory frontend.
config/db.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import mongoose from "mongoose";
2
+
3
+ const connectDB = async () => {
4
+ try {
5
+ const conn = await mongoose.connect(process.env.MONGO_URI);
6
+ console.log(`MongoDB Connected: ${conn.connection.host}`);
7
+ } catch (error) {
8
+ console.error(`Error: ${error.message}`);
9
+ process.exit(1);
10
+ }
11
+ };
12
+
13
+ export default connectDB;
controllers/productController.js ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import Product from "../models/productModel.js";
2
+
3
+ // Create a new product
4
+ const createProduct = async (req, res) => {
5
+ try {
6
+ // Add the user ID from the protect middleware to the product
7
+ const product = await Product.create({
8
+ ...req.body,
9
+ user: req.user._id,
10
+ });
11
+ res.status(201).json(product);
12
+ } catch (error) {
13
+ res.status(500).json({ msg: error.message });
14
+ }
15
+ };
16
+
17
+ // Get all products
18
+ const getProducts = async (req, res) => {
19
+ try {
20
+ const products = await Product.find({});
21
+ res.status(200).json(products);
22
+ } catch (error) {
23
+ res.status(500).json({ msg: error.message });
24
+ }
25
+ };
26
+
27
+ // Get a single product by ID
28
+ const getProductById = async (req, res) => {
29
+ try {
30
+ const { id } = req.params;
31
+ const product = await Product.findById(id);
32
+ if (!product) {
33
+ return res.status(404).json({ msg: "Product not found" });
34
+ }
35
+ res.status(200).json(product);
36
+ } catch (error) {
37
+ res.status(500).json({ msg: error.message });
38
+ }
39
+ };
40
+
41
+ // Update a product
42
+ const updateProduct = async (req, res) => {
43
+ try {
44
+ const { id } = req.params;
45
+ const product = await Product.findByIdAndUpdate(id, req.body, {
46
+ new: true, // Return the modified document
47
+ runValidators: true,
48
+ });
49
+ if (!product) {
50
+ return res.status(404).json({ msg: "Product not found" });
51
+ }
52
+ res.status(200).json(product);
53
+ } catch (error) {
54
+ res.status(500).json({ msg: error.message });
55
+ }
56
+ };
57
+
58
+ // Delete a product
59
+ const deleteProduct = async (req, res) => {
60
+ try {
61
+ const { id } = req.params;
62
+ const product = await Product.findByIdAndDelete(id);
63
+ if (!product) {
64
+ return res.status(404).json({ msg: "Product not found" });
65
+ }
66
+ res.status(200).json({ msg: "Product deleted successfully" });
67
+ } catch (error) {
68
+ res.status(500).json({ msg: error.message });
69
+ }
70
+ };
71
+
72
+ export {
73
+ createProduct,
74
+ getProducts,
75
+ getProductById,
76
+ updateProduct,
77
+ deleteProduct,
78
+ };
controllers/userController.js ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import User from "../models/userModel.js";
2
+ import jwt from "jsonwebtoken";
3
+
4
+ // Generate JWT
5
+ const generateToken = (id) => {
6
+ return jwt.sign({ id }, process.env.JWT_SECRET, {
7
+ expiresIn: "30d",
8
+ });
9
+ };
10
+
11
+ // @desc Register a new user
12
+ // @route POST /api/users
13
+ // @access Public
14
+ const registerUser = async (req, res) => {
15
+ const { name, email, password } = req.body;
16
+
17
+ try {
18
+ const userExists = await User.findOne({ email });
19
+
20
+ if (userExists) {
21
+ res.status(400).json({ msg: "User already exists" });
22
+ return;
23
+ }
24
+
25
+ const user = await User.create({
26
+ name,
27
+ email,
28
+ password,
29
+ });
30
+
31
+ if (user) {
32
+ res.status(201).json({
33
+ _id: user._id,
34
+ name: user.name,
35
+ email: user.email,
36
+ token: generateToken(user._id),
37
+ });
38
+ } else {
39
+ res.status(400).json({ msg: "Invalid user data" });
40
+ }
41
+ } catch (error) {
42
+ res.status(500).json({ msg: error.message });
43
+ }
44
+ };
45
+
46
+ // @desc Auth user & get token (Login)
47
+ // @route POST /api/users/login
48
+ // @access Public
49
+ const loginUser = async (req, res) => {
50
+ const { email, password } = req.body;
51
+
52
+ try {
53
+ const user = await User.findOne({ email });
54
+
55
+ if (user && (await user.matchPassword(password))) {
56
+ res.json({
57
+ _id: user._id,
58
+ name: user.name,
59
+ email: user.email,
60
+ token: generateToken(user._id),
61
+ });
62
+ } else {
63
+ res.status(401).json({ msg: "Invalid email or password" });
64
+ }
65
+ } catch (error) {
66
+ res.status(500).json({ msg: error.message });
67
+ }
68
+ };
69
+
70
+ export { registerUser, loginUser };
env.example ADDED
@@ -0,0 +1 @@
 
 
1
+
healthcheck.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import http from 'http';
2
+
3
+ const options = {
4
+ host: 'localhost',
5
+ port: process.env.PORT || 5000,
6
+ path: '/',
7
+ timeout: 2000
8
+ };
9
+
10
+ const request = http.request(options, (res) => {
11
+ console.log(`STATUS: ${res.statusCode}`);
12
+ if (res.statusCode === 200) {
13
+ process.exit(0);
14
+ } else {
15
+ process.exit(1);
16
+ }
17
+ });
18
+
19
+ request.on('error', (err) => {
20
+ console.log('ERROR:', err);
21
+ process.exit(1);
22
+ });
23
+
24
+ request.end();
middleware/authMiddleware.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import jwt from "jsonwebtoken";
2
+ import User from "../models/userModel.js";
3
+
4
+ const protect = async (req, res, next) => {
5
+ let token;
6
+
7
+ if (
8
+ req.headers.authorization &&
9
+ req.headers.authorization.startsWith("Bearer")
10
+ ) {
11
+ try {
12
+ // Get token from header
13
+ token = req.headers.authorization.split(" ")[1];
14
+
15
+ // Verify token
16
+ const decoded = jwt.verify(token, process.env.JWT_SECRET);
17
+
18
+ // Get user from the token
19
+ req.user = await User.findById(decoded.id).select("-password");
20
+
21
+ next();
22
+ } catch (error) {
23
+ console.error(error);
24
+ res.status(401).json({ msg: "Not authorized, token failed" });
25
+ }
26
+ }
27
+
28
+ if (!token) {
29
+ res.status(401).json({ msg: "Not authorized, no token" });
30
+ }
31
+ };
32
+
33
+ export { protect };
models/productModel.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import mongoose from "mongoose";
2
+
3
+ const productSchema = mongoose.Schema(
4
+ {
5
+ // this links to a user
6
+ user: {
7
+ type: mongoose.Schema.Types.ObjectId,
8
+ required: true,
9
+ ref: "User",
10
+ },
11
+ name: {
12
+ type: String,
13
+ required: [true, "Please add a product name"],
14
+ trim: true,
15
+ },
16
+ sku: {
17
+ type: String,
18
+ required: true,
19
+ default: "SKU",
20
+ trim: true,
21
+ },
22
+ quantity: {
23
+ type: Number,
24
+ required: [true, "Please add a quantity"],
25
+ default: 0,
26
+ },
27
+ price: {
28
+ type: Number,
29
+ required: [true, "Please add a price"],
30
+ default: 0,
31
+ },
32
+ description: {
33
+ type: String,
34
+ required: [true, "Please add a description"],
35
+ trim: true,
36
+ },
37
+ lowStockThreshold: {
38
+ type: Number,
39
+ required: [true, "Please add a low stock threshold"],
40
+ default: 0,
41
+ },
42
+ },
43
+ {
44
+ timestamps: true,
45
+ }
46
+ );
47
+
48
+ const Product = mongoose.model("Product", productSchema);
49
+ export default Product;
models/userModel.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import mongoose from "mongoose";
2
+ import bcrypt from "bcryptjs";
3
+
4
+ const userSchema = mongoose.Schema(
5
+ {
6
+ name: {
7
+ type: String,
8
+ required: true,
9
+ },
10
+ email: {
11
+ type: String,
12
+ required: true,
13
+ unique: true,
14
+ },
15
+ password: {
16
+ type: String,
17
+ required: true,
18
+ },
19
+ },
20
+ {
21
+ timestamps: true,
22
+ }
23
+ );
24
+
25
+ // Match user entered password to hashed password in database
26
+ userSchema.methods.matchPassword = async function (enteredPassword) {
27
+ return await bcrypt.compare(enteredPassword, this.password);
28
+ };
29
+
30
+ // Encrypt password using bcrypt before saving a new user
31
+ userSchema.pre("save", async function (next) {
32
+ if (!this.isModified("password")) {
33
+ next();
34
+ }
35
+ const salt = await bcrypt.genSalt(10);
36
+ this.password = await bcrypt.hash(this.password, salt);
37
+ });
38
+
39
+ const User = mongoose.model("User", userSchema);
40
+
41
+ export default User;
package-lock.json ADDED
@@ -0,0 +1,1542 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "backend",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "backend",
9
+ "version": "1.0.0",
10
+ "license": "ISC",
11
+ "dependencies": {
12
+ "bcryptjs": "^3.0.2",
13
+ "dotenv": "^17.2.3",
14
+ "express": "^5.1.0",
15
+ "jsonwebtoken": "^9.0.2",
16
+ "mongoose": "^8.19.1",
17
+ "node-cron": "^4.2.1",
18
+ "nodemailer": "^7.0.9"
19
+ },
20
+ "devDependencies": {
21
+ "nodemon": "^3.1.10"
22
+ }
23
+ },
24
+ "node_modules/@mongodb-js/saslprep": {
25
+ "version": "1.3.1",
26
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.1.tgz",
27
+ "integrity": "sha512-6nZrq5kfAz0POWyhljnbWQQJQ5uT8oE2ddX303q1uY0tWsivWKgBDXBBvuFPwOqRRalXJuVO9EjOdVtuhLX0zg==",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "sparse-bitfield": "^3.0.3"
31
+ }
32
+ },
33
+ "node_modules/@types/webidl-conversions": {
34
+ "version": "7.0.3",
35
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
36
+ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
37
+ "license": "MIT"
38
+ },
39
+ "node_modules/@types/whatwg-url": {
40
+ "version": "11.0.5",
41
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
42
+ "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "@types/webidl-conversions": "*"
46
+ }
47
+ },
48
+ "node_modules/accepts": {
49
+ "version": "2.0.0",
50
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
51
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
52
+ "license": "MIT",
53
+ "dependencies": {
54
+ "mime-types": "^3.0.0",
55
+ "negotiator": "^1.0.0"
56
+ },
57
+ "engines": {
58
+ "node": ">= 0.6"
59
+ }
60
+ },
61
+ "node_modules/anymatch": {
62
+ "version": "3.1.3",
63
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
64
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
65
+ "dev": true,
66
+ "license": "ISC",
67
+ "dependencies": {
68
+ "normalize-path": "^3.0.0",
69
+ "picomatch": "^2.0.4"
70
+ },
71
+ "engines": {
72
+ "node": ">= 8"
73
+ }
74
+ },
75
+ "node_modules/balanced-match": {
76
+ "version": "1.0.2",
77
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
78
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
79
+ "dev": true,
80
+ "license": "MIT"
81
+ },
82
+ "node_modules/bcryptjs": {
83
+ "version": "3.0.2",
84
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz",
85
+ "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==",
86
+ "license": "BSD-3-Clause",
87
+ "bin": {
88
+ "bcrypt": "bin/bcrypt"
89
+ }
90
+ },
91
+ "node_modules/binary-extensions": {
92
+ "version": "2.3.0",
93
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
94
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
95
+ "dev": true,
96
+ "license": "MIT",
97
+ "engines": {
98
+ "node": ">=8"
99
+ },
100
+ "funding": {
101
+ "url": "https://github.com/sponsors/sindresorhus"
102
+ }
103
+ },
104
+ "node_modules/body-parser": {
105
+ "version": "2.2.0",
106
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
107
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
108
+ "license": "MIT",
109
+ "dependencies": {
110
+ "bytes": "^3.1.2",
111
+ "content-type": "^1.0.5",
112
+ "debug": "^4.4.0",
113
+ "http-errors": "^2.0.0",
114
+ "iconv-lite": "^0.6.3",
115
+ "on-finished": "^2.4.1",
116
+ "qs": "^6.14.0",
117
+ "raw-body": "^3.0.0",
118
+ "type-is": "^2.0.0"
119
+ },
120
+ "engines": {
121
+ "node": ">=18"
122
+ }
123
+ },
124
+ "node_modules/brace-expansion": {
125
+ "version": "1.1.12",
126
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
127
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
128
+ "dev": true,
129
+ "license": "MIT",
130
+ "dependencies": {
131
+ "balanced-match": "^1.0.0",
132
+ "concat-map": "0.0.1"
133
+ }
134
+ },
135
+ "node_modules/braces": {
136
+ "version": "3.0.3",
137
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
138
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
139
+ "dev": true,
140
+ "license": "MIT",
141
+ "dependencies": {
142
+ "fill-range": "^7.1.1"
143
+ },
144
+ "engines": {
145
+ "node": ">=8"
146
+ }
147
+ },
148
+ "node_modules/bson": {
149
+ "version": "6.10.4",
150
+ "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz",
151
+ "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==",
152
+ "license": "Apache-2.0",
153
+ "engines": {
154
+ "node": ">=16.20.1"
155
+ }
156
+ },
157
+ "node_modules/buffer-equal-constant-time": {
158
+ "version": "1.0.1",
159
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
160
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
161
+ "license": "BSD-3-Clause"
162
+ },
163
+ "node_modules/bytes": {
164
+ "version": "3.1.2",
165
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
166
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
167
+ "license": "MIT",
168
+ "engines": {
169
+ "node": ">= 0.8"
170
+ }
171
+ },
172
+ "node_modules/call-bind-apply-helpers": {
173
+ "version": "1.0.2",
174
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
175
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
176
+ "license": "MIT",
177
+ "dependencies": {
178
+ "es-errors": "^1.3.0",
179
+ "function-bind": "^1.1.2"
180
+ },
181
+ "engines": {
182
+ "node": ">= 0.4"
183
+ }
184
+ },
185
+ "node_modules/call-bound": {
186
+ "version": "1.0.4",
187
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
188
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
189
+ "license": "MIT",
190
+ "dependencies": {
191
+ "call-bind-apply-helpers": "^1.0.2",
192
+ "get-intrinsic": "^1.3.0"
193
+ },
194
+ "engines": {
195
+ "node": ">= 0.4"
196
+ },
197
+ "funding": {
198
+ "url": "https://github.com/sponsors/ljharb"
199
+ }
200
+ },
201
+ "node_modules/chokidar": {
202
+ "version": "3.6.0",
203
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
204
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
205
+ "dev": true,
206
+ "license": "MIT",
207
+ "dependencies": {
208
+ "anymatch": "~3.1.2",
209
+ "braces": "~3.0.2",
210
+ "glob-parent": "~5.1.2",
211
+ "is-binary-path": "~2.1.0",
212
+ "is-glob": "~4.0.1",
213
+ "normalize-path": "~3.0.0",
214
+ "readdirp": "~3.6.0"
215
+ },
216
+ "engines": {
217
+ "node": ">= 8.10.0"
218
+ },
219
+ "funding": {
220
+ "url": "https://paulmillr.com/funding/"
221
+ },
222
+ "optionalDependencies": {
223
+ "fsevents": "~2.3.2"
224
+ }
225
+ },
226
+ "node_modules/concat-map": {
227
+ "version": "0.0.1",
228
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
229
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
230
+ "dev": true,
231
+ "license": "MIT"
232
+ },
233
+ "node_modules/content-disposition": {
234
+ "version": "1.0.0",
235
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
236
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
237
+ "license": "MIT",
238
+ "dependencies": {
239
+ "safe-buffer": "5.2.1"
240
+ },
241
+ "engines": {
242
+ "node": ">= 0.6"
243
+ }
244
+ },
245
+ "node_modules/content-type": {
246
+ "version": "1.0.5",
247
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
248
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
249
+ "license": "MIT",
250
+ "engines": {
251
+ "node": ">= 0.6"
252
+ }
253
+ },
254
+ "node_modules/cookie": {
255
+ "version": "0.7.2",
256
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
257
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
258
+ "license": "MIT",
259
+ "engines": {
260
+ "node": ">= 0.6"
261
+ }
262
+ },
263
+ "node_modules/cookie-signature": {
264
+ "version": "1.2.2",
265
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
266
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
267
+ "license": "MIT",
268
+ "engines": {
269
+ "node": ">=6.6.0"
270
+ }
271
+ },
272
+ "node_modules/debug": {
273
+ "version": "4.4.3",
274
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
275
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
276
+ "license": "MIT",
277
+ "dependencies": {
278
+ "ms": "^2.1.3"
279
+ },
280
+ "engines": {
281
+ "node": ">=6.0"
282
+ },
283
+ "peerDependenciesMeta": {
284
+ "supports-color": {
285
+ "optional": true
286
+ }
287
+ }
288
+ },
289
+ "node_modules/depd": {
290
+ "version": "2.0.0",
291
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
292
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
293
+ "license": "MIT",
294
+ "engines": {
295
+ "node": ">= 0.8"
296
+ }
297
+ },
298
+ "node_modules/dotenv": {
299
+ "version": "17.2.3",
300
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
301
+ "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
302
+ "license": "BSD-2-Clause",
303
+ "engines": {
304
+ "node": ">=12"
305
+ },
306
+ "funding": {
307
+ "url": "https://dotenvx.com"
308
+ }
309
+ },
310
+ "node_modules/dunder-proto": {
311
+ "version": "1.0.1",
312
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
313
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
314
+ "license": "MIT",
315
+ "dependencies": {
316
+ "call-bind-apply-helpers": "^1.0.1",
317
+ "es-errors": "^1.3.0",
318
+ "gopd": "^1.2.0"
319
+ },
320
+ "engines": {
321
+ "node": ">= 0.4"
322
+ }
323
+ },
324
+ "node_modules/ecdsa-sig-formatter": {
325
+ "version": "1.0.11",
326
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
327
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
328
+ "license": "Apache-2.0",
329
+ "dependencies": {
330
+ "safe-buffer": "^5.0.1"
331
+ }
332
+ },
333
+ "node_modules/ee-first": {
334
+ "version": "1.1.1",
335
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
336
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
337
+ "license": "MIT"
338
+ },
339
+ "node_modules/encodeurl": {
340
+ "version": "2.0.0",
341
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
342
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
343
+ "license": "MIT",
344
+ "engines": {
345
+ "node": ">= 0.8"
346
+ }
347
+ },
348
+ "node_modules/es-define-property": {
349
+ "version": "1.0.1",
350
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
351
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
352
+ "license": "MIT",
353
+ "engines": {
354
+ "node": ">= 0.4"
355
+ }
356
+ },
357
+ "node_modules/es-errors": {
358
+ "version": "1.3.0",
359
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
360
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
361
+ "license": "MIT",
362
+ "engines": {
363
+ "node": ">= 0.4"
364
+ }
365
+ },
366
+ "node_modules/es-object-atoms": {
367
+ "version": "1.1.1",
368
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
369
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
370
+ "license": "MIT",
371
+ "dependencies": {
372
+ "es-errors": "^1.3.0"
373
+ },
374
+ "engines": {
375
+ "node": ">= 0.4"
376
+ }
377
+ },
378
+ "node_modules/escape-html": {
379
+ "version": "1.0.3",
380
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
381
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
382
+ "license": "MIT"
383
+ },
384
+ "node_modules/etag": {
385
+ "version": "1.8.1",
386
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
387
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
388
+ "license": "MIT",
389
+ "engines": {
390
+ "node": ">= 0.6"
391
+ }
392
+ },
393
+ "node_modules/express": {
394
+ "version": "5.1.0",
395
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
396
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
397
+ "license": "MIT",
398
+ "dependencies": {
399
+ "accepts": "^2.0.0",
400
+ "body-parser": "^2.2.0",
401
+ "content-disposition": "^1.0.0",
402
+ "content-type": "^1.0.5",
403
+ "cookie": "^0.7.1",
404
+ "cookie-signature": "^1.2.1",
405
+ "debug": "^4.4.0",
406
+ "encodeurl": "^2.0.0",
407
+ "escape-html": "^1.0.3",
408
+ "etag": "^1.8.1",
409
+ "finalhandler": "^2.1.0",
410
+ "fresh": "^2.0.0",
411
+ "http-errors": "^2.0.0",
412
+ "merge-descriptors": "^2.0.0",
413
+ "mime-types": "^3.0.0",
414
+ "on-finished": "^2.4.1",
415
+ "once": "^1.4.0",
416
+ "parseurl": "^1.3.3",
417
+ "proxy-addr": "^2.0.7",
418
+ "qs": "^6.14.0",
419
+ "range-parser": "^1.2.1",
420
+ "router": "^2.2.0",
421
+ "send": "^1.1.0",
422
+ "serve-static": "^2.2.0",
423
+ "statuses": "^2.0.1",
424
+ "type-is": "^2.0.1",
425
+ "vary": "^1.1.2"
426
+ },
427
+ "engines": {
428
+ "node": ">= 18"
429
+ },
430
+ "funding": {
431
+ "type": "opencollective",
432
+ "url": "https://opencollective.com/express"
433
+ }
434
+ },
435
+ "node_modules/fill-range": {
436
+ "version": "7.1.1",
437
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
438
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
439
+ "dev": true,
440
+ "license": "MIT",
441
+ "dependencies": {
442
+ "to-regex-range": "^5.0.1"
443
+ },
444
+ "engines": {
445
+ "node": ">=8"
446
+ }
447
+ },
448
+ "node_modules/finalhandler": {
449
+ "version": "2.1.0",
450
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
451
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
452
+ "license": "MIT",
453
+ "dependencies": {
454
+ "debug": "^4.4.0",
455
+ "encodeurl": "^2.0.0",
456
+ "escape-html": "^1.0.3",
457
+ "on-finished": "^2.4.1",
458
+ "parseurl": "^1.3.3",
459
+ "statuses": "^2.0.1"
460
+ },
461
+ "engines": {
462
+ "node": ">= 0.8"
463
+ }
464
+ },
465
+ "node_modules/forwarded": {
466
+ "version": "0.2.0",
467
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
468
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
469
+ "license": "MIT",
470
+ "engines": {
471
+ "node": ">= 0.6"
472
+ }
473
+ },
474
+ "node_modules/fresh": {
475
+ "version": "2.0.0",
476
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
477
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
478
+ "license": "MIT",
479
+ "engines": {
480
+ "node": ">= 0.8"
481
+ }
482
+ },
483
+ "node_modules/fsevents": {
484
+ "version": "2.3.3",
485
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
486
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
487
+ "dev": true,
488
+ "hasInstallScript": true,
489
+ "license": "MIT",
490
+ "optional": true,
491
+ "os": [
492
+ "darwin"
493
+ ],
494
+ "engines": {
495
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
496
+ }
497
+ },
498
+ "node_modules/function-bind": {
499
+ "version": "1.1.2",
500
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
501
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
502
+ "license": "MIT",
503
+ "funding": {
504
+ "url": "https://github.com/sponsors/ljharb"
505
+ }
506
+ },
507
+ "node_modules/get-intrinsic": {
508
+ "version": "1.3.0",
509
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
510
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
511
+ "license": "MIT",
512
+ "dependencies": {
513
+ "call-bind-apply-helpers": "^1.0.2",
514
+ "es-define-property": "^1.0.1",
515
+ "es-errors": "^1.3.0",
516
+ "es-object-atoms": "^1.1.1",
517
+ "function-bind": "^1.1.2",
518
+ "get-proto": "^1.0.1",
519
+ "gopd": "^1.2.0",
520
+ "has-symbols": "^1.1.0",
521
+ "hasown": "^2.0.2",
522
+ "math-intrinsics": "^1.1.0"
523
+ },
524
+ "engines": {
525
+ "node": ">= 0.4"
526
+ },
527
+ "funding": {
528
+ "url": "https://github.com/sponsors/ljharb"
529
+ }
530
+ },
531
+ "node_modules/get-proto": {
532
+ "version": "1.0.1",
533
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
534
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
535
+ "license": "MIT",
536
+ "dependencies": {
537
+ "dunder-proto": "^1.0.1",
538
+ "es-object-atoms": "^1.0.0"
539
+ },
540
+ "engines": {
541
+ "node": ">= 0.4"
542
+ }
543
+ },
544
+ "node_modules/glob-parent": {
545
+ "version": "5.1.2",
546
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
547
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
548
+ "dev": true,
549
+ "license": "ISC",
550
+ "dependencies": {
551
+ "is-glob": "^4.0.1"
552
+ },
553
+ "engines": {
554
+ "node": ">= 6"
555
+ }
556
+ },
557
+ "node_modules/gopd": {
558
+ "version": "1.2.0",
559
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
560
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
561
+ "license": "MIT",
562
+ "engines": {
563
+ "node": ">= 0.4"
564
+ },
565
+ "funding": {
566
+ "url": "https://github.com/sponsors/ljharb"
567
+ }
568
+ },
569
+ "node_modules/has-flag": {
570
+ "version": "3.0.0",
571
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
572
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
573
+ "dev": true,
574
+ "license": "MIT",
575
+ "engines": {
576
+ "node": ">=4"
577
+ }
578
+ },
579
+ "node_modules/has-symbols": {
580
+ "version": "1.1.0",
581
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
582
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
583
+ "license": "MIT",
584
+ "engines": {
585
+ "node": ">= 0.4"
586
+ },
587
+ "funding": {
588
+ "url": "https://github.com/sponsors/ljharb"
589
+ }
590
+ },
591
+ "node_modules/hasown": {
592
+ "version": "2.0.2",
593
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
594
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
595
+ "license": "MIT",
596
+ "dependencies": {
597
+ "function-bind": "^1.1.2"
598
+ },
599
+ "engines": {
600
+ "node": ">= 0.4"
601
+ }
602
+ },
603
+ "node_modules/http-errors": {
604
+ "version": "2.0.0",
605
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
606
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
607
+ "license": "MIT",
608
+ "dependencies": {
609
+ "depd": "2.0.0",
610
+ "inherits": "2.0.4",
611
+ "setprototypeof": "1.2.0",
612
+ "statuses": "2.0.1",
613
+ "toidentifier": "1.0.1"
614
+ },
615
+ "engines": {
616
+ "node": ">= 0.8"
617
+ }
618
+ },
619
+ "node_modules/http-errors/node_modules/statuses": {
620
+ "version": "2.0.1",
621
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
622
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
623
+ "license": "MIT",
624
+ "engines": {
625
+ "node": ">= 0.8"
626
+ }
627
+ },
628
+ "node_modules/iconv-lite": {
629
+ "version": "0.6.3",
630
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
631
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
632
+ "license": "MIT",
633
+ "dependencies": {
634
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
635
+ },
636
+ "engines": {
637
+ "node": ">=0.10.0"
638
+ }
639
+ },
640
+ "node_modules/ignore-by-default": {
641
+ "version": "1.0.1",
642
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
643
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
644
+ "dev": true,
645
+ "license": "ISC"
646
+ },
647
+ "node_modules/inherits": {
648
+ "version": "2.0.4",
649
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
650
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
651
+ "license": "ISC"
652
+ },
653
+ "node_modules/ipaddr.js": {
654
+ "version": "1.9.1",
655
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
656
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
657
+ "license": "MIT",
658
+ "engines": {
659
+ "node": ">= 0.10"
660
+ }
661
+ },
662
+ "node_modules/is-binary-path": {
663
+ "version": "2.1.0",
664
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
665
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
666
+ "dev": true,
667
+ "license": "MIT",
668
+ "dependencies": {
669
+ "binary-extensions": "^2.0.0"
670
+ },
671
+ "engines": {
672
+ "node": ">=8"
673
+ }
674
+ },
675
+ "node_modules/is-extglob": {
676
+ "version": "2.1.1",
677
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
678
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
679
+ "dev": true,
680
+ "license": "MIT",
681
+ "engines": {
682
+ "node": ">=0.10.0"
683
+ }
684
+ },
685
+ "node_modules/is-glob": {
686
+ "version": "4.0.3",
687
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
688
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
689
+ "dev": true,
690
+ "license": "MIT",
691
+ "dependencies": {
692
+ "is-extglob": "^2.1.1"
693
+ },
694
+ "engines": {
695
+ "node": ">=0.10.0"
696
+ }
697
+ },
698
+ "node_modules/is-number": {
699
+ "version": "7.0.0",
700
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
701
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
702
+ "dev": true,
703
+ "license": "MIT",
704
+ "engines": {
705
+ "node": ">=0.12.0"
706
+ }
707
+ },
708
+ "node_modules/is-promise": {
709
+ "version": "4.0.0",
710
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
711
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
712
+ "license": "MIT"
713
+ },
714
+ "node_modules/jsonwebtoken": {
715
+ "version": "9.0.2",
716
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
717
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
718
+ "license": "MIT",
719
+ "dependencies": {
720
+ "jws": "^3.2.2",
721
+ "lodash.includes": "^4.3.0",
722
+ "lodash.isboolean": "^3.0.3",
723
+ "lodash.isinteger": "^4.0.4",
724
+ "lodash.isnumber": "^3.0.3",
725
+ "lodash.isplainobject": "^4.0.6",
726
+ "lodash.isstring": "^4.0.1",
727
+ "lodash.once": "^4.0.0",
728
+ "ms": "^2.1.1",
729
+ "semver": "^7.5.4"
730
+ },
731
+ "engines": {
732
+ "node": ">=12",
733
+ "npm": ">=6"
734
+ }
735
+ },
736
+ "node_modules/jwa": {
737
+ "version": "1.4.2",
738
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
739
+ "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
740
+ "license": "MIT",
741
+ "dependencies": {
742
+ "buffer-equal-constant-time": "^1.0.1",
743
+ "ecdsa-sig-formatter": "1.0.11",
744
+ "safe-buffer": "^5.0.1"
745
+ }
746
+ },
747
+ "node_modules/jws": {
748
+ "version": "3.2.2",
749
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
750
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
751
+ "license": "MIT",
752
+ "dependencies": {
753
+ "jwa": "^1.4.1",
754
+ "safe-buffer": "^5.0.1"
755
+ }
756
+ },
757
+ "node_modules/kareem": {
758
+ "version": "2.6.3",
759
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
760
+ "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
761
+ "license": "Apache-2.0",
762
+ "engines": {
763
+ "node": ">=12.0.0"
764
+ }
765
+ },
766
+ "node_modules/lodash.includes": {
767
+ "version": "4.3.0",
768
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
769
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
770
+ "license": "MIT"
771
+ },
772
+ "node_modules/lodash.isboolean": {
773
+ "version": "3.0.3",
774
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
775
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
776
+ "license": "MIT"
777
+ },
778
+ "node_modules/lodash.isinteger": {
779
+ "version": "4.0.4",
780
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
781
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
782
+ "license": "MIT"
783
+ },
784
+ "node_modules/lodash.isnumber": {
785
+ "version": "3.0.3",
786
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
787
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
788
+ "license": "MIT"
789
+ },
790
+ "node_modules/lodash.isplainobject": {
791
+ "version": "4.0.6",
792
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
793
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
794
+ "license": "MIT"
795
+ },
796
+ "node_modules/lodash.isstring": {
797
+ "version": "4.0.1",
798
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
799
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
800
+ "license": "MIT"
801
+ },
802
+ "node_modules/lodash.once": {
803
+ "version": "4.1.1",
804
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
805
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
806
+ "license": "MIT"
807
+ },
808
+ "node_modules/math-intrinsics": {
809
+ "version": "1.1.0",
810
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
811
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
812
+ "license": "MIT",
813
+ "engines": {
814
+ "node": ">= 0.4"
815
+ }
816
+ },
817
+ "node_modules/media-typer": {
818
+ "version": "1.1.0",
819
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
820
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
821
+ "license": "MIT",
822
+ "engines": {
823
+ "node": ">= 0.8"
824
+ }
825
+ },
826
+ "node_modules/memory-pager": {
827
+ "version": "1.5.0",
828
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
829
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
830
+ "license": "MIT"
831
+ },
832
+ "node_modules/merge-descriptors": {
833
+ "version": "2.0.0",
834
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
835
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
836
+ "license": "MIT",
837
+ "engines": {
838
+ "node": ">=18"
839
+ },
840
+ "funding": {
841
+ "url": "https://github.com/sponsors/sindresorhus"
842
+ }
843
+ },
844
+ "node_modules/mime-db": {
845
+ "version": "1.54.0",
846
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
847
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
848
+ "license": "MIT",
849
+ "engines": {
850
+ "node": ">= 0.6"
851
+ }
852
+ },
853
+ "node_modules/mime-types": {
854
+ "version": "3.0.1",
855
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
856
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
857
+ "license": "MIT",
858
+ "dependencies": {
859
+ "mime-db": "^1.54.0"
860
+ },
861
+ "engines": {
862
+ "node": ">= 0.6"
863
+ }
864
+ },
865
+ "node_modules/minimatch": {
866
+ "version": "3.1.2",
867
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
868
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
869
+ "dev": true,
870
+ "license": "ISC",
871
+ "dependencies": {
872
+ "brace-expansion": "^1.1.7"
873
+ },
874
+ "engines": {
875
+ "node": "*"
876
+ }
877
+ },
878
+ "node_modules/mongodb": {
879
+ "version": "6.20.0",
880
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz",
881
+ "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==",
882
+ "license": "Apache-2.0",
883
+ "dependencies": {
884
+ "@mongodb-js/saslprep": "^1.3.0",
885
+ "bson": "^6.10.4",
886
+ "mongodb-connection-string-url": "^3.0.2"
887
+ },
888
+ "engines": {
889
+ "node": ">=16.20.1"
890
+ },
891
+ "peerDependencies": {
892
+ "@aws-sdk/credential-providers": "^3.188.0",
893
+ "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
894
+ "gcp-metadata": "^5.2.0",
895
+ "kerberos": "^2.0.1",
896
+ "mongodb-client-encryption": ">=6.0.0 <7",
897
+ "snappy": "^7.3.2",
898
+ "socks": "^2.7.1"
899
+ },
900
+ "peerDependenciesMeta": {
901
+ "@aws-sdk/credential-providers": {
902
+ "optional": true
903
+ },
904
+ "@mongodb-js/zstd": {
905
+ "optional": true
906
+ },
907
+ "gcp-metadata": {
908
+ "optional": true
909
+ },
910
+ "kerberos": {
911
+ "optional": true
912
+ },
913
+ "mongodb-client-encryption": {
914
+ "optional": true
915
+ },
916
+ "snappy": {
917
+ "optional": true
918
+ },
919
+ "socks": {
920
+ "optional": true
921
+ }
922
+ }
923
+ },
924
+ "node_modules/mongodb-connection-string-url": {
925
+ "version": "3.0.2",
926
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz",
927
+ "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==",
928
+ "license": "Apache-2.0",
929
+ "dependencies": {
930
+ "@types/whatwg-url": "^11.0.2",
931
+ "whatwg-url": "^14.1.0 || ^13.0.0"
932
+ }
933
+ },
934
+ "node_modules/mongoose": {
935
+ "version": "8.19.1",
936
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.19.1.tgz",
937
+ "integrity": "sha512-oB7hGQJn4f8aebqE7mhE54EReb5cxVgpCxQCQj0K/cK3q4J3Tg08nFP6sM52nJ4Hlm8jsDnhVYpqIITZUAhckQ==",
938
+ "license": "MIT",
939
+ "dependencies": {
940
+ "bson": "^6.10.4",
941
+ "kareem": "2.6.3",
942
+ "mongodb": "~6.20.0",
943
+ "mpath": "0.9.0",
944
+ "mquery": "5.0.0",
945
+ "ms": "2.1.3",
946
+ "sift": "17.1.3"
947
+ },
948
+ "engines": {
949
+ "node": ">=16.20.1"
950
+ },
951
+ "funding": {
952
+ "type": "opencollective",
953
+ "url": "https://opencollective.com/mongoose"
954
+ }
955
+ },
956
+ "node_modules/mpath": {
957
+ "version": "0.9.0",
958
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
959
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
960
+ "license": "MIT",
961
+ "engines": {
962
+ "node": ">=4.0.0"
963
+ }
964
+ },
965
+ "node_modules/mquery": {
966
+ "version": "5.0.0",
967
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
968
+ "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
969
+ "license": "MIT",
970
+ "dependencies": {
971
+ "debug": "4.x"
972
+ },
973
+ "engines": {
974
+ "node": ">=14.0.0"
975
+ }
976
+ },
977
+ "node_modules/ms": {
978
+ "version": "2.1.3",
979
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
980
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
981
+ "license": "MIT"
982
+ },
983
+ "node_modules/negotiator": {
984
+ "version": "1.0.0",
985
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
986
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
987
+ "license": "MIT",
988
+ "engines": {
989
+ "node": ">= 0.6"
990
+ }
991
+ },
992
+ "node_modules/node-cron": {
993
+ "version": "4.2.1",
994
+ "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz",
995
+ "integrity": "sha512-lgimEHPE/QDgFlywTd8yTR61ptugX3Qer29efeyWw2rv259HtGBNn1vZVmp8lB9uo9wC0t/AT4iGqXxia+CJFg==",
996
+ "license": "ISC",
997
+ "engines": {
998
+ "node": ">=6.0.0"
999
+ }
1000
+ },
1001
+ "node_modules/nodemailer": {
1002
+ "version": "7.0.9",
1003
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.9.tgz",
1004
+ "integrity": "sha512-9/Qm0qXIByEP8lEV2qOqcAW7bRpL8CR9jcTwk3NBnHJNmP9fIJ86g2fgmIXqHY+nj55ZEMwWqYAT2QTDpRUYiQ==",
1005
+ "license": "MIT-0",
1006
+ "engines": {
1007
+ "node": ">=6.0.0"
1008
+ }
1009
+ },
1010
+ "node_modules/nodemon": {
1011
+ "version": "3.1.10",
1012
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz",
1013
+ "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==",
1014
+ "dev": true,
1015
+ "license": "MIT",
1016
+ "dependencies": {
1017
+ "chokidar": "^3.5.2",
1018
+ "debug": "^4",
1019
+ "ignore-by-default": "^1.0.1",
1020
+ "minimatch": "^3.1.2",
1021
+ "pstree.remy": "^1.1.8",
1022
+ "semver": "^7.5.3",
1023
+ "simple-update-notifier": "^2.0.0",
1024
+ "supports-color": "^5.5.0",
1025
+ "touch": "^3.1.0",
1026
+ "undefsafe": "^2.0.5"
1027
+ },
1028
+ "bin": {
1029
+ "nodemon": "bin/nodemon.js"
1030
+ },
1031
+ "engines": {
1032
+ "node": ">=10"
1033
+ },
1034
+ "funding": {
1035
+ "type": "opencollective",
1036
+ "url": "https://opencollective.com/nodemon"
1037
+ }
1038
+ },
1039
+ "node_modules/normalize-path": {
1040
+ "version": "3.0.0",
1041
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1042
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1043
+ "dev": true,
1044
+ "license": "MIT",
1045
+ "engines": {
1046
+ "node": ">=0.10.0"
1047
+ }
1048
+ },
1049
+ "node_modules/object-inspect": {
1050
+ "version": "1.13.4",
1051
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
1052
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
1053
+ "license": "MIT",
1054
+ "engines": {
1055
+ "node": ">= 0.4"
1056
+ },
1057
+ "funding": {
1058
+ "url": "https://github.com/sponsors/ljharb"
1059
+ }
1060
+ },
1061
+ "node_modules/on-finished": {
1062
+ "version": "2.4.1",
1063
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1064
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1065
+ "license": "MIT",
1066
+ "dependencies": {
1067
+ "ee-first": "1.1.1"
1068
+ },
1069
+ "engines": {
1070
+ "node": ">= 0.8"
1071
+ }
1072
+ },
1073
+ "node_modules/once": {
1074
+ "version": "1.4.0",
1075
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1076
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1077
+ "license": "ISC",
1078
+ "dependencies": {
1079
+ "wrappy": "1"
1080
+ }
1081
+ },
1082
+ "node_modules/parseurl": {
1083
+ "version": "1.3.3",
1084
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1085
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1086
+ "license": "MIT",
1087
+ "engines": {
1088
+ "node": ">= 0.8"
1089
+ }
1090
+ },
1091
+ "node_modules/path-to-regexp": {
1092
+ "version": "8.3.0",
1093
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
1094
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
1095
+ "license": "MIT",
1096
+ "funding": {
1097
+ "type": "opencollective",
1098
+ "url": "https://opencollective.com/express"
1099
+ }
1100
+ },
1101
+ "node_modules/picomatch": {
1102
+ "version": "2.3.1",
1103
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1104
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1105
+ "dev": true,
1106
+ "license": "MIT",
1107
+ "engines": {
1108
+ "node": ">=8.6"
1109
+ },
1110
+ "funding": {
1111
+ "url": "https://github.com/sponsors/jonschlinkert"
1112
+ }
1113
+ },
1114
+ "node_modules/proxy-addr": {
1115
+ "version": "2.0.7",
1116
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1117
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1118
+ "license": "MIT",
1119
+ "dependencies": {
1120
+ "forwarded": "0.2.0",
1121
+ "ipaddr.js": "1.9.1"
1122
+ },
1123
+ "engines": {
1124
+ "node": ">= 0.10"
1125
+ }
1126
+ },
1127
+ "node_modules/pstree.remy": {
1128
+ "version": "1.1.8",
1129
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1130
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1131
+ "dev": true,
1132
+ "license": "MIT"
1133
+ },
1134
+ "node_modules/punycode": {
1135
+ "version": "2.3.1",
1136
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1137
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1138
+ "license": "MIT",
1139
+ "engines": {
1140
+ "node": ">=6"
1141
+ }
1142
+ },
1143
+ "node_modules/qs": {
1144
+ "version": "6.14.0",
1145
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
1146
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
1147
+ "license": "BSD-3-Clause",
1148
+ "dependencies": {
1149
+ "side-channel": "^1.1.0"
1150
+ },
1151
+ "engines": {
1152
+ "node": ">=0.6"
1153
+ },
1154
+ "funding": {
1155
+ "url": "https://github.com/sponsors/ljharb"
1156
+ }
1157
+ },
1158
+ "node_modules/range-parser": {
1159
+ "version": "1.2.1",
1160
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1161
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1162
+ "license": "MIT",
1163
+ "engines": {
1164
+ "node": ">= 0.6"
1165
+ }
1166
+ },
1167
+ "node_modules/raw-body": {
1168
+ "version": "3.0.1",
1169
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
1170
+ "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
1171
+ "license": "MIT",
1172
+ "dependencies": {
1173
+ "bytes": "3.1.2",
1174
+ "http-errors": "2.0.0",
1175
+ "iconv-lite": "0.7.0",
1176
+ "unpipe": "1.0.0"
1177
+ },
1178
+ "engines": {
1179
+ "node": ">= 0.10"
1180
+ }
1181
+ },
1182
+ "node_modules/raw-body/node_modules/iconv-lite": {
1183
+ "version": "0.7.0",
1184
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
1185
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
1186
+ "license": "MIT",
1187
+ "dependencies": {
1188
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
1189
+ },
1190
+ "engines": {
1191
+ "node": ">=0.10.0"
1192
+ },
1193
+ "funding": {
1194
+ "type": "opencollective",
1195
+ "url": "https://opencollective.com/express"
1196
+ }
1197
+ },
1198
+ "node_modules/readdirp": {
1199
+ "version": "3.6.0",
1200
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1201
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1202
+ "dev": true,
1203
+ "license": "MIT",
1204
+ "dependencies": {
1205
+ "picomatch": "^2.2.1"
1206
+ },
1207
+ "engines": {
1208
+ "node": ">=8.10.0"
1209
+ }
1210
+ },
1211
+ "node_modules/router": {
1212
+ "version": "2.2.0",
1213
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
1214
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
1215
+ "license": "MIT",
1216
+ "dependencies": {
1217
+ "debug": "^4.4.0",
1218
+ "depd": "^2.0.0",
1219
+ "is-promise": "^4.0.0",
1220
+ "parseurl": "^1.3.3",
1221
+ "path-to-regexp": "^8.0.0"
1222
+ },
1223
+ "engines": {
1224
+ "node": ">= 18"
1225
+ }
1226
+ },
1227
+ "node_modules/safe-buffer": {
1228
+ "version": "5.2.1",
1229
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1230
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1231
+ "funding": [
1232
+ {
1233
+ "type": "github",
1234
+ "url": "https://github.com/sponsors/feross"
1235
+ },
1236
+ {
1237
+ "type": "patreon",
1238
+ "url": "https://www.patreon.com/feross"
1239
+ },
1240
+ {
1241
+ "type": "consulting",
1242
+ "url": "https://feross.org/support"
1243
+ }
1244
+ ],
1245
+ "license": "MIT"
1246
+ },
1247
+ "node_modules/safer-buffer": {
1248
+ "version": "2.1.2",
1249
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1250
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1251
+ "license": "MIT"
1252
+ },
1253
+ "node_modules/semver": {
1254
+ "version": "7.7.3",
1255
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
1256
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
1257
+ "license": "ISC",
1258
+ "bin": {
1259
+ "semver": "bin/semver.js"
1260
+ },
1261
+ "engines": {
1262
+ "node": ">=10"
1263
+ }
1264
+ },
1265
+ "node_modules/send": {
1266
+ "version": "1.2.0",
1267
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
1268
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
1269
+ "license": "MIT",
1270
+ "dependencies": {
1271
+ "debug": "^4.3.5",
1272
+ "encodeurl": "^2.0.0",
1273
+ "escape-html": "^1.0.3",
1274
+ "etag": "^1.8.1",
1275
+ "fresh": "^2.0.0",
1276
+ "http-errors": "^2.0.0",
1277
+ "mime-types": "^3.0.1",
1278
+ "ms": "^2.1.3",
1279
+ "on-finished": "^2.4.1",
1280
+ "range-parser": "^1.2.1",
1281
+ "statuses": "^2.0.1"
1282
+ },
1283
+ "engines": {
1284
+ "node": ">= 18"
1285
+ }
1286
+ },
1287
+ "node_modules/serve-static": {
1288
+ "version": "2.2.0",
1289
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
1290
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
1291
+ "license": "MIT",
1292
+ "dependencies": {
1293
+ "encodeurl": "^2.0.0",
1294
+ "escape-html": "^1.0.3",
1295
+ "parseurl": "^1.3.3",
1296
+ "send": "^1.2.0"
1297
+ },
1298
+ "engines": {
1299
+ "node": ">= 18"
1300
+ }
1301
+ },
1302
+ "node_modules/setprototypeof": {
1303
+ "version": "1.2.0",
1304
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1305
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1306
+ "license": "ISC"
1307
+ },
1308
+ "node_modules/side-channel": {
1309
+ "version": "1.1.0",
1310
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1311
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1312
+ "license": "MIT",
1313
+ "dependencies": {
1314
+ "es-errors": "^1.3.0",
1315
+ "object-inspect": "^1.13.3",
1316
+ "side-channel-list": "^1.0.0",
1317
+ "side-channel-map": "^1.0.1",
1318
+ "side-channel-weakmap": "^1.0.2"
1319
+ },
1320
+ "engines": {
1321
+ "node": ">= 0.4"
1322
+ },
1323
+ "funding": {
1324
+ "url": "https://github.com/sponsors/ljharb"
1325
+ }
1326
+ },
1327
+ "node_modules/side-channel-list": {
1328
+ "version": "1.0.0",
1329
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1330
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1331
+ "license": "MIT",
1332
+ "dependencies": {
1333
+ "es-errors": "^1.3.0",
1334
+ "object-inspect": "^1.13.3"
1335
+ },
1336
+ "engines": {
1337
+ "node": ">= 0.4"
1338
+ },
1339
+ "funding": {
1340
+ "url": "https://github.com/sponsors/ljharb"
1341
+ }
1342
+ },
1343
+ "node_modules/side-channel-map": {
1344
+ "version": "1.0.1",
1345
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1346
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1347
+ "license": "MIT",
1348
+ "dependencies": {
1349
+ "call-bound": "^1.0.2",
1350
+ "es-errors": "^1.3.0",
1351
+ "get-intrinsic": "^1.2.5",
1352
+ "object-inspect": "^1.13.3"
1353
+ },
1354
+ "engines": {
1355
+ "node": ">= 0.4"
1356
+ },
1357
+ "funding": {
1358
+ "url": "https://github.com/sponsors/ljharb"
1359
+ }
1360
+ },
1361
+ "node_modules/side-channel-weakmap": {
1362
+ "version": "1.0.2",
1363
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1364
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1365
+ "license": "MIT",
1366
+ "dependencies": {
1367
+ "call-bound": "^1.0.2",
1368
+ "es-errors": "^1.3.0",
1369
+ "get-intrinsic": "^1.2.5",
1370
+ "object-inspect": "^1.13.3",
1371
+ "side-channel-map": "^1.0.1"
1372
+ },
1373
+ "engines": {
1374
+ "node": ">= 0.4"
1375
+ },
1376
+ "funding": {
1377
+ "url": "https://github.com/sponsors/ljharb"
1378
+ }
1379
+ },
1380
+ "node_modules/sift": {
1381
+ "version": "17.1.3",
1382
+ "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
1383
+ "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
1384
+ "license": "MIT"
1385
+ },
1386
+ "node_modules/simple-update-notifier": {
1387
+ "version": "2.0.0",
1388
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1389
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1390
+ "dev": true,
1391
+ "license": "MIT",
1392
+ "dependencies": {
1393
+ "semver": "^7.5.3"
1394
+ },
1395
+ "engines": {
1396
+ "node": ">=10"
1397
+ }
1398
+ },
1399
+ "node_modules/sparse-bitfield": {
1400
+ "version": "3.0.3",
1401
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1402
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1403
+ "license": "MIT",
1404
+ "dependencies": {
1405
+ "memory-pager": "^1.0.2"
1406
+ }
1407
+ },
1408
+ "node_modules/statuses": {
1409
+ "version": "2.0.2",
1410
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1411
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1412
+ "license": "MIT",
1413
+ "engines": {
1414
+ "node": ">= 0.8"
1415
+ }
1416
+ },
1417
+ "node_modules/supports-color": {
1418
+ "version": "5.5.0",
1419
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1420
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1421
+ "dev": true,
1422
+ "license": "MIT",
1423
+ "dependencies": {
1424
+ "has-flag": "^3.0.0"
1425
+ },
1426
+ "engines": {
1427
+ "node": ">=4"
1428
+ }
1429
+ },
1430
+ "node_modules/to-regex-range": {
1431
+ "version": "5.0.1",
1432
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1433
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1434
+ "dev": true,
1435
+ "license": "MIT",
1436
+ "dependencies": {
1437
+ "is-number": "^7.0.0"
1438
+ },
1439
+ "engines": {
1440
+ "node": ">=8.0"
1441
+ }
1442
+ },
1443
+ "node_modules/toidentifier": {
1444
+ "version": "1.0.1",
1445
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1446
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1447
+ "license": "MIT",
1448
+ "engines": {
1449
+ "node": ">=0.6"
1450
+ }
1451
+ },
1452
+ "node_modules/touch": {
1453
+ "version": "3.1.1",
1454
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
1455
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
1456
+ "dev": true,
1457
+ "license": "ISC",
1458
+ "bin": {
1459
+ "nodetouch": "bin/nodetouch.js"
1460
+ }
1461
+ },
1462
+ "node_modules/tr46": {
1463
+ "version": "5.1.1",
1464
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
1465
+ "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
1466
+ "license": "MIT",
1467
+ "dependencies": {
1468
+ "punycode": "^2.3.1"
1469
+ },
1470
+ "engines": {
1471
+ "node": ">=18"
1472
+ }
1473
+ },
1474
+ "node_modules/type-is": {
1475
+ "version": "2.0.1",
1476
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1477
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1478
+ "license": "MIT",
1479
+ "dependencies": {
1480
+ "content-type": "^1.0.5",
1481
+ "media-typer": "^1.1.0",
1482
+ "mime-types": "^3.0.0"
1483
+ },
1484
+ "engines": {
1485
+ "node": ">= 0.6"
1486
+ }
1487
+ },
1488
+ "node_modules/undefsafe": {
1489
+ "version": "2.0.5",
1490
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1491
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1492
+ "dev": true,
1493
+ "license": "MIT"
1494
+ },
1495
+ "node_modules/unpipe": {
1496
+ "version": "1.0.0",
1497
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1498
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1499
+ "license": "MIT",
1500
+ "engines": {
1501
+ "node": ">= 0.8"
1502
+ }
1503
+ },
1504
+ "node_modules/vary": {
1505
+ "version": "1.1.2",
1506
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1507
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1508
+ "license": "MIT",
1509
+ "engines": {
1510
+ "node": ">= 0.8"
1511
+ }
1512
+ },
1513
+ "node_modules/webidl-conversions": {
1514
+ "version": "7.0.0",
1515
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1516
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1517
+ "license": "BSD-2-Clause",
1518
+ "engines": {
1519
+ "node": ">=12"
1520
+ }
1521
+ },
1522
+ "node_modules/whatwg-url": {
1523
+ "version": "14.2.0",
1524
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
1525
+ "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
1526
+ "license": "MIT",
1527
+ "dependencies": {
1528
+ "tr46": "^5.1.0",
1529
+ "webidl-conversions": "^7.0.0"
1530
+ },
1531
+ "engines": {
1532
+ "node": ">=18"
1533
+ }
1534
+ },
1535
+ "node_modules/wrappy": {
1536
+ "version": "1.0.2",
1537
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1538
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1539
+ "license": "ISC"
1540
+ }
1541
+ }
1542
+ }
package.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "type": "module",
3
+ "name": "backend",
4
+ "version": "1.0.0",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "start": "node server.js",
9
+ "dev": "nodemon server.js"
10
+ },
11
+ "keywords": [],
12
+ "author": "",
13
+ "license": "ISC",
14
+ "description": "",
15
+ "dependencies": {
16
+ "bcryptjs": "^3.0.2",
17
+ "dotenv": "^17.2.3",
18
+ "express": "^5.1.0",
19
+ "jsonwebtoken": "^9.0.2",
20
+ "mongoose": "^8.19.1",
21
+ "node-cron": "^4.2.1",
22
+ "nodemailer": "^7.0.9"
23
+ },
24
+ "devDependencies": {
25
+ "nodemon": "^3.1.10"
26
+ }
27
+ }
routes/productRoutes.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from "express";
2
+ import {
3
+ createProduct,
4
+ getProducts,
5
+ getProductById,
6
+ updateProduct,
7
+ deleteProduct,
8
+ } from "../controllers/productController.js";
9
+
10
+ import { protect } from "../middleware/authMiddleware.js";
11
+
12
+ const router = express.Router();
13
+
14
+ router.route("/").post(protect, createProduct).get(protect, getProducts);
15
+
16
+ router
17
+ .route("/:id")
18
+ .get(protect, getProductById)
19
+ .put(protect, updateProduct)
20
+ .delete(protect, deleteProduct);
21
+
22
+ export default router;
routes/userRoutes.js ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import express from "express";
2
+ import { registerUser, loginUser } from "../controllers/userController.js";
3
+
4
+ const router = express.Router();
5
+
6
+ router.post("/", registerUser);
7
+ router.post("/login", loginUser);
8
+
9
+ export default router;
server.js ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import express from "express";
2
+ import dotenv from "dotenv";
3
+ import cron from "node-cron"; // 1. Import cron
4
+ import nodemailer from "nodemailer"; // 2. Import nodemailer
5
+ import connectDB from "./config/db.js";
6
+ import productRoutes from "./routes/productRoutes.js";
7
+ import userRoutes from "./routes/userRoutes.js";
8
+ import Product from "./models/productModel.js"; // 3. Import Product Model
9
+
10
+ dotenv.config();
11
+
12
+ connectDB();
13
+
14
+ const app = express();
15
+
16
+ // CORS middleware for production
17
+ app.use((req, res, next) => {
18
+ res.header('Access-Control-Allow-Origin', '*');
19
+ res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
20
+ res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
21
+
22
+ if (req.method === 'OPTIONS') {
23
+ res.sendStatus(200);
24
+ } else {
25
+ next();
26
+ }
27
+ });
28
+
29
+ // 1. Middleware to accept JSON data
30
+ app.use(express.json());
31
+
32
+ app.get("/", (req, res) => {
33
+ res.send("API is running...");
34
+ });
35
+
36
+ // 2. USE THE ROUTES
37
+ app.use("/api/products", productRoutes);
38
+ app.use("/api/users", userRoutes);
39
+
40
+ // 3. Add the Cron Job for Low Stock Alerts '*/10 * * * * *'(10 sec) / "* * * * *"(1 min)
41
+ cron.schedule("*/10 * * * * *", async () => {
42
+ console.log("Running cron job: Checking for low-stock products...");
43
+ try {
44
+ const lowStockProducts = await Product.find({
45
+ $expr: { $lte: ["$quantity", "$lowStockThreshold"] },
46
+ });
47
+
48
+ if (lowStockProducts.length > 0) {
49
+ const transporter = nodemailer.createTransport({
50
+ service: "gmail",
51
+ auth: {
52
+ user: process.env.EMAIL_USER,
53
+ pass: process.env.EMAIL_PASS,
54
+ },
55
+ });
56
+
57
+ const productList = lowStockProducts
58
+ .map(
59
+ (p) =>
60
+ `<li>${p.name} (SKU: ${p.sku}) - Quantity: ${p.quantity}, Threshold: ${p.lowStockThreshold}</li>`
61
+ )
62
+ .join("");
63
+
64
+ const mailOptions = {
65
+ from: process.env.EMAIL_USER,
66
+ to: process.env.EMAIL_TO,
67
+ subject: "🔴 Low Stock Alert!",
68
+ html: `
69
+ <h3>The following products are running low on stock:</h3>
70
+ <ul>
71
+ ${productList}
72
+ </ul>
73
+ <p>Please restock them soon.</p>
74
+ `,
75
+ };
76
+
77
+ transporter.sendMail(mailOptions, (error, info) => {
78
+ if (error) {
79
+ console.error("Error sending email:", error);
80
+ } else {
81
+ console.log("Low stock alert email sent:", info.response);
82
+ }
83
+ });
84
+ } else {
85
+ console.log("No low-stock products found.");
86
+ }
87
+ } catch (error) {
88
+ console.error("Error in cron job:", error);
89
+ }
90
+ });
91
+
92
+ const PORT = process.env.PORT || 5000;
93
+
94
+ app.listen(
95
+ PORT,
96
+ console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`)
97
+ );