├── .gitignore ├── example.env ├── index.js ├── package-lock.json ├── package.json └── src ├── api └── v1 │ ├── authentication │ ├── controllers │ │ ├── createAuthCookie.js │ │ ├── index.js │ │ └── logout.js │ └── index.js │ └── services │ ├── controllers │ └── findAll.js │ └── index.js ├── app.js ├── config └── defaults.js ├── db ├── connectDB.js └── index.js ├── index.js ├── lib ├── authentication │ └── createToken.js └── services │ └── findAllServices.js ├── middlewares ├── index.js └── verifyToken.js ├── models ├── Service.js ├── User.js └── index.js ├── routes ├── index.js └── v1 │ ├── authentication │ └── index.js │ └── services │ └── index.js └── utils ├── globalErrorHandler.js └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | # DATABASE 2 | # replace with your own URI 3 | DATABASE_LOCAL=mongodb+srv://:@cluster0.jys8h.mongodb.net/?retryWrites=true&w=majority 4 | 5 | DATABASE_PROD=mongodb://:@cluster0.jsdnfkg 6 | 7 | DB_NAME="test-db" 8 | 9 | # CREDENTIALS 10 | # replace with your own credentials 11 | 12 | DATABASE_LOCAL_PASSWORD= u2DqlpJ1 13 | 14 | DATABASE_LOCAL_USERNAME= demoName 15 | 16 | # ENVIRONMENT 17 | 18 | NODE_ENV=development 19 | 20 | 21 | # CLIENT SIDE URL [replace with your own urls] 22 | 23 | CLIENT=https://testSite.com 24 | LOCAL_CLIENT=http://localhost:5173 25 | 26 | 27 | # token secret for jwt authentication 28 | 29 | ACCESS_TOKEN_SECRET= randomTestTokentext -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const cors = require('cors'); 3 | const jwt = require('jsonwebtoken'); 4 | const cookieParser = require('cookie-parser'); 5 | const { MongoClient, ServerApiVersion, ObjectId } = require('mongodb'); 6 | require('dotenv').config() 7 | const app = express(); 8 | const port = process.env.PORT || 5000; 9 | 10 | // middleware 11 | app.use(cors({ 12 | origin: [ 13 | 'http://localhost:5173', 14 | // 'https://cars-doctor-6c129.web.app', 15 | // 'https://cars-doctor-6c129.firebaseapp.com' 16 | ], 17 | credentials: true 18 | })); 19 | app.use(express.json()); 20 | app.use(cookieParser()); 21 | 22 | 23 | console.log(process.env.DB_PASS) 24 | 25 | const uri = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.swu9d.mongodb.net/?retryWrites=true&w=majority`; 26 | 27 | // Create a MongoClient with a MongoClientOptions object to set the Stable API version 28 | const client = new MongoClient(uri, { 29 | serverApi: { 30 | version: ServerApiVersion.v1, 31 | strict: true, 32 | deprecationErrors: true, 33 | } 34 | }); 35 | 36 | // middlewares 37 | const logger = (req, res, next) => { 38 | console.log('log: info', req.method, req.url); 39 | next(); 40 | } 41 | 42 | const verifyToken = (req, res, next) => { 43 | const token = req?.cookies?.token; 44 | // console.log('token in the middleware', token); 45 | // no token available 46 | if (!token) { 47 | return res.status(401).send({ message: 'unauthorized access' }) 48 | } 49 | jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => { 50 | if (err) { 51 | return res.status(401).send({ message: 'unauthorized access' }) 52 | } 53 | req.user = decoded; 54 | next(); 55 | }) 56 | } 57 | 58 | async function run() { 59 | try { 60 | // Connect the client to the server (optional starting in v4.7) 61 | await client.connect(); 62 | 63 | const serviceCollection = client.db('carDoctor').collection('services'); 64 | const bookingCollection = client.db('carDoctor').collection('bookings'); 65 | 66 | // auth related api 67 | app.post('/jwt', logger, async (req, res) => { 68 | const user = req.body; 69 | console.log('user for token', user); 70 | const token = jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); 71 | 72 | res.cookie('token', token, { 73 | httpOnly: true, 74 | secure: true, 75 | sameSite: 'none' 76 | }) 77 | .send({ success: true }); 78 | }) 79 | 80 | app.post('/logout', async (req, res) => { 81 | const user = req.body; 82 | console.log('logging out', user); 83 | res.clearCookie('token', { maxAge: 0 }).send({ success: true }) 84 | }) 85 | 86 | // services related api 87 | app.get('/services', async (req, res) => { 88 | const filter = req.query; 89 | console.log(filter); 90 | const query = { 91 | // price: { $lt: 150, $gt: 50 } 92 | // db.InspirationalWomen.find({first_name: { $regex: /Harriet/i} }) 93 | title: {$regex: filter.search, $options: 'i'} 94 | }; 95 | 96 | const options = { 97 | sort: { 98 | price: filter.sort === 'asc' ? 1 : -1 99 | } 100 | }; 101 | 102 | const cursor = serviceCollection.find(query, options); 103 | const result = await cursor.toArray(); 104 | res.send(result); 105 | }) 106 | 107 | app.get('/services/:id', async (req, res) => { 108 | const id = req.params.id; 109 | const query = { _id: new ObjectId(id) } 110 | 111 | const options = { 112 | // Include only the `title` and `imdb` fields in the returned document 113 | projection: { title: 1, price: 1, service_id: 1, img: 1 }, 114 | }; 115 | 116 | const result = await serviceCollection.findOne(query, options); 117 | res.send(result); 118 | }) 119 | 120 | 121 | // bookings 122 | app.get('/bookings', logger, verifyToken, async (req, res) => { 123 | console.log(req.query.email); 124 | console.log('token owner info', req.user) 125 | if (req.user.email !== req.query.email) { 126 | return res.status(403).send({ message: 'forbidden access' }) 127 | } 128 | let query = {}; 129 | if (req.query?.email) { 130 | query = { email: req.query.email } 131 | } 132 | const result = await bookingCollection.find(query).toArray(); 133 | res.send(result); 134 | }) 135 | 136 | app.post('/bookings', async (req, res) => { 137 | const booking = req.body; 138 | console.log(booking); 139 | const result = await bookingCollection.insertOne(booking); 140 | res.send(result); 141 | }); 142 | 143 | app.patch('/bookings/:id', async (req, res) => { 144 | const id = req.params.id; 145 | const filter = { _id: new ObjectId(id) }; 146 | const updatedBooking = req.body; 147 | console.log(updatedBooking); 148 | const updateDoc = { 149 | $set: { 150 | status: updatedBooking.status 151 | }, 152 | }; 153 | const result = await bookingCollection.updateOne(filter, updateDoc); 154 | res.send(result); 155 | }) 156 | 157 | app.delete('/bookings/:id', async (req, res) => { 158 | const id = req.params.id; 159 | const query = { _id: new ObjectId(id) } 160 | const result = await bookingCollection.deleteOne(query); 161 | res.send(result); 162 | }) 163 | 164 | 165 | // Send a ping to confirm a successful connection 166 | await client.db("admin").command({ ping: 1 }); 167 | console.log("Pinged your deployment. You successfully connected to MongoDB!"); 168 | } finally { 169 | // Ensures that the client will close when you finish/error 170 | // await client.close(); 171 | } 172 | } 173 | run().catch(console.dir); 174 | 175 | 176 | 177 | app.get('/', (req, res) => { 178 | res.send('doctor is running') 179 | }) 180 | 181 | app.listen(port, () => { 182 | console.log(`Car Doctor Server is running on port ${port}`) 183 | }) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "refactored-code", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "refactored-code", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cookie-parser": "^1.4.6", 13 | "cors": "^2.8.5", 14 | "dotenv": "^16.3.1", 15 | "express": "^4.18.2", 16 | "jsonwebtoken": "^9.0.2", 17 | "mongoose": "^8.0.1" 18 | } 19 | }, 20 | "node_modules/@mongodb-js/saslprep": { 21 | "version": "1.1.1", 22 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", 23 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", 24 | "dependencies": { 25 | "sparse-bitfield": "^3.0.3" 26 | } 27 | }, 28 | "node_modules/@types/node": { 29 | "version": "20.9.2", 30 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", 31 | "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", 32 | "dependencies": { 33 | "undici-types": "~5.26.4" 34 | } 35 | }, 36 | "node_modules/@types/webidl-conversions": { 37 | "version": "7.0.3", 38 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 39 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 40 | }, 41 | "node_modules/@types/whatwg-url": { 42 | "version": "8.2.2", 43 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", 44 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", 45 | "dependencies": { 46 | "@types/node": "*", 47 | "@types/webidl-conversions": "*" 48 | } 49 | }, 50 | "node_modules/accepts": { 51 | "version": "1.3.8", 52 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 53 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 54 | "dependencies": { 55 | "mime-types": "~2.1.34", 56 | "negotiator": "0.6.3" 57 | }, 58 | "engines": { 59 | "node": ">= 0.6" 60 | } 61 | }, 62 | "node_modules/array-flatten": { 63 | "version": "1.1.1", 64 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 65 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 66 | }, 67 | "node_modules/body-parser": { 68 | "version": "1.20.1", 69 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 70 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 71 | "dependencies": { 72 | "bytes": "3.1.2", 73 | "content-type": "~1.0.4", 74 | "debug": "2.6.9", 75 | "depd": "2.0.0", 76 | "destroy": "1.2.0", 77 | "http-errors": "2.0.0", 78 | "iconv-lite": "0.4.24", 79 | "on-finished": "2.4.1", 80 | "qs": "6.11.0", 81 | "raw-body": "2.5.1", 82 | "type-is": "~1.6.18", 83 | "unpipe": "1.0.0" 84 | }, 85 | "engines": { 86 | "node": ">= 0.8", 87 | "npm": "1.2.8000 || >= 1.4.16" 88 | } 89 | }, 90 | "node_modules/bson": { 91 | "version": "6.2.0", 92 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", 93 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", 94 | "engines": { 95 | "node": ">=16.20.1" 96 | } 97 | }, 98 | "node_modules/buffer-equal-constant-time": { 99 | "version": "1.0.1", 100 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 101 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 102 | }, 103 | "node_modules/bytes": { 104 | "version": "3.1.2", 105 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 106 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 107 | "engines": { 108 | "node": ">= 0.8" 109 | } 110 | }, 111 | "node_modules/call-bind": { 112 | "version": "1.0.5", 113 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 114 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 115 | "dependencies": { 116 | "function-bind": "^1.1.2", 117 | "get-intrinsic": "^1.2.1", 118 | "set-function-length": "^1.1.1" 119 | }, 120 | "funding": { 121 | "url": "https://github.com/sponsors/ljharb" 122 | } 123 | }, 124 | "node_modules/content-disposition": { 125 | "version": "0.5.4", 126 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 127 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 128 | "dependencies": { 129 | "safe-buffer": "5.2.1" 130 | }, 131 | "engines": { 132 | "node": ">= 0.6" 133 | } 134 | }, 135 | "node_modules/content-type": { 136 | "version": "1.0.5", 137 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 138 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 139 | "engines": { 140 | "node": ">= 0.6" 141 | } 142 | }, 143 | "node_modules/cookie": { 144 | "version": "0.5.0", 145 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 146 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 147 | "engines": { 148 | "node": ">= 0.6" 149 | } 150 | }, 151 | "node_modules/cookie-parser": { 152 | "version": "1.4.6", 153 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 154 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 155 | "dependencies": { 156 | "cookie": "0.4.1", 157 | "cookie-signature": "1.0.6" 158 | }, 159 | "engines": { 160 | "node": ">= 0.8.0" 161 | } 162 | }, 163 | "node_modules/cookie-parser/node_modules/cookie": { 164 | "version": "0.4.1", 165 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 166 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 167 | "engines": { 168 | "node": ">= 0.6" 169 | } 170 | }, 171 | "node_modules/cookie-signature": { 172 | "version": "1.0.6", 173 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 174 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 175 | }, 176 | "node_modules/cors": { 177 | "version": "2.8.5", 178 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 179 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 180 | "dependencies": { 181 | "object-assign": "^4", 182 | "vary": "^1" 183 | }, 184 | "engines": { 185 | "node": ">= 0.10" 186 | } 187 | }, 188 | "node_modules/debug": { 189 | "version": "2.6.9", 190 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 191 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 192 | "dependencies": { 193 | "ms": "2.0.0" 194 | } 195 | }, 196 | "node_modules/define-data-property": { 197 | "version": "1.1.1", 198 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 199 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 200 | "dependencies": { 201 | "get-intrinsic": "^1.2.1", 202 | "gopd": "^1.0.1", 203 | "has-property-descriptors": "^1.0.0" 204 | }, 205 | "engines": { 206 | "node": ">= 0.4" 207 | } 208 | }, 209 | "node_modules/depd": { 210 | "version": "2.0.0", 211 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 212 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 213 | "engines": { 214 | "node": ">= 0.8" 215 | } 216 | }, 217 | "node_modules/destroy": { 218 | "version": "1.2.0", 219 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 220 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 221 | "engines": { 222 | "node": ">= 0.8", 223 | "npm": "1.2.8000 || >= 1.4.16" 224 | } 225 | }, 226 | "node_modules/dotenv": { 227 | "version": "16.3.1", 228 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 229 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 230 | "engines": { 231 | "node": ">=12" 232 | }, 233 | "funding": { 234 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 235 | } 236 | }, 237 | "node_modules/ecdsa-sig-formatter": { 238 | "version": "1.0.11", 239 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 240 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 241 | "dependencies": { 242 | "safe-buffer": "^5.0.1" 243 | } 244 | }, 245 | "node_modules/ee-first": { 246 | "version": "1.1.1", 247 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 248 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 249 | }, 250 | "node_modules/encodeurl": { 251 | "version": "1.0.2", 252 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 253 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 254 | "engines": { 255 | "node": ">= 0.8" 256 | } 257 | }, 258 | "node_modules/escape-html": { 259 | "version": "1.0.3", 260 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 261 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 262 | }, 263 | "node_modules/etag": { 264 | "version": "1.8.1", 265 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 266 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 267 | "engines": { 268 | "node": ">= 0.6" 269 | } 270 | }, 271 | "node_modules/express": { 272 | "version": "4.18.2", 273 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 274 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 275 | "dependencies": { 276 | "accepts": "~1.3.8", 277 | "array-flatten": "1.1.1", 278 | "body-parser": "1.20.1", 279 | "content-disposition": "0.5.4", 280 | "content-type": "~1.0.4", 281 | "cookie": "0.5.0", 282 | "cookie-signature": "1.0.6", 283 | "debug": "2.6.9", 284 | "depd": "2.0.0", 285 | "encodeurl": "~1.0.2", 286 | "escape-html": "~1.0.3", 287 | "etag": "~1.8.1", 288 | "finalhandler": "1.2.0", 289 | "fresh": "0.5.2", 290 | "http-errors": "2.0.0", 291 | "merge-descriptors": "1.0.1", 292 | "methods": "~1.1.2", 293 | "on-finished": "2.4.1", 294 | "parseurl": "~1.3.3", 295 | "path-to-regexp": "0.1.7", 296 | "proxy-addr": "~2.0.7", 297 | "qs": "6.11.0", 298 | "range-parser": "~1.2.1", 299 | "safe-buffer": "5.2.1", 300 | "send": "0.18.0", 301 | "serve-static": "1.15.0", 302 | "setprototypeof": "1.2.0", 303 | "statuses": "2.0.1", 304 | "type-is": "~1.6.18", 305 | "utils-merge": "1.0.1", 306 | "vary": "~1.1.2" 307 | }, 308 | "engines": { 309 | "node": ">= 0.10.0" 310 | } 311 | }, 312 | "node_modules/finalhandler": { 313 | "version": "1.2.0", 314 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 315 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 316 | "dependencies": { 317 | "debug": "2.6.9", 318 | "encodeurl": "~1.0.2", 319 | "escape-html": "~1.0.3", 320 | "on-finished": "2.4.1", 321 | "parseurl": "~1.3.3", 322 | "statuses": "2.0.1", 323 | "unpipe": "~1.0.0" 324 | }, 325 | "engines": { 326 | "node": ">= 0.8" 327 | } 328 | }, 329 | "node_modules/forwarded": { 330 | "version": "0.2.0", 331 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 332 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 333 | "engines": { 334 | "node": ">= 0.6" 335 | } 336 | }, 337 | "node_modules/fresh": { 338 | "version": "0.5.2", 339 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 340 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 341 | "engines": { 342 | "node": ">= 0.6" 343 | } 344 | }, 345 | "node_modules/function-bind": { 346 | "version": "1.1.2", 347 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 348 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 349 | "funding": { 350 | "url": "https://github.com/sponsors/ljharb" 351 | } 352 | }, 353 | "node_modules/get-intrinsic": { 354 | "version": "1.2.2", 355 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 356 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 357 | "dependencies": { 358 | "function-bind": "^1.1.2", 359 | "has-proto": "^1.0.1", 360 | "has-symbols": "^1.0.3", 361 | "hasown": "^2.0.0" 362 | }, 363 | "funding": { 364 | "url": "https://github.com/sponsors/ljharb" 365 | } 366 | }, 367 | "node_modules/gopd": { 368 | "version": "1.0.1", 369 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 370 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 371 | "dependencies": { 372 | "get-intrinsic": "^1.1.3" 373 | }, 374 | "funding": { 375 | "url": "https://github.com/sponsors/ljharb" 376 | } 377 | }, 378 | "node_modules/has-property-descriptors": { 379 | "version": "1.0.1", 380 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 381 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 382 | "dependencies": { 383 | "get-intrinsic": "^1.2.2" 384 | }, 385 | "funding": { 386 | "url": "https://github.com/sponsors/ljharb" 387 | } 388 | }, 389 | "node_modules/has-proto": { 390 | "version": "1.0.1", 391 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 392 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 393 | "engines": { 394 | "node": ">= 0.4" 395 | }, 396 | "funding": { 397 | "url": "https://github.com/sponsors/ljharb" 398 | } 399 | }, 400 | "node_modules/has-symbols": { 401 | "version": "1.0.3", 402 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 403 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 404 | "engines": { 405 | "node": ">= 0.4" 406 | }, 407 | "funding": { 408 | "url": "https://github.com/sponsors/ljharb" 409 | } 410 | }, 411 | "node_modules/hasown": { 412 | "version": "2.0.0", 413 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 414 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 415 | "dependencies": { 416 | "function-bind": "^1.1.2" 417 | }, 418 | "engines": { 419 | "node": ">= 0.4" 420 | } 421 | }, 422 | "node_modules/http-errors": { 423 | "version": "2.0.0", 424 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 425 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 426 | "dependencies": { 427 | "depd": "2.0.0", 428 | "inherits": "2.0.4", 429 | "setprototypeof": "1.2.0", 430 | "statuses": "2.0.1", 431 | "toidentifier": "1.0.1" 432 | }, 433 | "engines": { 434 | "node": ">= 0.8" 435 | } 436 | }, 437 | "node_modules/iconv-lite": { 438 | "version": "0.4.24", 439 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 440 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 441 | "dependencies": { 442 | "safer-buffer": ">= 2.1.2 < 3" 443 | }, 444 | "engines": { 445 | "node": ">=0.10.0" 446 | } 447 | }, 448 | "node_modules/inherits": { 449 | "version": "2.0.4", 450 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 451 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 452 | }, 453 | "node_modules/ipaddr.js": { 454 | "version": "1.9.1", 455 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 456 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 457 | "engines": { 458 | "node": ">= 0.10" 459 | } 460 | }, 461 | "node_modules/jsonwebtoken": { 462 | "version": "9.0.2", 463 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 464 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 465 | "dependencies": { 466 | "jws": "^3.2.2", 467 | "lodash.includes": "^4.3.0", 468 | "lodash.isboolean": "^3.0.3", 469 | "lodash.isinteger": "^4.0.4", 470 | "lodash.isnumber": "^3.0.3", 471 | "lodash.isplainobject": "^4.0.6", 472 | "lodash.isstring": "^4.0.1", 473 | "lodash.once": "^4.0.0", 474 | "ms": "^2.1.1", 475 | "semver": "^7.5.4" 476 | }, 477 | "engines": { 478 | "node": ">=12", 479 | "npm": ">=6" 480 | } 481 | }, 482 | "node_modules/jsonwebtoken/node_modules/ms": { 483 | "version": "2.1.3", 484 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 485 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 486 | }, 487 | "node_modules/jwa": { 488 | "version": "1.4.1", 489 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 490 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 491 | "dependencies": { 492 | "buffer-equal-constant-time": "1.0.1", 493 | "ecdsa-sig-formatter": "1.0.11", 494 | "safe-buffer": "^5.0.1" 495 | } 496 | }, 497 | "node_modules/jws": { 498 | "version": "3.2.2", 499 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 500 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 501 | "dependencies": { 502 | "jwa": "^1.4.1", 503 | "safe-buffer": "^5.0.1" 504 | } 505 | }, 506 | "node_modules/kareem": { 507 | "version": "2.5.1", 508 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 509 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", 510 | "engines": { 511 | "node": ">=12.0.0" 512 | } 513 | }, 514 | "node_modules/lodash.includes": { 515 | "version": "4.3.0", 516 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 517 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 518 | }, 519 | "node_modules/lodash.isboolean": { 520 | "version": "3.0.3", 521 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 522 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 523 | }, 524 | "node_modules/lodash.isinteger": { 525 | "version": "4.0.4", 526 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 527 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 528 | }, 529 | "node_modules/lodash.isnumber": { 530 | "version": "3.0.3", 531 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 532 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 533 | }, 534 | "node_modules/lodash.isplainobject": { 535 | "version": "4.0.6", 536 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 537 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 538 | }, 539 | "node_modules/lodash.isstring": { 540 | "version": "4.0.1", 541 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 542 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 543 | }, 544 | "node_modules/lodash.once": { 545 | "version": "4.1.1", 546 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 547 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 548 | }, 549 | "node_modules/lru-cache": { 550 | "version": "6.0.0", 551 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 552 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 553 | "dependencies": { 554 | "yallist": "^4.0.0" 555 | }, 556 | "engines": { 557 | "node": ">=10" 558 | } 559 | }, 560 | "node_modules/media-typer": { 561 | "version": "0.3.0", 562 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 563 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 564 | "engines": { 565 | "node": ">= 0.6" 566 | } 567 | }, 568 | "node_modules/memory-pager": { 569 | "version": "1.5.0", 570 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 571 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 572 | }, 573 | "node_modules/merge-descriptors": { 574 | "version": "1.0.1", 575 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 576 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 577 | }, 578 | "node_modules/methods": { 579 | "version": "1.1.2", 580 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 581 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 582 | "engines": { 583 | "node": ">= 0.6" 584 | } 585 | }, 586 | "node_modules/mime": { 587 | "version": "1.6.0", 588 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 589 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 590 | "bin": { 591 | "mime": "cli.js" 592 | }, 593 | "engines": { 594 | "node": ">=4" 595 | } 596 | }, 597 | "node_modules/mime-db": { 598 | "version": "1.52.0", 599 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 600 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 601 | "engines": { 602 | "node": ">= 0.6" 603 | } 604 | }, 605 | "node_modules/mime-types": { 606 | "version": "2.1.35", 607 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 608 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 609 | "dependencies": { 610 | "mime-db": "1.52.0" 611 | }, 612 | "engines": { 613 | "node": ">= 0.6" 614 | } 615 | }, 616 | "node_modules/mongodb": { 617 | "version": "6.2.0", 618 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", 619 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", 620 | "dependencies": { 621 | "@mongodb-js/saslprep": "^1.1.0", 622 | "bson": "^6.2.0", 623 | "mongodb-connection-string-url": "^2.6.0" 624 | }, 625 | "engines": { 626 | "node": ">=16.20.1" 627 | }, 628 | "peerDependencies": { 629 | "@aws-sdk/credential-providers": "^3.188.0", 630 | "@mongodb-js/zstd": "^1.1.0", 631 | "gcp-metadata": "^5.2.0", 632 | "kerberos": "^2.0.1", 633 | "mongodb-client-encryption": ">=6.0.0 <7", 634 | "snappy": "^7.2.2", 635 | "socks": "^2.7.1" 636 | }, 637 | "peerDependenciesMeta": { 638 | "@aws-sdk/credential-providers": { 639 | "optional": true 640 | }, 641 | "@mongodb-js/zstd": { 642 | "optional": true 643 | }, 644 | "gcp-metadata": { 645 | "optional": true 646 | }, 647 | "kerberos": { 648 | "optional": true 649 | }, 650 | "mongodb-client-encryption": { 651 | "optional": true 652 | }, 653 | "snappy": { 654 | "optional": true 655 | }, 656 | "socks": { 657 | "optional": true 658 | } 659 | } 660 | }, 661 | "node_modules/mongodb-connection-string-url": { 662 | "version": "2.6.0", 663 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", 664 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", 665 | "dependencies": { 666 | "@types/whatwg-url": "^8.2.1", 667 | "whatwg-url": "^11.0.0" 668 | } 669 | }, 670 | "node_modules/mongoose": { 671 | "version": "8.0.1", 672 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.1.tgz", 673 | "integrity": "sha512-O3TJrtLCt4H1eGf2HoHGcnOcCTWloQkpmIP3hA9olybX3OX2KUjdIIq135HD5paGjZEDJYKn9fw4eH5N477zqQ==", 674 | "dependencies": { 675 | "bson": "^6.2.0", 676 | "kareem": "2.5.1", 677 | "mongodb": "6.2.0", 678 | "mpath": "0.9.0", 679 | "mquery": "5.0.0", 680 | "ms": "2.1.3", 681 | "sift": "16.0.1" 682 | }, 683 | "engines": { 684 | "node": ">=16.20.1" 685 | }, 686 | "funding": { 687 | "type": "opencollective", 688 | "url": "https://opencollective.com/mongoose" 689 | } 690 | }, 691 | "node_modules/mongoose/node_modules/ms": { 692 | "version": "2.1.3", 693 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 694 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 695 | }, 696 | "node_modules/mpath": { 697 | "version": "0.9.0", 698 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 699 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 700 | "engines": { 701 | "node": ">=4.0.0" 702 | } 703 | }, 704 | "node_modules/mquery": { 705 | "version": "5.0.0", 706 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 707 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 708 | "dependencies": { 709 | "debug": "4.x" 710 | }, 711 | "engines": { 712 | "node": ">=14.0.0" 713 | } 714 | }, 715 | "node_modules/mquery/node_modules/debug": { 716 | "version": "4.3.4", 717 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 718 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 719 | "dependencies": { 720 | "ms": "2.1.2" 721 | }, 722 | "engines": { 723 | "node": ">=6.0" 724 | }, 725 | "peerDependenciesMeta": { 726 | "supports-color": { 727 | "optional": true 728 | } 729 | } 730 | }, 731 | "node_modules/mquery/node_modules/ms": { 732 | "version": "2.1.2", 733 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 734 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 735 | }, 736 | "node_modules/ms": { 737 | "version": "2.0.0", 738 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 739 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 740 | }, 741 | "node_modules/negotiator": { 742 | "version": "0.6.3", 743 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 744 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 745 | "engines": { 746 | "node": ">= 0.6" 747 | } 748 | }, 749 | "node_modules/object-assign": { 750 | "version": "4.1.1", 751 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 752 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 753 | "engines": { 754 | "node": ">=0.10.0" 755 | } 756 | }, 757 | "node_modules/object-inspect": { 758 | "version": "1.13.1", 759 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 760 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 761 | "funding": { 762 | "url": "https://github.com/sponsors/ljharb" 763 | } 764 | }, 765 | "node_modules/on-finished": { 766 | "version": "2.4.1", 767 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 768 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 769 | "dependencies": { 770 | "ee-first": "1.1.1" 771 | }, 772 | "engines": { 773 | "node": ">= 0.8" 774 | } 775 | }, 776 | "node_modules/parseurl": { 777 | "version": "1.3.3", 778 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 779 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 780 | "engines": { 781 | "node": ">= 0.8" 782 | } 783 | }, 784 | "node_modules/path-to-regexp": { 785 | "version": "0.1.7", 786 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 787 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 788 | }, 789 | "node_modules/proxy-addr": { 790 | "version": "2.0.7", 791 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 792 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 793 | "dependencies": { 794 | "forwarded": "0.2.0", 795 | "ipaddr.js": "1.9.1" 796 | }, 797 | "engines": { 798 | "node": ">= 0.10" 799 | } 800 | }, 801 | "node_modules/punycode": { 802 | "version": "2.3.1", 803 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 804 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 805 | "engines": { 806 | "node": ">=6" 807 | } 808 | }, 809 | "node_modules/qs": { 810 | "version": "6.11.0", 811 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 812 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 813 | "dependencies": { 814 | "side-channel": "^1.0.4" 815 | }, 816 | "engines": { 817 | "node": ">=0.6" 818 | }, 819 | "funding": { 820 | "url": "https://github.com/sponsors/ljharb" 821 | } 822 | }, 823 | "node_modules/range-parser": { 824 | "version": "1.2.1", 825 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 826 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 827 | "engines": { 828 | "node": ">= 0.6" 829 | } 830 | }, 831 | "node_modules/raw-body": { 832 | "version": "2.5.1", 833 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 834 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 835 | "dependencies": { 836 | "bytes": "3.1.2", 837 | "http-errors": "2.0.0", 838 | "iconv-lite": "0.4.24", 839 | "unpipe": "1.0.0" 840 | }, 841 | "engines": { 842 | "node": ">= 0.8" 843 | } 844 | }, 845 | "node_modules/safe-buffer": { 846 | "version": "5.2.1", 847 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 848 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 849 | "funding": [ 850 | { 851 | "type": "github", 852 | "url": "https://github.com/sponsors/feross" 853 | }, 854 | { 855 | "type": "patreon", 856 | "url": "https://www.patreon.com/feross" 857 | }, 858 | { 859 | "type": "consulting", 860 | "url": "https://feross.org/support" 861 | } 862 | ] 863 | }, 864 | "node_modules/safer-buffer": { 865 | "version": "2.1.2", 866 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 867 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 868 | }, 869 | "node_modules/semver": { 870 | "version": "7.5.4", 871 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 872 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 873 | "dependencies": { 874 | "lru-cache": "^6.0.0" 875 | }, 876 | "bin": { 877 | "semver": "bin/semver.js" 878 | }, 879 | "engines": { 880 | "node": ">=10" 881 | } 882 | }, 883 | "node_modules/send": { 884 | "version": "0.18.0", 885 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 886 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 887 | "dependencies": { 888 | "debug": "2.6.9", 889 | "depd": "2.0.0", 890 | "destroy": "1.2.0", 891 | "encodeurl": "~1.0.2", 892 | "escape-html": "~1.0.3", 893 | "etag": "~1.8.1", 894 | "fresh": "0.5.2", 895 | "http-errors": "2.0.0", 896 | "mime": "1.6.0", 897 | "ms": "2.1.3", 898 | "on-finished": "2.4.1", 899 | "range-parser": "~1.2.1", 900 | "statuses": "2.0.1" 901 | }, 902 | "engines": { 903 | "node": ">= 0.8.0" 904 | } 905 | }, 906 | "node_modules/send/node_modules/ms": { 907 | "version": "2.1.3", 908 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 909 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 910 | }, 911 | "node_modules/serve-static": { 912 | "version": "1.15.0", 913 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 914 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 915 | "dependencies": { 916 | "encodeurl": "~1.0.2", 917 | "escape-html": "~1.0.3", 918 | "parseurl": "~1.3.3", 919 | "send": "0.18.0" 920 | }, 921 | "engines": { 922 | "node": ">= 0.8.0" 923 | } 924 | }, 925 | "node_modules/set-function-length": { 926 | "version": "1.1.1", 927 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 928 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 929 | "dependencies": { 930 | "define-data-property": "^1.1.1", 931 | "get-intrinsic": "^1.2.1", 932 | "gopd": "^1.0.1", 933 | "has-property-descriptors": "^1.0.0" 934 | }, 935 | "engines": { 936 | "node": ">= 0.4" 937 | } 938 | }, 939 | "node_modules/setprototypeof": { 940 | "version": "1.2.0", 941 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 942 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 943 | }, 944 | "node_modules/side-channel": { 945 | "version": "1.0.4", 946 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 947 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 948 | "dependencies": { 949 | "call-bind": "^1.0.0", 950 | "get-intrinsic": "^1.0.2", 951 | "object-inspect": "^1.9.0" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/sponsors/ljharb" 955 | } 956 | }, 957 | "node_modules/sift": { 958 | "version": "16.0.1", 959 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 960 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 961 | }, 962 | "node_modules/sparse-bitfield": { 963 | "version": "3.0.3", 964 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 965 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 966 | "dependencies": { 967 | "memory-pager": "^1.0.2" 968 | } 969 | }, 970 | "node_modules/statuses": { 971 | "version": "2.0.1", 972 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 973 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 974 | "engines": { 975 | "node": ">= 0.8" 976 | } 977 | }, 978 | "node_modules/toidentifier": { 979 | "version": "1.0.1", 980 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 981 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 982 | "engines": { 983 | "node": ">=0.6" 984 | } 985 | }, 986 | "node_modules/tr46": { 987 | "version": "3.0.0", 988 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 989 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 990 | "dependencies": { 991 | "punycode": "^2.1.1" 992 | }, 993 | "engines": { 994 | "node": ">=12" 995 | } 996 | }, 997 | "node_modules/type-is": { 998 | "version": "1.6.18", 999 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1000 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1001 | "dependencies": { 1002 | "media-typer": "0.3.0", 1003 | "mime-types": "~2.1.24" 1004 | }, 1005 | "engines": { 1006 | "node": ">= 0.6" 1007 | } 1008 | }, 1009 | "node_modules/undici-types": { 1010 | "version": "5.26.5", 1011 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1012 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 1013 | }, 1014 | "node_modules/unpipe": { 1015 | "version": "1.0.0", 1016 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1017 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1018 | "engines": { 1019 | "node": ">= 0.8" 1020 | } 1021 | }, 1022 | "node_modules/utils-merge": { 1023 | "version": "1.0.1", 1024 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1025 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1026 | "engines": { 1027 | "node": ">= 0.4.0" 1028 | } 1029 | }, 1030 | "node_modules/vary": { 1031 | "version": "1.1.2", 1032 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1033 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1034 | "engines": { 1035 | "node": ">= 0.8" 1036 | } 1037 | }, 1038 | "node_modules/webidl-conversions": { 1039 | "version": "7.0.0", 1040 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1041 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1042 | "engines": { 1043 | "node": ">=12" 1044 | } 1045 | }, 1046 | "node_modules/whatwg-url": { 1047 | "version": "11.0.0", 1048 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1049 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1050 | "dependencies": { 1051 | "tr46": "^3.0.0", 1052 | "webidl-conversions": "^7.0.0" 1053 | }, 1054 | "engines": { 1055 | "node": ">=12" 1056 | } 1057 | }, 1058 | "node_modules/yallist": { 1059 | "version": "4.0.0", 1060 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1061 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1062 | } 1063 | }, 1064 | "dependencies": { 1065 | "@mongodb-js/saslprep": { 1066 | "version": "1.1.1", 1067 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", 1068 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", 1069 | "requires": { 1070 | "sparse-bitfield": "^3.0.3" 1071 | } 1072 | }, 1073 | "@types/node": { 1074 | "version": "20.9.2", 1075 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", 1076 | "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", 1077 | "requires": { 1078 | "undici-types": "~5.26.4" 1079 | } 1080 | }, 1081 | "@types/webidl-conversions": { 1082 | "version": "7.0.3", 1083 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 1084 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 1085 | }, 1086 | "@types/whatwg-url": { 1087 | "version": "8.2.2", 1088 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", 1089 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", 1090 | "requires": { 1091 | "@types/node": "*", 1092 | "@types/webidl-conversions": "*" 1093 | } 1094 | }, 1095 | "accepts": { 1096 | "version": "1.3.8", 1097 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1098 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1099 | "requires": { 1100 | "mime-types": "~2.1.34", 1101 | "negotiator": "0.6.3" 1102 | } 1103 | }, 1104 | "array-flatten": { 1105 | "version": "1.1.1", 1106 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1107 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1108 | }, 1109 | "body-parser": { 1110 | "version": "1.20.1", 1111 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 1112 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 1113 | "requires": { 1114 | "bytes": "3.1.2", 1115 | "content-type": "~1.0.4", 1116 | "debug": "2.6.9", 1117 | "depd": "2.0.0", 1118 | "destroy": "1.2.0", 1119 | "http-errors": "2.0.0", 1120 | "iconv-lite": "0.4.24", 1121 | "on-finished": "2.4.1", 1122 | "qs": "6.11.0", 1123 | "raw-body": "2.5.1", 1124 | "type-is": "~1.6.18", 1125 | "unpipe": "1.0.0" 1126 | } 1127 | }, 1128 | "bson": { 1129 | "version": "6.2.0", 1130 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", 1131 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==" 1132 | }, 1133 | "buffer-equal-constant-time": { 1134 | "version": "1.0.1", 1135 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1136 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 1137 | }, 1138 | "bytes": { 1139 | "version": "3.1.2", 1140 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1141 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1142 | }, 1143 | "call-bind": { 1144 | "version": "1.0.5", 1145 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 1146 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 1147 | "requires": { 1148 | "function-bind": "^1.1.2", 1149 | "get-intrinsic": "^1.2.1", 1150 | "set-function-length": "^1.1.1" 1151 | } 1152 | }, 1153 | "content-disposition": { 1154 | "version": "0.5.4", 1155 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1156 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1157 | "requires": { 1158 | "safe-buffer": "5.2.1" 1159 | } 1160 | }, 1161 | "content-type": { 1162 | "version": "1.0.5", 1163 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1164 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 1165 | }, 1166 | "cookie": { 1167 | "version": "0.5.0", 1168 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1169 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1170 | }, 1171 | "cookie-parser": { 1172 | "version": "1.4.6", 1173 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 1174 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 1175 | "requires": { 1176 | "cookie": "0.4.1", 1177 | "cookie-signature": "1.0.6" 1178 | }, 1179 | "dependencies": { 1180 | "cookie": { 1181 | "version": "0.4.1", 1182 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 1183 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 1184 | } 1185 | } 1186 | }, 1187 | "cookie-signature": { 1188 | "version": "1.0.6", 1189 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1190 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1191 | }, 1192 | "cors": { 1193 | "version": "2.8.5", 1194 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1195 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1196 | "requires": { 1197 | "object-assign": "^4", 1198 | "vary": "^1" 1199 | } 1200 | }, 1201 | "debug": { 1202 | "version": "2.6.9", 1203 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1204 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1205 | "requires": { 1206 | "ms": "2.0.0" 1207 | } 1208 | }, 1209 | "define-data-property": { 1210 | "version": "1.1.1", 1211 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 1212 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 1213 | "requires": { 1214 | "get-intrinsic": "^1.2.1", 1215 | "gopd": "^1.0.1", 1216 | "has-property-descriptors": "^1.0.0" 1217 | } 1218 | }, 1219 | "depd": { 1220 | "version": "2.0.0", 1221 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1222 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1223 | }, 1224 | "destroy": { 1225 | "version": "1.2.0", 1226 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1227 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1228 | }, 1229 | "dotenv": { 1230 | "version": "16.3.1", 1231 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 1232 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" 1233 | }, 1234 | "ecdsa-sig-formatter": { 1235 | "version": "1.0.11", 1236 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1237 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1238 | "requires": { 1239 | "safe-buffer": "^5.0.1" 1240 | } 1241 | }, 1242 | "ee-first": { 1243 | "version": "1.1.1", 1244 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1245 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1246 | }, 1247 | "encodeurl": { 1248 | "version": "1.0.2", 1249 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1250 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1251 | }, 1252 | "escape-html": { 1253 | "version": "1.0.3", 1254 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1255 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1256 | }, 1257 | "etag": { 1258 | "version": "1.8.1", 1259 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1260 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1261 | }, 1262 | "express": { 1263 | "version": "4.18.2", 1264 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1265 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1266 | "requires": { 1267 | "accepts": "~1.3.8", 1268 | "array-flatten": "1.1.1", 1269 | "body-parser": "1.20.1", 1270 | "content-disposition": "0.5.4", 1271 | "content-type": "~1.0.4", 1272 | "cookie": "0.5.0", 1273 | "cookie-signature": "1.0.6", 1274 | "debug": "2.6.9", 1275 | "depd": "2.0.0", 1276 | "encodeurl": "~1.0.2", 1277 | "escape-html": "~1.0.3", 1278 | "etag": "~1.8.1", 1279 | "finalhandler": "1.2.0", 1280 | "fresh": "0.5.2", 1281 | "http-errors": "2.0.0", 1282 | "merge-descriptors": "1.0.1", 1283 | "methods": "~1.1.2", 1284 | "on-finished": "2.4.1", 1285 | "parseurl": "~1.3.3", 1286 | "path-to-regexp": "0.1.7", 1287 | "proxy-addr": "~2.0.7", 1288 | "qs": "6.11.0", 1289 | "range-parser": "~1.2.1", 1290 | "safe-buffer": "5.2.1", 1291 | "send": "0.18.0", 1292 | "serve-static": "1.15.0", 1293 | "setprototypeof": "1.2.0", 1294 | "statuses": "2.0.1", 1295 | "type-is": "~1.6.18", 1296 | "utils-merge": "1.0.1", 1297 | "vary": "~1.1.2" 1298 | } 1299 | }, 1300 | "finalhandler": { 1301 | "version": "1.2.0", 1302 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1303 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1304 | "requires": { 1305 | "debug": "2.6.9", 1306 | "encodeurl": "~1.0.2", 1307 | "escape-html": "~1.0.3", 1308 | "on-finished": "2.4.1", 1309 | "parseurl": "~1.3.3", 1310 | "statuses": "2.0.1", 1311 | "unpipe": "~1.0.0" 1312 | } 1313 | }, 1314 | "forwarded": { 1315 | "version": "0.2.0", 1316 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1317 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1318 | }, 1319 | "fresh": { 1320 | "version": "0.5.2", 1321 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1322 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1323 | }, 1324 | "function-bind": { 1325 | "version": "1.1.2", 1326 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1327 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 1328 | }, 1329 | "get-intrinsic": { 1330 | "version": "1.2.2", 1331 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 1332 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 1333 | "requires": { 1334 | "function-bind": "^1.1.2", 1335 | "has-proto": "^1.0.1", 1336 | "has-symbols": "^1.0.3", 1337 | "hasown": "^2.0.0" 1338 | } 1339 | }, 1340 | "gopd": { 1341 | "version": "1.0.1", 1342 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1343 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1344 | "requires": { 1345 | "get-intrinsic": "^1.1.3" 1346 | } 1347 | }, 1348 | "has-property-descriptors": { 1349 | "version": "1.0.1", 1350 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 1351 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 1352 | "requires": { 1353 | "get-intrinsic": "^1.2.2" 1354 | } 1355 | }, 1356 | "has-proto": { 1357 | "version": "1.0.1", 1358 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1359 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" 1360 | }, 1361 | "has-symbols": { 1362 | "version": "1.0.3", 1363 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1364 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1365 | }, 1366 | "hasown": { 1367 | "version": "2.0.0", 1368 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1369 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1370 | "requires": { 1371 | "function-bind": "^1.1.2" 1372 | } 1373 | }, 1374 | "http-errors": { 1375 | "version": "2.0.0", 1376 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1377 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1378 | "requires": { 1379 | "depd": "2.0.0", 1380 | "inherits": "2.0.4", 1381 | "setprototypeof": "1.2.0", 1382 | "statuses": "2.0.1", 1383 | "toidentifier": "1.0.1" 1384 | } 1385 | }, 1386 | "iconv-lite": { 1387 | "version": "0.4.24", 1388 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1389 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1390 | "requires": { 1391 | "safer-buffer": ">= 2.1.2 < 3" 1392 | } 1393 | }, 1394 | "inherits": { 1395 | "version": "2.0.4", 1396 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1397 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1398 | }, 1399 | "ipaddr.js": { 1400 | "version": "1.9.1", 1401 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1402 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1403 | }, 1404 | "jsonwebtoken": { 1405 | "version": "9.0.2", 1406 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 1407 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 1408 | "requires": { 1409 | "jws": "^3.2.2", 1410 | "lodash.includes": "^4.3.0", 1411 | "lodash.isboolean": "^3.0.3", 1412 | "lodash.isinteger": "^4.0.4", 1413 | "lodash.isnumber": "^3.0.3", 1414 | "lodash.isplainobject": "^4.0.6", 1415 | "lodash.isstring": "^4.0.1", 1416 | "lodash.once": "^4.0.0", 1417 | "ms": "^2.1.1", 1418 | "semver": "^7.5.4" 1419 | }, 1420 | "dependencies": { 1421 | "ms": { 1422 | "version": "2.1.3", 1423 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1424 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1425 | } 1426 | } 1427 | }, 1428 | "jwa": { 1429 | "version": "1.4.1", 1430 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1431 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1432 | "requires": { 1433 | "buffer-equal-constant-time": "1.0.1", 1434 | "ecdsa-sig-formatter": "1.0.11", 1435 | "safe-buffer": "^5.0.1" 1436 | } 1437 | }, 1438 | "jws": { 1439 | "version": "3.2.2", 1440 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1441 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1442 | "requires": { 1443 | "jwa": "^1.4.1", 1444 | "safe-buffer": "^5.0.1" 1445 | } 1446 | }, 1447 | "kareem": { 1448 | "version": "2.5.1", 1449 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 1450 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" 1451 | }, 1452 | "lodash.includes": { 1453 | "version": "4.3.0", 1454 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1455 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 1456 | }, 1457 | "lodash.isboolean": { 1458 | "version": "3.0.3", 1459 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1460 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 1461 | }, 1462 | "lodash.isinteger": { 1463 | "version": "4.0.4", 1464 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1465 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 1466 | }, 1467 | "lodash.isnumber": { 1468 | "version": "3.0.3", 1469 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1470 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 1471 | }, 1472 | "lodash.isplainobject": { 1473 | "version": "4.0.6", 1474 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1475 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 1476 | }, 1477 | "lodash.isstring": { 1478 | "version": "4.0.1", 1479 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1480 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 1481 | }, 1482 | "lodash.once": { 1483 | "version": "4.1.1", 1484 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1485 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 1486 | }, 1487 | "lru-cache": { 1488 | "version": "6.0.0", 1489 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1490 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1491 | "requires": { 1492 | "yallist": "^4.0.0" 1493 | } 1494 | }, 1495 | "media-typer": { 1496 | "version": "0.3.0", 1497 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1498 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1499 | }, 1500 | "memory-pager": { 1501 | "version": "1.5.0", 1502 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 1503 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 1504 | }, 1505 | "merge-descriptors": { 1506 | "version": "1.0.1", 1507 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1508 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1509 | }, 1510 | "methods": { 1511 | "version": "1.1.2", 1512 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1513 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1514 | }, 1515 | "mime": { 1516 | "version": "1.6.0", 1517 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1518 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1519 | }, 1520 | "mime-db": { 1521 | "version": "1.52.0", 1522 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1523 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1524 | }, 1525 | "mime-types": { 1526 | "version": "2.1.35", 1527 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1528 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1529 | "requires": { 1530 | "mime-db": "1.52.0" 1531 | } 1532 | }, 1533 | "mongodb": { 1534 | "version": "6.2.0", 1535 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", 1536 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", 1537 | "requires": { 1538 | "@mongodb-js/saslprep": "^1.1.0", 1539 | "bson": "^6.2.0", 1540 | "mongodb-connection-string-url": "^2.6.0" 1541 | } 1542 | }, 1543 | "mongodb-connection-string-url": { 1544 | "version": "2.6.0", 1545 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", 1546 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", 1547 | "requires": { 1548 | "@types/whatwg-url": "^8.2.1", 1549 | "whatwg-url": "^11.0.0" 1550 | } 1551 | }, 1552 | "mongoose": { 1553 | "version": "8.0.1", 1554 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.1.tgz", 1555 | "integrity": "sha512-O3TJrtLCt4H1eGf2HoHGcnOcCTWloQkpmIP3hA9olybX3OX2KUjdIIq135HD5paGjZEDJYKn9fw4eH5N477zqQ==", 1556 | "requires": { 1557 | "bson": "^6.2.0", 1558 | "kareem": "2.5.1", 1559 | "mongodb": "6.2.0", 1560 | "mpath": "0.9.0", 1561 | "mquery": "5.0.0", 1562 | "ms": "2.1.3", 1563 | "sift": "16.0.1" 1564 | }, 1565 | "dependencies": { 1566 | "ms": { 1567 | "version": "2.1.3", 1568 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1569 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1570 | } 1571 | } 1572 | }, 1573 | "mpath": { 1574 | "version": "0.9.0", 1575 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 1576 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" 1577 | }, 1578 | "mquery": { 1579 | "version": "5.0.0", 1580 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 1581 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 1582 | "requires": { 1583 | "debug": "4.x" 1584 | }, 1585 | "dependencies": { 1586 | "debug": { 1587 | "version": "4.3.4", 1588 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1589 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1590 | "requires": { 1591 | "ms": "2.1.2" 1592 | } 1593 | }, 1594 | "ms": { 1595 | "version": "2.1.2", 1596 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1597 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1598 | } 1599 | } 1600 | }, 1601 | "ms": { 1602 | "version": "2.0.0", 1603 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1604 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1605 | }, 1606 | "negotiator": { 1607 | "version": "0.6.3", 1608 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1609 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1610 | }, 1611 | "object-assign": { 1612 | "version": "4.1.1", 1613 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1614 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 1615 | }, 1616 | "object-inspect": { 1617 | "version": "1.13.1", 1618 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1619 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" 1620 | }, 1621 | "on-finished": { 1622 | "version": "2.4.1", 1623 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1624 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1625 | "requires": { 1626 | "ee-first": "1.1.1" 1627 | } 1628 | }, 1629 | "parseurl": { 1630 | "version": "1.3.3", 1631 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1632 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1633 | }, 1634 | "path-to-regexp": { 1635 | "version": "0.1.7", 1636 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1637 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1638 | }, 1639 | "proxy-addr": { 1640 | "version": "2.0.7", 1641 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1642 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1643 | "requires": { 1644 | "forwarded": "0.2.0", 1645 | "ipaddr.js": "1.9.1" 1646 | } 1647 | }, 1648 | "punycode": { 1649 | "version": "2.3.1", 1650 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1651 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 1652 | }, 1653 | "qs": { 1654 | "version": "6.11.0", 1655 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1656 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1657 | "requires": { 1658 | "side-channel": "^1.0.4" 1659 | } 1660 | }, 1661 | "range-parser": { 1662 | "version": "1.2.1", 1663 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1664 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1665 | }, 1666 | "raw-body": { 1667 | "version": "2.5.1", 1668 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1669 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1670 | "requires": { 1671 | "bytes": "3.1.2", 1672 | "http-errors": "2.0.0", 1673 | "iconv-lite": "0.4.24", 1674 | "unpipe": "1.0.0" 1675 | } 1676 | }, 1677 | "safe-buffer": { 1678 | "version": "5.2.1", 1679 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1680 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1681 | }, 1682 | "safer-buffer": { 1683 | "version": "2.1.2", 1684 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1685 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1686 | }, 1687 | "semver": { 1688 | "version": "7.5.4", 1689 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1690 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1691 | "requires": { 1692 | "lru-cache": "^6.0.0" 1693 | } 1694 | }, 1695 | "send": { 1696 | "version": "0.18.0", 1697 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1698 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1699 | "requires": { 1700 | "debug": "2.6.9", 1701 | "depd": "2.0.0", 1702 | "destroy": "1.2.0", 1703 | "encodeurl": "~1.0.2", 1704 | "escape-html": "~1.0.3", 1705 | "etag": "~1.8.1", 1706 | "fresh": "0.5.2", 1707 | "http-errors": "2.0.0", 1708 | "mime": "1.6.0", 1709 | "ms": "2.1.3", 1710 | "on-finished": "2.4.1", 1711 | "range-parser": "~1.2.1", 1712 | "statuses": "2.0.1" 1713 | }, 1714 | "dependencies": { 1715 | "ms": { 1716 | "version": "2.1.3", 1717 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1718 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1719 | } 1720 | } 1721 | }, 1722 | "serve-static": { 1723 | "version": "1.15.0", 1724 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1725 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1726 | "requires": { 1727 | "encodeurl": "~1.0.2", 1728 | "escape-html": "~1.0.3", 1729 | "parseurl": "~1.3.3", 1730 | "send": "0.18.0" 1731 | } 1732 | }, 1733 | "set-function-length": { 1734 | "version": "1.1.1", 1735 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 1736 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 1737 | "requires": { 1738 | "define-data-property": "^1.1.1", 1739 | "get-intrinsic": "^1.2.1", 1740 | "gopd": "^1.0.1", 1741 | "has-property-descriptors": "^1.0.0" 1742 | } 1743 | }, 1744 | "setprototypeof": { 1745 | "version": "1.2.0", 1746 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1747 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1748 | }, 1749 | "side-channel": { 1750 | "version": "1.0.4", 1751 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1752 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1753 | "requires": { 1754 | "call-bind": "^1.0.0", 1755 | "get-intrinsic": "^1.0.2", 1756 | "object-inspect": "^1.9.0" 1757 | } 1758 | }, 1759 | "sift": { 1760 | "version": "16.0.1", 1761 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 1762 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 1763 | }, 1764 | "sparse-bitfield": { 1765 | "version": "3.0.3", 1766 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1767 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1768 | "requires": { 1769 | "memory-pager": "^1.0.2" 1770 | } 1771 | }, 1772 | "statuses": { 1773 | "version": "2.0.1", 1774 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1775 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1776 | }, 1777 | "toidentifier": { 1778 | "version": "1.0.1", 1779 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1780 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1781 | }, 1782 | "tr46": { 1783 | "version": "3.0.0", 1784 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 1785 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 1786 | "requires": { 1787 | "punycode": "^2.1.1" 1788 | } 1789 | }, 1790 | "type-is": { 1791 | "version": "1.6.18", 1792 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1793 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1794 | "requires": { 1795 | "media-typer": "0.3.0", 1796 | "mime-types": "~2.1.24" 1797 | } 1798 | }, 1799 | "undici-types": { 1800 | "version": "5.26.5", 1801 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1802 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 1803 | }, 1804 | "unpipe": { 1805 | "version": "1.0.0", 1806 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1807 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1808 | }, 1809 | "utils-merge": { 1810 | "version": "1.0.1", 1811 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1812 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1813 | }, 1814 | "vary": { 1815 | "version": "1.1.2", 1816 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1817 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1818 | }, 1819 | "webidl-conversions": { 1820 | "version": "7.0.0", 1821 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1822 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" 1823 | }, 1824 | "whatwg-url": { 1825 | "version": "11.0.0", 1826 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1827 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1828 | "requires": { 1829 | "tr46": "^3.0.0", 1830 | "webidl-conversions": "^7.0.0" 1831 | } 1832 | }, 1833 | "yallist": { 1834 | "version": "4.0.0", 1835 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1836 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1837 | } 1838 | } 1839 | } 1840 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "refactored-code", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node src/app.js", 8 | "dev": "nodemon src/app.js", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "cookie-parser": "^1.4.6", 16 | "cors": "^2.8.5", 17 | "dotenv": "^16.3.1", 18 | "express": "^4.18.2", 19 | "jsonwebtoken": "^9.0.2", 20 | "mongoose": "^8.0.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/api/v1/authentication/controllers/createAuthCookie.js: -------------------------------------------------------------------------------- 1 | const createToken = require("../../../../lib/authentication/createToken"); 2 | 3 | const createAuthCookie=(req,res,next)=>{ 4 | try{ 5 | const user = req.body; 6 | const token = createToken(user) 7 | 8 | res.cookie('token', token, { 9 | httpOnly: true, 10 | secure: true, 11 | sameSite: 'none' 12 | }) 13 | .send({ success: true }); 14 | }catch(err) { 15 | next(err) 16 | } 17 | 18 | 19 | } 20 | 21 | module.exports = createAuthCookie -------------------------------------------------------------------------------- /src/api/v1/authentication/controllers/index.js: -------------------------------------------------------------------------------- 1 | const createAuthCookie = require('./createAuthCookie') 2 | const logout = require('./logout') 3 | module.exports ={ 4 | createAuthCookie, 5 | logout 6 | } -------------------------------------------------------------------------------- /src/api/v1/authentication/controllers/logout.js: -------------------------------------------------------------------------------- 1 | const logout= (req, res) => { 2 | const user = req.body; 3 | console.log('logging out', user); 4 | res.clearCookie('token', { maxAge: 0 }).send({ success: true }) 5 | } 6 | 7 | 8 | module.exports = logout -------------------------------------------------------------------------------- /src/api/v1/authentication/index.js: -------------------------------------------------------------------------------- 1 | const controllers = require('./controllers') 2 | 3 | module.exports = controllers -------------------------------------------------------------------------------- /src/api/v1/services/controllers/findAll.js: -------------------------------------------------------------------------------- 1 | const findAllServices = require("../../../../lib/services/findAllServices"); 2 | 3 | const findAll= async (req, res) => { 4 | const filter = req.query; 5 | 6 | const allServices= await findAllServices(filter) 7 | res.send(allServices); 8 | } 9 | 10 | 11 | module.exports = findAll 12 | -------------------------------------------------------------------------------- /src/api/v1/services/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/api/v1/services/index.js -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const applyMiddleware = require("./middlewares"); 3 | const globalErrorHandler = require("./utils/globalErrorHandler"); 4 | const connectDB = require("./db/connectDB"); 5 | 6 | require("dotenv").config(); 7 | const app = express(); 8 | const port = process.env.PORT || 5000; 9 | const authRoutes = require('./routes/v1/authentication'); 10 | const serviceRoutes = require('./routes/v1/services'); 11 | 12 | applyMiddleware(app); 13 | 14 | app.use(authRoutes) 15 | app.use(serviceRoutes) 16 | app.get("/health", (req, res) => { 17 | res.send("doctor is running...."); 18 | }); 19 | 20 | // handling all (get,post,update,delete.....) unhandled routes 21 | app.all("*", (req, res, next) => { 22 | const error = new Error(`Can't find ${req.originalUrl} on the server`); 23 | error.status = 404; 24 | next(error); 25 | }); 26 | 27 | // error handling middleware 28 | app.use(globalErrorHandler); 29 | 30 | 31 | const main=async ()=>{ 32 | await connectDB() 33 | app.listen(port, () => { 34 | console.log(`Car Doctor Server is running on port ${port}`); 35 | }); 36 | 37 | } 38 | 39 | 40 | main() -------------------------------------------------------------------------------- /src/config/defaults.js: -------------------------------------------------------------------------------- 1 | 2 | require("dotenv").config(); 3 | 4 | const config = { 5 | LOCAL_CLIENT: process.env.LOCAL_CLIENT, 6 | CLIENT: process.env.CLIENT, 7 | }; 8 | 9 | module.exports = Object.freeze(config); 10 | -------------------------------------------------------------------------------- /src/db/connectDB.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | require("dotenv").config(); 3 | 4 | const getConnectionString = () => { 5 | let connectionUrl; 6 | 7 | if (process.env.NODE_ENV === "development") { 8 | connectionUrl = process.env.DATABASE_LOCAL; 9 | connectionUrl = connectionUrl.replace( 10 | "", 11 | process.env.DATABASE_LOCAL_USERNAME 12 | ); 13 | connectionUrl = connectionUrl.replace( 14 | "", 15 | process.env.DATABASE_LOCAL_PASSWORD 16 | ); 17 | } else { 18 | connectionUrl = process.env.DATABASE_PROD; 19 | } 20 | 21 | return connectionUrl; 22 | }; 23 | 24 | const connectDB = async () => { 25 | console.log("connectting to database"); 26 | const mongoURI = getConnectionString(); 27 | 28 | await mongoose.connect(mongoURI, { dbName: process.env.DB_NAME }); 29 | console.log("connected to database"); 30 | }; 31 | 32 | 33 | module.exports= connectDB -------------------------------------------------------------------------------- /src/db/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/db/index.js -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/index.js -------------------------------------------------------------------------------- /src/lib/authentication/createToken.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | require('dotenv').config() 3 | const createToken =(user)=>{ 4 | const token = jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, { expiresIn: '1h' }); 5 | return token; 6 | } 7 | 8 | module.exports = createToken -------------------------------------------------------------------------------- /src/lib/services/findAllServices.js: -------------------------------------------------------------------------------- 1 | const Service = require("../../models/Service"); 2 | 3 | const findAllServices = async (filter) => { 4 | const query = { 5 | title: {$regex: filter.search, $options: 'i'} 6 | }; 7 | 8 | const options = { 9 | sort: { 10 | price: filter.sort === 'asc' ? 1 : -1 11 | } 12 | }; 13 | 14 | const cursor =await Service.find(query,'_id title price img').sort(options.sort); 15 | 16 | return cursor 17 | } 18 | 19 | module.exports =findAllServices -------------------------------------------------------------------------------- /src/middlewares/index.js: -------------------------------------------------------------------------------- 1 | const cookieParser = require("cookie-parser"); 2 | const cors = require('cors'); 3 | const express = require("express"); 4 | const { LOCAL_CLIENT,CLIENT } = require("../config/defaults"); 5 | 6 | const applyMiddleware = (app)=>{ 7 | 8 | // middleware 9 | app.use(cors({ 10 | origin: [ 11 | LOCAL_CLIENT, 12 | CLIENT 13 | ], 14 | credentials: true 15 | })); 16 | app.use(express.json()); 17 | app.use(cookieParser()); 18 | } 19 | 20 | module.exports = applyMiddleware -------------------------------------------------------------------------------- /src/middlewares/verifyToken.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | 3 | const jwt = require("jsonwebtoken"); 4 | 5 | const verifyToken = (req, res, next) => { 6 | const token = req?.cookies?.token; 7 | // console.log('token in the middleware', token); 8 | // no token available 9 | if (!token) { 10 | return res.status(401).send({ message: "unauthorized access" }); 11 | } 12 | jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => { 13 | if (err) { 14 | return res.status(401).send({ message: "unauthorized access" }); 15 | } 16 | req.user = decoded; 17 | next(); 18 | }); 19 | }; 20 | 21 | module.exports = verifyToken; 22 | -------------------------------------------------------------------------------- /src/models/Service.js: -------------------------------------------------------------------------------- 1 | const { model, Schema } = require("mongoose"); 2 | 3 | const ServiceSchema = new Schema({ 4 | "service_id":{ 5 | type:Number , 6 | required: true 7 | }, 8 | "author":{ 9 | type: ObjectId, 10 | ref:"User" 11 | 12 | }, 13 | "title":{ 14 | type:String , 15 | required: true 16 | }, 17 | "price":{ 18 | type:Number , 19 | required: true 20 | }, 21 | 'img':{ 22 | type:String , 23 | required: true 24 | }, 25 | "description":{ 26 | type:String , 27 | required: true 28 | }, 29 | "facility":[ 30 | { 31 | "name":{ 32 | type:String , 33 | required: true 34 | } , 35 | "details": { 36 | type:String , 37 | required: true 38 | } 39 | }, 40 | ] 41 | }) 42 | 43 | 44 | const Service= model("Service",ServiceSchema) 45 | 46 | module.exports = Service 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/models/User.js: -------------------------------------------------------------------------------- 1 | const { model, Schema } = require("mongoose"); 2 | 3 | const UserSchema = new Schema({ 4 | 5 | 'img':{ 6 | type:String , 7 | required: true 8 | }, 9 | "name":{ 10 | type:String , 11 | required: true 12 | }, 13 | "email":{ 14 | type:String , 15 | required: true 16 | }, 17 | "address":{ 18 | type:String , 19 | required: true 20 | }, 21 | 22 | }) 23 | 24 | 25 | const User= model("User",UserSchema) 26 | 27 | module.exports = User -------------------------------------------------------------------------------- /src/models/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/models/index.js -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/routes/index.js -------------------------------------------------------------------------------- /src/routes/v1/authentication/index.js: -------------------------------------------------------------------------------- 1 | const { createAuthCookie, logout } = require('../../../api/v1/authentication') 2 | 3 | const router = require('express').Router() 4 | 5 | 6 | router.post('/jwt',createAuthCookie) 7 | router.post('/logout',logout) 8 | 9 | module.exports = router -------------------------------------------------------------------------------- /src/routes/v1/services/index.js: -------------------------------------------------------------------------------- 1 | const findAll = require('../../../api/v1/services/controllers/findAll') 2 | const verifyToken = require('../../../middlewares/verifyToken') 3 | 4 | 5 | const router = require('express').Router() 6 | 7 | 8 | router.get('/services',findAll) 9 | // router.post('/logout',logout) 10 | 11 | module.exports = router -------------------------------------------------------------------------------- /src/utils/globalErrorHandler.js: -------------------------------------------------------------------------------- 1 | const globalErrorHandler = (err, _req, res, _next) => { 2 | // format error 3 | res.status(err.status || 500).json({ 4 | message: err.message, 5 | errors: err.errors, 6 | }); 7 | }; 8 | 9 | module.exports = globalErrorHandler; 10 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sagar-biswas1/folder-structure-server/368abdd398a6b75023740392912a9d6b24fa1ab4/src/utils/index.js --------------------------------------------------------------------------------