├── .gitignore
├── LICENSE
├── README.md
├── app.js
├── bin
└── www
├── package-lock.json
├── package.json
├── public
└── stylesheets
│ └── style.css
├── routes
├── index.js
└── users.js
└── views
├── error.ejs
└── index.ejs
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 |
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright © 2025 Aman Kumar Sinha
2 | GitHub - https://github.com/AmanKumarSinhaGitHub/
3 | Website - https://aman-kumar-sinha.vercel.app/
4 |
5 | This work is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License.
6 |
7 | You are free to:
8 | - Share — copy and redistribute the material in any medium or format
9 | - Adapt — remix, transform, and build upon the material
10 |
11 | Under the following terms:
12 | - Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made.
13 | - NonCommercial — You may not use the material for commercial purposes.
14 |
15 | No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
16 |
17 | To view a copy of this license, visit https://creativecommons.org/licenses/by-nc/4.0/
18 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BackEnd (NodeJs ExpressJs EJS MongoDB)
2 |
3 |
4 | #### 🙏🏻Welcome to our Repository. In this repo, you will **learn A to Z about Backend.**
5 |
6 | Steps to setup a backend for any project.
7 |
8 | ## Express JS Setup
9 |
10 | - Use the npm init command to create a package.json file for your application
11 | ```
12 | npm init
13 | ```
14 |
15 | - Now install Express
16 | ```
17 | npm install express
18 | ```
19 |
20 |
21 | ### Hello World Code in ```app.js``` file
22 |
23 | - Visit to [npmjs.com](https://www.npmjs.com/package/express) or [expressjs.com](https://expressjs.com/en/starter/hello-world.html) and Copy the boiler plate (hello world) code
24 |
25 | ```js
26 | const express = require('express')
27 | const app = express()
28 | const port = 3000
29 |
30 | app.get('/', (req, res) => {
31 | res.send('Hello World!')
32 | })
33 |
34 | app.listen(port, () => {
35 | console.log(`App listening on port ${port}`)
36 | })
37 | ```
38 |
39 | ## EJS setup
40 |
41 | - Install [EJS](https://ejs.co/)
42 | ```
43 | npm install ejs
44 | ```
45 |
46 | - Set view engine
47 | ```js
48 | app.set("view engine", "ejs")
49 | ```
50 |
51 | Now your code look like this
52 |
53 | ```js
54 | const express = require('express')
55 | const app = express()
56 | const port = 3000
57 |
58 | app.set("view engine", "ejs")
59 |
60 | app.get('/', (req, res) => {
61 | res.send('Hello World!')
62 | })
63 |
64 | app.listen(port, () => {
65 | console.log(`App listening on port ${port}`)
66 | })
67 | ```
68 | - Create ```views``` Folder
69 | - Create ```ejs``` files inside ```views``` folder
70 | - Example - ```index.ejs```
71 | - Inside ```index.ejs```, Paste normal html boilder plate code
72 |
73 | ```html
74 |
75 |
76 |
77 |
78 |
79 |
80 | Index.Js File
81 |
82 |
83 |
84 | Welcome to Index.Js file (Home Route)
85 |
86 |
87 |
88 | ```
89 |
90 |
91 | ### Render ```index.ejs``` file inside route
92 |
93 | ```js
94 | app.get('/', (req, res) => {
95 | res.render('index')
96 | })
97 | ```
98 |
99 | Now your code (```app.js```) look like this.
100 | ```js
101 | const express = require('express')
102 | const app = express()
103 | const port = 3000
104 |
105 | app.set("view engine", "ejs")
106 |
107 | app.get('/', (req, res) => {
108 | res.render('index')
109 | })
110 |
111 | app.listen(port, () => {
112 | console.log(`App listening on port ${port}`)
113 | })
114 | ```
115 |
116 | ### Start the Server
117 |
118 | Run this command
119 | ```
120 | node app.js
121 | ```
122 |
123 | But, there is a problem in this way. Whenever you made some changes in your file, you have to restart the server again and again to reflect the changes.
124 |
125 | So the better approach is to start the server using nodemon
126 |
127 | **Install [Nodemon](https://www.npmjs.com/package/nodemon)**
128 |
129 | ```
130 | npm install nodemon
131 | ```
132 |
133 | Now to start server, Just type the command given below
134 |
135 | ```
136 | nodemon app.js
137 | ```
138 |
139 | ### Express static files setup
140 |
141 | - Create ```public``` Folder
142 | - Create ```images```, ```stylesheets``` and ```javascripts``` folder inside public folder.
143 | - You can create files inside these folders. For e.g. ```style.css``` in ```stylesheets``` folder.
144 |
145 | Now write this in ```app.js``` file to [serve](https://expressjs.com/en/starter/static-files.html) static files
146 |
147 | ```js
148 | app.use(express.static('./public'))
149 | ```
150 |
151 | Now your code (```app.js```) look like this
152 | ```js
153 | const express = require('express')
154 | const app = express()
155 | const port = 3000
156 |
157 | app.set("view engine", "ejs")
158 | app.use(express.static('./public'))
159 |
160 | app.get('/', (req, res) => {
161 | res.render('index')
162 | })
163 |
164 | app.listen(port, () => {
165 | console.log(`App listening on port ${port}`)
166 | })
167 | ```
168 | Adding Stylesheet
169 | ```html
170 |
171 | ```
172 |
173 | Now your ```index.ejs``` file looks like
174 |
175 | ``` html
176 |
177 |
178 |
179 |
180 |
181 |
182 | Index.Js File
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 | Welcome to Index.Js file (Home Route)
191 |
192 |
193 |
194 | ```
195 |
196 | And your directory/folder structure looks like this
197 | ```
198 | .
199 | ├── app.js
200 | ├── package.json
201 | ├── public
202 | │ ├── images
203 | │ ├── javascripts
204 | │ └── stylesheets
205 | │ └── style.css
206 | └── views
207 | ├── index.ejs
208 |
209 | ```
210 |
211 |
212 | # [EXPRESS GENERATOR](https://expressjs.com/en/starter/generator.html)
213 |
214 | You can easily do all the above task by just using express generator and save your time to setting up backend again and again.
215 |
216 | #### Install the application generator as a global npm package
217 |
218 | ```
219 | npm install -g express-generator
220 | ```
221 |
222 | ## Steps to setup
223 |
224 | Open cmd/terminal and type the command below to create an app.
225 | ```
226 | express --view=ejs yourAppName
227 | ```
228 |
229 | Now change directory:
230 | ```
231 | cd yourAppName
232 | ```
233 |
234 |
235 | Install dependencies:
236 | ```
237 | npm install
238 | ```
239 |
240 | Now open it on vs code
241 | ```
242 | code .
243 | ```
244 |
245 | Your app is created and opened in VS code.
246 |
247 | ### Run your app by using this command
248 |
249 | ```
250 | npx nodemon
251 | ```
252 |
253 |
254 | #### Note : directory/folder generated by express generator, structure looks like this
255 |
256 | ```
257 | .
258 | ├── app.js
259 | ├── bin
260 | │ └── www
261 | ├── package.json
262 | ├── public
263 | │ ├── images
264 | │ ├── javascripts
265 | │ └── stylesheets
266 | │ └── style.css
267 | ├── routes
268 | │ ├── index.js
269 | │ └── users.js
270 | └── views
271 | ├── error.ejs
272 | ├── index.ejs
273 | └── layout.ejs
274 | ```
275 |
276 | ## Some changes that you have to keep in your mind.
277 |
278 | 1. Previously we write ```app.get```, but now you have to write ```router.get```
279 |
280 | 2. Previously we start our server using ```npm/npx nodemon yourFileName```, but now we have to write ```npx nodemon``` only.
281 |
282 | 3. Linking css or other files method remain same.
283 |
284 | ```html
285 |
286 | ```
287 | ---
288 |
289 |
290 | # MongoDB
291 |
292 | MongoDB is Non-Relational Database.
293 |
294 | Here is the table that represent -> If you code then what happen in mongodb
295 |
296 |
297 | | Code Side | | MongoDB Side Action Here |
298 | | -----------|----| ------------------------ |
299 | | DB Setup | ⟶ | DB Formation |
300 | | Model | ⟶ | Collection |
301 | | Schema | ⟶ | Documents |
302 |
303 |
304 |
305 |
306 | ### Database Setup == DB Formation
307 | - All the data of an app == Database
308 | - And its setup in code side is called DB Setup and in MongoDb side it is called DB formation.
309 |
310 | ### Model == Collection
311 | Suppose Amazon have a data base and amazon data base is divided into four parts.
312 |
313 | - User DB
314 | - Sales DB
315 | - Admin DB
316 | - Profit DB
317 |
318 | These parts are called MODELS in code side and COLLECTION in MongoDB side.
319 |
320 | ### Schema == Documents
321 | Lets suppose UserDB have users and user must have their name, address and phone no.
322 |
323 | These are called Schema (in code side) and Documents (in mongo db side)
324 |
325 | In simple work, how each documents of user look like is called schema
326 |
327 |
328 | ## Lets set up Data Base
329 |
330 | Now we are going to setup a database. To do so, we have to follow these steps.
331 |
332 | 1. Install [MongoDB Community Edition](https://www.mongodb.com/try/download/community) just like any other application
333 |
334 | 2. Install Mongoose Js
335 |
336 | ```
337 | npm install mongoose
338 | ```
339 |
340 | 3. Require and Setup connection for database
341 |
342 | ```js
343 | const mongoose = require("mongoose")
344 |
345 | // Connect to local host mongodb server
346 | mongoose.connect("mongodb://127.0.0.1:27017/amazonDB")
347 | // The above line create a database in mongodb named "amazonDB"
348 | ```
349 |
350 | 4. Make Schema (Document)
351 |
352 | ```js
353 | const userSchema = mongoose.Schema({
354 | username: String,
355 | name: String,
356 | age: Number
357 | })
358 | ```
359 |
360 | 5. Create Model (collection) and Export
361 |
362 | ```js
363 | module.exports = mongoose.model("userDB", userSchema)
364 | ```
365 |
366 | So what we did?
367 | - We created a Database names ```amazonDB```, means Data Setup in code side and DB formation in MongoDB side.
368 | - We created a model (in code side) or collection (in mongodb side) named ```userDB```.
369 | - We created a document that contains data format about user, means Schema created in code side named ```userSchema``` and document created in mongodb side.
370 |
371 |
372 | ### DATABASE Structure
373 |
374 | ```
375 | ── amazonDB
376 | └── userDB
377 | └── userSchema
378 | ```
379 |
380 | ### Now lets do operations in db
381 |
382 | write this code in user.js file
383 |
384 | ```js
385 | const mongoose = require("mongoose")
386 |
387 | // Connect to local host mongodb server
388 | mongoose.connect("mongodb://127.0.0.1:27017/amazonDB")
389 | // The above line create a database in mongodb named "amazonDB"
390 |
391 | const userSchema = mongoose.Schema({
392 | username: String,
393 | name: String,
394 | age: Number
395 | })
396 |
397 | module.exports = mongoose.model("userDB", userSchema)
398 | ```
399 |
400 |
401 | And in index.js to create db
402 | ```js
403 | var express = require('express');
404 | var router = express.Router();
405 |
406 | // Importing mongodb setup code that is written in user.js
407 | const userModel = require("./users")
408 |
409 | /* GET home page. */
410 | router.get('/', function(req, res, next) {
411 | res.render('index');
412 | });
413 |
414 | // Creating model.
415 | router.get("/create", async function (req, res){
416 | const createdUser = await userModel.create({
417 | // these are schema details
418 | username: "aman",
419 | name: "aman kumar sinha",
420 | age: 20
421 | });
422 | res.send(createdUser);
423 | })
424 | // Note: all the things related to userModel is asynchronous nodejs function. So always write async and await
425 |
426 | module.exports = router;
427 | ```
428 |
429 | When you visit ```http://localhost:3000/create``` your data base will be created.
430 |
431 | To see the database is created or not. Open terminal. Type command
432 | ```
433 | mongod
434 | ```
435 | This will open your mongodb server.
436 | Then open a one more tab or a new terminal and type command.
437 | ```
438 | mongosh
439 | ```
440 | And after that in same terminal type these commands one by one
441 | ```js
442 | // This command show all the db in your computer
443 | show dbs
444 |
445 | // Now go to the db that you have created. In our case, its amazonDB
446 | use amazonDB
447 |
448 | // Now write this command to see all the collection inside amazon db
449 | show collections
450 |
451 | // Now type this to see what is in userdb collection
452 | db.userdbs.find()
453 |
454 | // Your userdb's user data look like this
455 | [
456 | {
457 | _id: ObjectId("65411c6ea1039336d4d364cc"),
458 | username: 'aman',
459 | name: 'aman kumar sinha',
460 | age: 20,
461 | __v: 0
462 | }
463 | ]
464 | ```
465 |
466 | To read data using nodejs code (add this line in index.js)
467 |
468 | ```js
469 | // See data (READ data)
470 | router.get("/allUser", async function(req, res){
471 | let users = await userModel.find()
472 | res.send(users)
473 | })
474 |
475 | ```
476 | Go to ```localhost:3000/allUser``` to read data
477 |
478 | Note: ```.find()``` return you all the use. ```.findOne()``` return you one user.
479 |
480 | ```js
481 | router.get("/allUser", async function(req, res){
482 | let users = await userModel.findOne({username:"aman"})
483 | res.send(users)
484 | })
485 | ```
486 |
487 | Delete Data code
488 | ```js
489 | // DELETE Data
490 | router.get("/delete", async function(req, res){
491 | let deletedUser = await userModel.findOneAndDelete({
492 | username:"aman"
493 | })
494 | res.send(deletedUser)
495 | })
496 | // the above code will find user that username is aman and delete it and return its data to deletedUser variable
497 | ```
498 |
499 | ### [Session](https://www.npmjs.com/package/express-session) and [cookies](https://www.npmjs.com/package/cookie-parser):
500 | Data that saved on client side is called cookies and the data that saved on server is called session.
501 |
502 | To use session, you need to install a package form npm
503 | ```
504 | npm install express-session
505 | ```
506 |
507 | In app.js write some lines to use express-session
508 |
509 | ```js
510 | const session = require('express-session');
511 |
512 | app.use(session({
513 | secret: 'your-secret-key-here', // A secret key to sign the session ID cookie
514 | resave: false, // means if data is not modified, don't resave.
515 | saveUninitialized: false // means don't save uninitailized data
516 | }));
517 | ```
518 |
519 | now you can make/create session (open index.js file)
520 |
521 | ```js
522 | // In any route you can set session.
523 | // in our session session is set in home route and if someone visit our home route, session will create and if you open checkSession route, you can see session.
524 |
525 | router.get('/', function(req, res, next) {
526 |
527 | // Session code here
528 | req.session.anyExampleNameHere = 'exampleUserData'; // Storing user data in the session
529 |
530 | res.render('index');
531 | });
532 |
533 | // READ Session
534 | router.get('/checkSession', function(req, res){
535 |
536 | if(req.session.anyExampleNameHere == "exampleUserData"){
537 | console.log(req.session)
538 | res.send("Session saved. see on your console/terminal")
539 | }
540 | else{
541 | res.send("Session data is not available or deleted")
542 | }
543 |
544 | })
545 | ```
546 |
547 | To delete session, code is here
548 | ```js
549 | // Deleting/Destroy session
550 | router.get("/removeSession", function(req, res){
551 | req.session.destroy(function(err){
552 | if(err) throw err;
553 | res.send("session deleted")
554 | })
555 | })
556 | ```
557 |
558 | ### Cookies-Parser
559 |
560 | Cookies are already setup in your code by exress generetor, still I am proving the code
561 |
562 | ```js
563 | var cookieParser = require('cookie-parser');
564 |
565 | app.use(cookieParser());
566 | ```
567 |
568 | Create and read cookie code (index.js)
569 |
570 | ```js
571 | router.get('/', function(req, res, next) {
572 |
573 | // Cookies code here
574 | res.cookie("nameHere", "valueHere")
575 |
576 | res.render('index');
577 | });
578 |
579 | // Read cookie
580 |
581 | router.get('/checkCookie', function(req, res){
582 | console.log(req.cookies)
583 | res.send("check console/terminal for cookie")
584 | })
585 |
586 | // Delete cookie
587 |
588 | router.get('/deleteCookie', function(req, res){
589 | res.clearCookie("nameHere")
590 | res.send("cleared cookie")
591 | })
592 |
593 | ```
594 |
595 | ## Checkout Our More Branches
596 |
597 | - Flash messages
598 |
599 | - Intermediate MongoDB
600 |
601 | - Authentication and Authorization
602 |
603 | - Projects
604 |
605 | - And More
606 |
607 | Code to see branches
608 |
609 | ```
610 | git branch
611 | ```
612 |
613 | checkout to that branch code
614 |
615 | ```
616 | git checkout
617 | ```
618 |
619 | Thank YOU
620 |
621 | ----
622 | ### Beginner-Friendly Projects with EJS, Node.js, Express.js & MongoDB
623 |
624 | Explore these beginner-friendly projects, featuring authentication and authorization functionalities, built using EJS, Node.js, Express.js, and MongoDB.
625 |
626 | #### Projects:
627 |
628 | 1. **Blog Post Project**
629 | - **Features**:
630 | - User Authentication: Implement user registration and login seamlessly.
631 | - Post Management: Create, edit, and delete posts effortlessly.
632 | - User-Centric Viewing: Browse through all posts authored by a specific user.
633 | - Profile Enhancement: Upload and update profile images with ease.
634 | - Engagement Features: Like and unlike posts to interact with content dynamically.
635 | - [GitHub Repository Link](https://github.com/AmanKumarSinhaGitHub/Blog-Post.git)
636 |
637 | 2. **To Do App**
638 | - [GitHub Repository Link](https://github.com/AmanKumarSinhaGitHub/Backend-Node-Express-EJS-MongoDB)
639 | - [Live Demo](https://to-do-list-rz0n.onrender.com/)
640 |
641 |
642 | Feel free to explore and contribute to these projects!
643 |
644 | ## License
645 |
646 | This project is licensed under the [Creative Commons Attribution-NonCommercial 4.0 International License](https://creativecommons.org/licenses/by-nc/4.0/).
647 |
648 | [](https://creativecommons.org/licenses/by-nc/4.0/)
649 |
650 |
651 |
652 |
653 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | var createError = require('http-errors');
2 | var express = require('express');
3 | var path = require('path');
4 | var cookieParser = require('cookie-parser');
5 | var logger = require('morgan');
6 |
7 | var indexRouter = require('./routes/index');
8 | var usersRouter = require('./routes/users');
9 |
10 | var app = express();
11 |
12 | // Session
13 | const session = require('express-session');
14 |
15 | // view engine setup
16 | app.set('views', path.join(__dirname, 'views'));
17 | app.set('view engine', 'ejs');
18 |
19 |
20 | // Session
21 | app.use(session({
22 | secret: 'your-secret-key-here', // A secret key to sign the session ID cookie
23 | resave: false, // means if data is not modified, don't resave.
24 | saveUninitialized: false // means don't save uninitailized data
25 | }));
26 |
27 | app.use(logger('dev'));
28 | app.use(express.json());
29 | app.use(express.urlencoded({ extended: false }));
30 | app.use(cookieParser());
31 | app.use(express.static(path.join(__dirname, 'public')));
32 |
33 | app.use('/', indexRouter);
34 | app.use('/users', usersRouter);
35 |
36 | // catch 404 and forward to error handler
37 | app.use(function (req, res, next) {
38 | next(createError(404));
39 | });
40 |
41 | // error handler
42 | app.use(function (err, req, res, next) {
43 | // set locals, only providing error in development
44 | res.locals.message = err.message;
45 | res.locals.error = req.app.get('env') === 'development' ? err : {};
46 |
47 | // render the error page
48 | res.status(err.status || 500);
49 | res.render('error');
50 | });
51 |
52 | module.exports = app;
53 |
--------------------------------------------------------------------------------
/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var app = require('../app');
8 | var debug = require('debug')('myapp:server');
9 | var http = require('http');
10 |
11 | /**
12 | * Get port from environment and store in Express.
13 | */
14 |
15 | var port = normalizePort(process.env.PORT || '3000');
16 | app.set('port', port);
17 |
18 | /**
19 | * Create HTTP server.
20 | */
21 |
22 | var server = http.createServer(app);
23 |
24 | /**
25 | * Listen on provided port, on all network interfaces.
26 | */
27 |
28 | server.listen(port);
29 | server.on('error', onError);
30 | server.on('listening', onListening);
31 |
32 | /**
33 | * Normalize a port into a number, string, or false.
34 | */
35 |
36 | function normalizePort(val) {
37 | var port = parseInt(val, 10);
38 |
39 | if (isNaN(port)) {
40 | // named pipe
41 | return val;
42 | }
43 |
44 | if (port >= 0) {
45 | // port number
46 | return port;
47 | }
48 |
49 | return false;
50 | }
51 |
52 | /**
53 | * Event listener for HTTP server "error" event.
54 | */
55 |
56 | function onError(error) {
57 | if (error.syscall !== 'listen') {
58 | throw error;
59 | }
60 |
61 | var bind = typeof port === 'string'
62 | ? 'Pipe ' + port
63 | : 'Port ' + port;
64 |
65 | // handle specific listen errors with friendly messages
66 | switch (error.code) {
67 | case 'EACCES':
68 | console.error(bind + ' requires elevated privileges');
69 | process.exit(1);
70 | break;
71 | case 'EADDRINUSE':
72 | console.error(bind + ' is already in use');
73 | process.exit(1);
74 | break;
75 | default:
76 | throw error;
77 | }
78 | }
79 |
80 | /**
81 | * Event listener for HTTP server "listening" event.
82 | */
83 |
84 | function onListening() {
85 | var addr = server.address();
86 | var bind = typeof addr === 'string'
87 | ? 'pipe ' + addr
88 | : 'port ' + addr.port;
89 | debug('Listening on ' + bind);
90 | }
91 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "myapp",
3 | "version": "0.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "myapp",
9 | "version": "0.0.0",
10 | "dependencies": {
11 | "cookie-parser": "~1.4.4",
12 | "debug": "~2.6.9",
13 | "ejs": "^3.1.9",
14 | "express": "^4.18.2",
15 | "express-session": "^1.17.3",
16 | "http-errors": "~1.6.3",
17 | "mongoose": "^8.0.0",
18 | "morgan": "~1.9.1"
19 | }
20 | },
21 | "node_modules/@mongodb-js/saslprep": {
22 | "version": "1.1.1",
23 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz",
24 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==",
25 | "dependencies": {
26 | "sparse-bitfield": "^3.0.3"
27 | }
28 | },
29 | "node_modules/@types/node": {
30 | "version": "20.8.10",
31 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
32 | "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==",
33 | "dependencies": {
34 | "undici-types": "~5.26.4"
35 | }
36 | },
37 | "node_modules/@types/webidl-conversions": {
38 | "version": "7.0.2",
39 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz",
40 | "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ=="
41 | },
42 | "node_modules/@types/whatwg-url": {
43 | "version": "8.2.2",
44 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
45 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
46 | "dependencies": {
47 | "@types/node": "*",
48 | "@types/webidl-conversions": "*"
49 | }
50 | },
51 | "node_modules/accepts": {
52 | "version": "1.3.8",
53 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
54 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
55 | "dependencies": {
56 | "mime-types": "~2.1.34",
57 | "negotiator": "0.6.3"
58 | },
59 | "engines": {
60 | "node": ">= 0.6"
61 | }
62 | },
63 | "node_modules/ansi-styles": {
64 | "version": "4.3.0",
65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
66 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
67 | "dependencies": {
68 | "color-convert": "^2.0.1"
69 | },
70 | "engines": {
71 | "node": ">=8"
72 | },
73 | "funding": {
74 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
75 | }
76 | },
77 | "node_modules/array-flatten": {
78 | "version": "1.1.1",
79 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
80 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
81 | },
82 | "node_modules/async": {
83 | "version": "3.2.4",
84 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
85 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
86 | },
87 | "node_modules/balanced-match": {
88 | "version": "1.0.2",
89 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
90 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
91 | },
92 | "node_modules/basic-auth": {
93 | "version": "2.0.1",
94 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
95 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
96 | "dependencies": {
97 | "safe-buffer": "5.1.2"
98 | },
99 | "engines": {
100 | "node": ">= 0.8"
101 | }
102 | },
103 | "node_modules/body-parser": {
104 | "version": "1.20.1",
105 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
106 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
107 | "dependencies": {
108 | "bytes": "3.1.2",
109 | "content-type": "~1.0.4",
110 | "debug": "2.6.9",
111 | "depd": "2.0.0",
112 | "destroy": "1.2.0",
113 | "http-errors": "2.0.0",
114 | "iconv-lite": "0.4.24",
115 | "on-finished": "2.4.1",
116 | "qs": "6.11.0",
117 | "raw-body": "2.5.1",
118 | "type-is": "~1.6.18",
119 | "unpipe": "1.0.0"
120 | },
121 | "engines": {
122 | "node": ">= 0.8",
123 | "npm": "1.2.8000 || >= 1.4.16"
124 | }
125 | },
126 | "node_modules/body-parser/node_modules/depd": {
127 | "version": "2.0.0",
128 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
129 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
130 | "engines": {
131 | "node": ">= 0.8"
132 | }
133 | },
134 | "node_modules/body-parser/node_modules/http-errors": {
135 | "version": "2.0.0",
136 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
137 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
138 | "dependencies": {
139 | "depd": "2.0.0",
140 | "inherits": "2.0.4",
141 | "setprototypeof": "1.2.0",
142 | "statuses": "2.0.1",
143 | "toidentifier": "1.0.1"
144 | },
145 | "engines": {
146 | "node": ">= 0.8"
147 | }
148 | },
149 | "node_modules/body-parser/node_modules/inherits": {
150 | "version": "2.0.4",
151 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
152 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
153 | },
154 | "node_modules/body-parser/node_modules/on-finished": {
155 | "version": "2.4.1",
156 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
157 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
158 | "dependencies": {
159 | "ee-first": "1.1.1"
160 | },
161 | "engines": {
162 | "node": ">= 0.8"
163 | }
164 | },
165 | "node_modules/body-parser/node_modules/setprototypeof": {
166 | "version": "1.2.0",
167 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
168 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
169 | },
170 | "node_modules/body-parser/node_modules/statuses": {
171 | "version": "2.0.1",
172 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
173 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
174 | "engines": {
175 | "node": ">= 0.8"
176 | }
177 | },
178 | "node_modules/brace-expansion": {
179 | "version": "1.1.11",
180 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
181 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
182 | "dependencies": {
183 | "balanced-match": "^1.0.0",
184 | "concat-map": "0.0.1"
185 | }
186 | },
187 | "node_modules/bson": {
188 | "version": "6.2.0",
189 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
190 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
191 | "engines": {
192 | "node": ">=16.20.1"
193 | }
194 | },
195 | "node_modules/bytes": {
196 | "version": "3.1.2",
197 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
198 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
199 | "engines": {
200 | "node": ">= 0.8"
201 | }
202 | },
203 | "node_modules/call-bind": {
204 | "version": "1.0.5",
205 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
206 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
207 | "dependencies": {
208 | "function-bind": "^1.1.2",
209 | "get-intrinsic": "^1.2.1",
210 | "set-function-length": "^1.1.1"
211 | },
212 | "funding": {
213 | "url": "https://github.com/sponsors/ljharb"
214 | }
215 | },
216 | "node_modules/chalk": {
217 | "version": "4.1.2",
218 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
219 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
220 | "dependencies": {
221 | "ansi-styles": "^4.1.0",
222 | "supports-color": "^7.1.0"
223 | },
224 | "engines": {
225 | "node": ">=10"
226 | },
227 | "funding": {
228 | "url": "https://github.com/chalk/chalk?sponsor=1"
229 | }
230 | },
231 | "node_modules/color-convert": {
232 | "version": "2.0.1",
233 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
234 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
235 | "dependencies": {
236 | "color-name": "~1.1.4"
237 | },
238 | "engines": {
239 | "node": ">=7.0.0"
240 | }
241 | },
242 | "node_modules/color-name": {
243 | "version": "1.1.4",
244 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
245 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
246 | },
247 | "node_modules/concat-map": {
248 | "version": "0.0.1",
249 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
250 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
251 | },
252 | "node_modules/content-disposition": {
253 | "version": "0.5.4",
254 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
255 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
256 | "dependencies": {
257 | "safe-buffer": "5.2.1"
258 | },
259 | "engines": {
260 | "node": ">= 0.6"
261 | }
262 | },
263 | "node_modules/content-disposition/node_modules/safe-buffer": {
264 | "version": "5.2.1",
265 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
266 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
267 | "funding": [
268 | {
269 | "type": "github",
270 | "url": "https://github.com/sponsors/feross"
271 | },
272 | {
273 | "type": "patreon",
274 | "url": "https://www.patreon.com/feross"
275 | },
276 | {
277 | "type": "consulting",
278 | "url": "https://feross.org/support"
279 | }
280 | ]
281 | },
282 | "node_modules/content-type": {
283 | "version": "1.0.5",
284 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
285 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
286 | "engines": {
287 | "node": ">= 0.6"
288 | }
289 | },
290 | "node_modules/cookie": {
291 | "version": "0.4.1",
292 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
293 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
294 | "engines": {
295 | "node": ">= 0.6"
296 | }
297 | },
298 | "node_modules/cookie-parser": {
299 | "version": "1.4.6",
300 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
301 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
302 | "dependencies": {
303 | "cookie": "0.4.1",
304 | "cookie-signature": "1.0.6"
305 | },
306 | "engines": {
307 | "node": ">= 0.8.0"
308 | }
309 | },
310 | "node_modules/cookie-signature": {
311 | "version": "1.0.6",
312 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
313 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
314 | },
315 | "node_modules/debug": {
316 | "version": "2.6.9",
317 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
318 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
319 | "dependencies": {
320 | "ms": "2.0.0"
321 | }
322 | },
323 | "node_modules/define-data-property": {
324 | "version": "1.1.1",
325 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
326 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
327 | "dependencies": {
328 | "get-intrinsic": "^1.2.1",
329 | "gopd": "^1.0.1",
330 | "has-property-descriptors": "^1.0.0"
331 | },
332 | "engines": {
333 | "node": ">= 0.4"
334 | }
335 | },
336 | "node_modules/depd": {
337 | "version": "1.1.2",
338 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
339 | "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
340 | "engines": {
341 | "node": ">= 0.6"
342 | }
343 | },
344 | "node_modules/destroy": {
345 | "version": "1.2.0",
346 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
347 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
348 | "engines": {
349 | "node": ">= 0.8",
350 | "npm": "1.2.8000 || >= 1.4.16"
351 | }
352 | },
353 | "node_modules/ee-first": {
354 | "version": "1.1.1",
355 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
356 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
357 | },
358 | "node_modules/ejs": {
359 | "version": "3.1.9",
360 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
361 | "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
362 | "dependencies": {
363 | "jake": "^10.8.5"
364 | },
365 | "bin": {
366 | "ejs": "bin/cli.js"
367 | },
368 | "engines": {
369 | "node": ">=0.10.0"
370 | }
371 | },
372 | "node_modules/encodeurl": {
373 | "version": "1.0.2",
374 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
375 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
376 | "engines": {
377 | "node": ">= 0.8"
378 | }
379 | },
380 | "node_modules/escape-html": {
381 | "version": "1.0.3",
382 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
383 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
384 | },
385 | "node_modules/etag": {
386 | "version": "1.8.1",
387 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
388 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
389 | "engines": {
390 | "node": ">= 0.6"
391 | }
392 | },
393 | "node_modules/express": {
394 | "version": "4.18.2",
395 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
396 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
397 | "dependencies": {
398 | "accepts": "~1.3.8",
399 | "array-flatten": "1.1.1",
400 | "body-parser": "1.20.1",
401 | "content-disposition": "0.5.4",
402 | "content-type": "~1.0.4",
403 | "cookie": "0.5.0",
404 | "cookie-signature": "1.0.6",
405 | "debug": "2.6.9",
406 | "depd": "2.0.0",
407 | "encodeurl": "~1.0.2",
408 | "escape-html": "~1.0.3",
409 | "etag": "~1.8.1",
410 | "finalhandler": "1.2.0",
411 | "fresh": "0.5.2",
412 | "http-errors": "2.0.0",
413 | "merge-descriptors": "1.0.1",
414 | "methods": "~1.1.2",
415 | "on-finished": "2.4.1",
416 | "parseurl": "~1.3.3",
417 | "path-to-regexp": "0.1.7",
418 | "proxy-addr": "~2.0.7",
419 | "qs": "6.11.0",
420 | "range-parser": "~1.2.1",
421 | "safe-buffer": "5.2.1",
422 | "send": "0.18.0",
423 | "serve-static": "1.15.0",
424 | "setprototypeof": "1.2.0",
425 | "statuses": "2.0.1",
426 | "type-is": "~1.6.18",
427 | "utils-merge": "1.0.1",
428 | "vary": "~1.1.2"
429 | },
430 | "engines": {
431 | "node": ">= 0.10.0"
432 | }
433 | },
434 | "node_modules/express-session": {
435 | "version": "1.17.3",
436 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
437 | "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
438 | "dependencies": {
439 | "cookie": "0.4.2",
440 | "cookie-signature": "1.0.6",
441 | "debug": "2.6.9",
442 | "depd": "~2.0.0",
443 | "on-headers": "~1.0.2",
444 | "parseurl": "~1.3.3",
445 | "safe-buffer": "5.2.1",
446 | "uid-safe": "~2.1.5"
447 | },
448 | "engines": {
449 | "node": ">= 0.8.0"
450 | }
451 | },
452 | "node_modules/express-session/node_modules/cookie": {
453 | "version": "0.4.2",
454 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
455 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
456 | "engines": {
457 | "node": ">= 0.6"
458 | }
459 | },
460 | "node_modules/express-session/node_modules/depd": {
461 | "version": "2.0.0",
462 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
463 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
464 | "engines": {
465 | "node": ">= 0.8"
466 | }
467 | },
468 | "node_modules/express-session/node_modules/safe-buffer": {
469 | "version": "5.2.1",
470 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
471 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
472 | "funding": [
473 | {
474 | "type": "github",
475 | "url": "https://github.com/sponsors/feross"
476 | },
477 | {
478 | "type": "patreon",
479 | "url": "https://www.patreon.com/feross"
480 | },
481 | {
482 | "type": "consulting",
483 | "url": "https://feross.org/support"
484 | }
485 | ]
486 | },
487 | "node_modules/express/node_modules/cookie": {
488 | "version": "0.5.0",
489 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
490 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
491 | "engines": {
492 | "node": ">= 0.6"
493 | }
494 | },
495 | "node_modules/express/node_modules/depd": {
496 | "version": "2.0.0",
497 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
498 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
499 | "engines": {
500 | "node": ">= 0.8"
501 | }
502 | },
503 | "node_modules/express/node_modules/http-errors": {
504 | "version": "2.0.0",
505 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
506 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
507 | "dependencies": {
508 | "depd": "2.0.0",
509 | "inherits": "2.0.4",
510 | "setprototypeof": "1.2.0",
511 | "statuses": "2.0.1",
512 | "toidentifier": "1.0.1"
513 | },
514 | "engines": {
515 | "node": ">= 0.8"
516 | }
517 | },
518 | "node_modules/express/node_modules/inherits": {
519 | "version": "2.0.4",
520 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
521 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
522 | },
523 | "node_modules/express/node_modules/on-finished": {
524 | "version": "2.4.1",
525 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
526 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
527 | "dependencies": {
528 | "ee-first": "1.1.1"
529 | },
530 | "engines": {
531 | "node": ">= 0.8"
532 | }
533 | },
534 | "node_modules/express/node_modules/safe-buffer": {
535 | "version": "5.2.1",
536 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
537 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
538 | "funding": [
539 | {
540 | "type": "github",
541 | "url": "https://github.com/sponsors/feross"
542 | },
543 | {
544 | "type": "patreon",
545 | "url": "https://www.patreon.com/feross"
546 | },
547 | {
548 | "type": "consulting",
549 | "url": "https://feross.org/support"
550 | }
551 | ]
552 | },
553 | "node_modules/express/node_modules/setprototypeof": {
554 | "version": "1.2.0",
555 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
556 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
557 | },
558 | "node_modules/express/node_modules/statuses": {
559 | "version": "2.0.1",
560 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
561 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
562 | "engines": {
563 | "node": ">= 0.8"
564 | }
565 | },
566 | "node_modules/filelist": {
567 | "version": "1.0.4",
568 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
569 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
570 | "dependencies": {
571 | "minimatch": "^5.0.1"
572 | }
573 | },
574 | "node_modules/filelist/node_modules/brace-expansion": {
575 | "version": "2.0.1",
576 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
577 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
578 | "dependencies": {
579 | "balanced-match": "^1.0.0"
580 | }
581 | },
582 | "node_modules/filelist/node_modules/minimatch": {
583 | "version": "5.1.6",
584 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
585 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
586 | "dependencies": {
587 | "brace-expansion": "^2.0.1"
588 | },
589 | "engines": {
590 | "node": ">=10"
591 | }
592 | },
593 | "node_modules/finalhandler": {
594 | "version": "1.2.0",
595 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
596 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
597 | "dependencies": {
598 | "debug": "2.6.9",
599 | "encodeurl": "~1.0.2",
600 | "escape-html": "~1.0.3",
601 | "on-finished": "2.4.1",
602 | "parseurl": "~1.3.3",
603 | "statuses": "2.0.1",
604 | "unpipe": "~1.0.0"
605 | },
606 | "engines": {
607 | "node": ">= 0.8"
608 | }
609 | },
610 | "node_modules/finalhandler/node_modules/on-finished": {
611 | "version": "2.4.1",
612 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
613 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
614 | "dependencies": {
615 | "ee-first": "1.1.1"
616 | },
617 | "engines": {
618 | "node": ">= 0.8"
619 | }
620 | },
621 | "node_modules/finalhandler/node_modules/statuses": {
622 | "version": "2.0.1",
623 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
624 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
625 | "engines": {
626 | "node": ">= 0.8"
627 | }
628 | },
629 | "node_modules/forwarded": {
630 | "version": "0.2.0",
631 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
632 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
633 | "engines": {
634 | "node": ">= 0.6"
635 | }
636 | },
637 | "node_modules/fresh": {
638 | "version": "0.5.2",
639 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
640 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
641 | "engines": {
642 | "node": ">= 0.6"
643 | }
644 | },
645 | "node_modules/function-bind": {
646 | "version": "1.1.2",
647 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
648 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
649 | "funding": {
650 | "url": "https://github.com/sponsors/ljharb"
651 | }
652 | },
653 | "node_modules/get-intrinsic": {
654 | "version": "1.2.2",
655 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
656 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
657 | "dependencies": {
658 | "function-bind": "^1.1.2",
659 | "has-proto": "^1.0.1",
660 | "has-symbols": "^1.0.3",
661 | "hasown": "^2.0.0"
662 | },
663 | "funding": {
664 | "url": "https://github.com/sponsors/ljharb"
665 | }
666 | },
667 | "node_modules/gopd": {
668 | "version": "1.0.1",
669 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
670 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
671 | "dependencies": {
672 | "get-intrinsic": "^1.1.3"
673 | },
674 | "funding": {
675 | "url": "https://github.com/sponsors/ljharb"
676 | }
677 | },
678 | "node_modules/has-flag": {
679 | "version": "4.0.0",
680 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
681 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
682 | "engines": {
683 | "node": ">=8"
684 | }
685 | },
686 | "node_modules/has-property-descriptors": {
687 | "version": "1.0.1",
688 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
689 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
690 | "dependencies": {
691 | "get-intrinsic": "^1.2.2"
692 | },
693 | "funding": {
694 | "url": "https://github.com/sponsors/ljharb"
695 | }
696 | },
697 | "node_modules/has-proto": {
698 | "version": "1.0.1",
699 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
700 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
701 | "engines": {
702 | "node": ">= 0.4"
703 | },
704 | "funding": {
705 | "url": "https://github.com/sponsors/ljharb"
706 | }
707 | },
708 | "node_modules/has-symbols": {
709 | "version": "1.0.3",
710 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
711 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
712 | "engines": {
713 | "node": ">= 0.4"
714 | },
715 | "funding": {
716 | "url": "https://github.com/sponsors/ljharb"
717 | }
718 | },
719 | "node_modules/hasown": {
720 | "version": "2.0.0",
721 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
722 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
723 | "dependencies": {
724 | "function-bind": "^1.1.2"
725 | },
726 | "engines": {
727 | "node": ">= 0.4"
728 | }
729 | },
730 | "node_modules/http-errors": {
731 | "version": "1.6.3",
732 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
733 | "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
734 | "dependencies": {
735 | "depd": "~1.1.2",
736 | "inherits": "2.0.3",
737 | "setprototypeof": "1.1.0",
738 | "statuses": ">= 1.4.0 < 2"
739 | },
740 | "engines": {
741 | "node": ">= 0.6"
742 | }
743 | },
744 | "node_modules/iconv-lite": {
745 | "version": "0.4.24",
746 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
747 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
748 | "dependencies": {
749 | "safer-buffer": ">= 2.1.2 < 3"
750 | },
751 | "engines": {
752 | "node": ">=0.10.0"
753 | }
754 | },
755 | "node_modules/inherits": {
756 | "version": "2.0.3",
757 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
758 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
759 | },
760 | "node_modules/ipaddr.js": {
761 | "version": "1.9.1",
762 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
763 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
764 | "engines": {
765 | "node": ">= 0.10"
766 | }
767 | },
768 | "node_modules/jake": {
769 | "version": "10.8.7",
770 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
771 | "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
772 | "dependencies": {
773 | "async": "^3.2.3",
774 | "chalk": "^4.0.2",
775 | "filelist": "^1.0.4",
776 | "minimatch": "^3.1.2"
777 | },
778 | "bin": {
779 | "jake": "bin/cli.js"
780 | },
781 | "engines": {
782 | "node": ">=10"
783 | }
784 | },
785 | "node_modules/kareem": {
786 | "version": "2.5.1",
787 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
788 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
789 | "engines": {
790 | "node": ">=12.0.0"
791 | }
792 | },
793 | "node_modules/media-typer": {
794 | "version": "0.3.0",
795 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
796 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
797 | "engines": {
798 | "node": ">= 0.6"
799 | }
800 | },
801 | "node_modules/memory-pager": {
802 | "version": "1.5.0",
803 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
804 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
805 | },
806 | "node_modules/merge-descriptors": {
807 | "version": "1.0.1",
808 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
809 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
810 | },
811 | "node_modules/methods": {
812 | "version": "1.1.2",
813 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
814 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
815 | "engines": {
816 | "node": ">= 0.6"
817 | }
818 | },
819 | "node_modules/mime": {
820 | "version": "1.6.0",
821 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
822 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
823 | "bin": {
824 | "mime": "cli.js"
825 | },
826 | "engines": {
827 | "node": ">=4"
828 | }
829 | },
830 | "node_modules/mime-db": {
831 | "version": "1.52.0",
832 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
833 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
834 | "engines": {
835 | "node": ">= 0.6"
836 | }
837 | },
838 | "node_modules/mime-types": {
839 | "version": "2.1.35",
840 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
841 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
842 | "dependencies": {
843 | "mime-db": "1.52.0"
844 | },
845 | "engines": {
846 | "node": ">= 0.6"
847 | }
848 | },
849 | "node_modules/minimatch": {
850 | "version": "3.1.2",
851 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
852 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
853 | "dependencies": {
854 | "brace-expansion": "^1.1.7"
855 | },
856 | "engines": {
857 | "node": "*"
858 | }
859 | },
860 | "node_modules/mongodb": {
861 | "version": "6.2.0",
862 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
863 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
864 | "dependencies": {
865 | "@mongodb-js/saslprep": "^1.1.0",
866 | "bson": "^6.2.0",
867 | "mongodb-connection-string-url": "^2.6.0"
868 | },
869 | "engines": {
870 | "node": ">=16.20.1"
871 | },
872 | "peerDependencies": {
873 | "@aws-sdk/credential-providers": "^3.188.0",
874 | "@mongodb-js/zstd": "^1.1.0",
875 | "gcp-metadata": "^5.2.0",
876 | "kerberos": "^2.0.1",
877 | "mongodb-client-encryption": ">=6.0.0 <7",
878 | "snappy": "^7.2.2",
879 | "socks": "^2.7.1"
880 | },
881 | "peerDependenciesMeta": {
882 | "@aws-sdk/credential-providers": {
883 | "optional": true
884 | },
885 | "@mongodb-js/zstd": {
886 | "optional": true
887 | },
888 | "gcp-metadata": {
889 | "optional": true
890 | },
891 | "kerberos": {
892 | "optional": true
893 | },
894 | "mongodb-client-encryption": {
895 | "optional": true
896 | },
897 | "snappy": {
898 | "optional": true
899 | },
900 | "socks": {
901 | "optional": true
902 | }
903 | }
904 | },
905 | "node_modules/mongodb-connection-string-url": {
906 | "version": "2.6.0",
907 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
908 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
909 | "dependencies": {
910 | "@types/whatwg-url": "^8.2.1",
911 | "whatwg-url": "^11.0.0"
912 | }
913 | },
914 | "node_modules/mongoose": {
915 | "version": "8.0.0",
916 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.0.tgz",
917 | "integrity": "sha512-PzwkLgm1Jhj0NQdgGfnFsu0QP9V1sBFgbavEgh/IPAUzKAagzvEhuaBuAQOQGjczVWnpIU9tBqyd02cOTgsPlA==",
918 | "dependencies": {
919 | "bson": "^6.2.0",
920 | "kareem": "2.5.1",
921 | "mongodb": "6.2.0",
922 | "mpath": "0.9.0",
923 | "mquery": "5.0.0",
924 | "ms": "2.1.3",
925 | "sift": "16.0.1"
926 | },
927 | "engines": {
928 | "node": ">=16.20.1"
929 | },
930 | "funding": {
931 | "type": "opencollective",
932 | "url": "https://opencollective.com/mongoose"
933 | }
934 | },
935 | "node_modules/mongoose/node_modules/ms": {
936 | "version": "2.1.3",
937 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
938 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
939 | },
940 | "node_modules/morgan": {
941 | "version": "1.9.1",
942 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
943 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
944 | "dependencies": {
945 | "basic-auth": "~2.0.0",
946 | "debug": "2.6.9",
947 | "depd": "~1.1.2",
948 | "on-finished": "~2.3.0",
949 | "on-headers": "~1.0.1"
950 | },
951 | "engines": {
952 | "node": ">= 0.8.0"
953 | }
954 | },
955 | "node_modules/mpath": {
956 | "version": "0.9.0",
957 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
958 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
959 | "engines": {
960 | "node": ">=4.0.0"
961 | }
962 | },
963 | "node_modules/mquery": {
964 | "version": "5.0.0",
965 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
966 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
967 | "dependencies": {
968 | "debug": "4.x"
969 | },
970 | "engines": {
971 | "node": ">=14.0.0"
972 | }
973 | },
974 | "node_modules/mquery/node_modules/debug": {
975 | "version": "4.3.4",
976 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
977 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
978 | "dependencies": {
979 | "ms": "2.1.2"
980 | },
981 | "engines": {
982 | "node": ">=6.0"
983 | },
984 | "peerDependenciesMeta": {
985 | "supports-color": {
986 | "optional": true
987 | }
988 | }
989 | },
990 | "node_modules/mquery/node_modules/ms": {
991 | "version": "2.1.2",
992 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
993 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
994 | },
995 | "node_modules/ms": {
996 | "version": "2.0.0",
997 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
998 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
999 | },
1000 | "node_modules/negotiator": {
1001 | "version": "0.6.3",
1002 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1003 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1004 | "engines": {
1005 | "node": ">= 0.6"
1006 | }
1007 | },
1008 | "node_modules/object-inspect": {
1009 | "version": "1.13.1",
1010 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
1011 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
1012 | "funding": {
1013 | "url": "https://github.com/sponsors/ljharb"
1014 | }
1015 | },
1016 | "node_modules/on-finished": {
1017 | "version": "2.3.0",
1018 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1019 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
1020 | "dependencies": {
1021 | "ee-first": "1.1.1"
1022 | },
1023 | "engines": {
1024 | "node": ">= 0.8"
1025 | }
1026 | },
1027 | "node_modules/on-headers": {
1028 | "version": "1.0.2",
1029 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1030 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
1031 | "engines": {
1032 | "node": ">= 0.8"
1033 | }
1034 | },
1035 | "node_modules/parseurl": {
1036 | "version": "1.3.3",
1037 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1038 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1039 | "engines": {
1040 | "node": ">= 0.8"
1041 | }
1042 | },
1043 | "node_modules/path-to-regexp": {
1044 | "version": "0.1.7",
1045 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1046 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1047 | },
1048 | "node_modules/proxy-addr": {
1049 | "version": "2.0.7",
1050 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1051 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1052 | "dependencies": {
1053 | "forwarded": "0.2.0",
1054 | "ipaddr.js": "1.9.1"
1055 | },
1056 | "engines": {
1057 | "node": ">= 0.10"
1058 | }
1059 | },
1060 | "node_modules/punycode": {
1061 | "version": "2.3.1",
1062 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1063 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1064 | "engines": {
1065 | "node": ">=6"
1066 | }
1067 | },
1068 | "node_modules/qs": {
1069 | "version": "6.11.0",
1070 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1071 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1072 | "dependencies": {
1073 | "side-channel": "^1.0.4"
1074 | },
1075 | "engines": {
1076 | "node": ">=0.6"
1077 | },
1078 | "funding": {
1079 | "url": "https://github.com/sponsors/ljharb"
1080 | }
1081 | },
1082 | "node_modules/random-bytes": {
1083 | "version": "1.0.0",
1084 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
1085 | "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
1086 | "engines": {
1087 | "node": ">= 0.8"
1088 | }
1089 | },
1090 | "node_modules/range-parser": {
1091 | "version": "1.2.1",
1092 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1093 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1094 | "engines": {
1095 | "node": ">= 0.6"
1096 | }
1097 | },
1098 | "node_modules/raw-body": {
1099 | "version": "2.5.1",
1100 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1101 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1102 | "dependencies": {
1103 | "bytes": "3.1.2",
1104 | "http-errors": "2.0.0",
1105 | "iconv-lite": "0.4.24",
1106 | "unpipe": "1.0.0"
1107 | },
1108 | "engines": {
1109 | "node": ">= 0.8"
1110 | }
1111 | },
1112 | "node_modules/raw-body/node_modules/depd": {
1113 | "version": "2.0.0",
1114 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1115 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
1116 | "engines": {
1117 | "node": ">= 0.8"
1118 | }
1119 | },
1120 | "node_modules/raw-body/node_modules/http-errors": {
1121 | "version": "2.0.0",
1122 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1123 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1124 | "dependencies": {
1125 | "depd": "2.0.0",
1126 | "inherits": "2.0.4",
1127 | "setprototypeof": "1.2.0",
1128 | "statuses": "2.0.1",
1129 | "toidentifier": "1.0.1"
1130 | },
1131 | "engines": {
1132 | "node": ">= 0.8"
1133 | }
1134 | },
1135 | "node_modules/raw-body/node_modules/inherits": {
1136 | "version": "2.0.4",
1137 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1138 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1139 | },
1140 | "node_modules/raw-body/node_modules/setprototypeof": {
1141 | "version": "1.2.0",
1142 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1143 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1144 | },
1145 | "node_modules/raw-body/node_modules/statuses": {
1146 | "version": "2.0.1",
1147 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1148 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1149 | "engines": {
1150 | "node": ">= 0.8"
1151 | }
1152 | },
1153 | "node_modules/safe-buffer": {
1154 | "version": "5.1.2",
1155 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1156 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1157 | },
1158 | "node_modules/safer-buffer": {
1159 | "version": "2.1.2",
1160 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1161 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1162 | },
1163 | "node_modules/send": {
1164 | "version": "0.18.0",
1165 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1166 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1167 | "dependencies": {
1168 | "debug": "2.6.9",
1169 | "depd": "2.0.0",
1170 | "destroy": "1.2.0",
1171 | "encodeurl": "~1.0.2",
1172 | "escape-html": "~1.0.3",
1173 | "etag": "~1.8.1",
1174 | "fresh": "0.5.2",
1175 | "http-errors": "2.0.0",
1176 | "mime": "1.6.0",
1177 | "ms": "2.1.3",
1178 | "on-finished": "2.4.1",
1179 | "range-parser": "~1.2.1",
1180 | "statuses": "2.0.1"
1181 | },
1182 | "engines": {
1183 | "node": ">= 0.8.0"
1184 | }
1185 | },
1186 | "node_modules/send/node_modules/depd": {
1187 | "version": "2.0.0",
1188 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1189 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
1190 | "engines": {
1191 | "node": ">= 0.8"
1192 | }
1193 | },
1194 | "node_modules/send/node_modules/http-errors": {
1195 | "version": "2.0.0",
1196 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1197 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1198 | "dependencies": {
1199 | "depd": "2.0.0",
1200 | "inherits": "2.0.4",
1201 | "setprototypeof": "1.2.0",
1202 | "statuses": "2.0.1",
1203 | "toidentifier": "1.0.1"
1204 | },
1205 | "engines": {
1206 | "node": ">= 0.8"
1207 | }
1208 | },
1209 | "node_modules/send/node_modules/inherits": {
1210 | "version": "2.0.4",
1211 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1212 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1213 | },
1214 | "node_modules/send/node_modules/ms": {
1215 | "version": "2.1.3",
1216 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1217 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1218 | },
1219 | "node_modules/send/node_modules/on-finished": {
1220 | "version": "2.4.1",
1221 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1222 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1223 | "dependencies": {
1224 | "ee-first": "1.1.1"
1225 | },
1226 | "engines": {
1227 | "node": ">= 0.8"
1228 | }
1229 | },
1230 | "node_modules/send/node_modules/setprototypeof": {
1231 | "version": "1.2.0",
1232 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1233 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1234 | },
1235 | "node_modules/send/node_modules/statuses": {
1236 | "version": "2.0.1",
1237 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1238 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1239 | "engines": {
1240 | "node": ">= 0.8"
1241 | }
1242 | },
1243 | "node_modules/serve-static": {
1244 | "version": "1.15.0",
1245 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1246 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1247 | "dependencies": {
1248 | "encodeurl": "~1.0.2",
1249 | "escape-html": "~1.0.3",
1250 | "parseurl": "~1.3.3",
1251 | "send": "0.18.0"
1252 | },
1253 | "engines": {
1254 | "node": ">= 0.8.0"
1255 | }
1256 | },
1257 | "node_modules/set-function-length": {
1258 | "version": "1.1.1",
1259 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
1260 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
1261 | "dependencies": {
1262 | "define-data-property": "^1.1.1",
1263 | "get-intrinsic": "^1.2.1",
1264 | "gopd": "^1.0.1",
1265 | "has-property-descriptors": "^1.0.0"
1266 | },
1267 | "engines": {
1268 | "node": ">= 0.4"
1269 | }
1270 | },
1271 | "node_modules/setprototypeof": {
1272 | "version": "1.1.0",
1273 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1274 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1275 | },
1276 | "node_modules/side-channel": {
1277 | "version": "1.0.4",
1278 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1279 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1280 | "dependencies": {
1281 | "call-bind": "^1.0.0",
1282 | "get-intrinsic": "^1.0.2",
1283 | "object-inspect": "^1.9.0"
1284 | },
1285 | "funding": {
1286 | "url": "https://github.com/sponsors/ljharb"
1287 | }
1288 | },
1289 | "node_modules/sift": {
1290 | "version": "16.0.1",
1291 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
1292 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
1293 | },
1294 | "node_modules/sparse-bitfield": {
1295 | "version": "3.0.3",
1296 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1297 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1298 | "dependencies": {
1299 | "memory-pager": "^1.0.2"
1300 | }
1301 | },
1302 | "node_modules/statuses": {
1303 | "version": "1.4.0",
1304 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1305 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
1306 | "engines": {
1307 | "node": ">= 0.6"
1308 | }
1309 | },
1310 | "node_modules/supports-color": {
1311 | "version": "7.2.0",
1312 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1313 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1314 | "dependencies": {
1315 | "has-flag": "^4.0.0"
1316 | },
1317 | "engines": {
1318 | "node": ">=8"
1319 | }
1320 | },
1321 | "node_modules/toidentifier": {
1322 | "version": "1.0.1",
1323 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1324 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1325 | "engines": {
1326 | "node": ">=0.6"
1327 | }
1328 | },
1329 | "node_modules/tr46": {
1330 | "version": "3.0.0",
1331 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1332 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1333 | "dependencies": {
1334 | "punycode": "^2.1.1"
1335 | },
1336 | "engines": {
1337 | "node": ">=12"
1338 | }
1339 | },
1340 | "node_modules/type-is": {
1341 | "version": "1.6.18",
1342 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1343 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1344 | "dependencies": {
1345 | "media-typer": "0.3.0",
1346 | "mime-types": "~2.1.24"
1347 | },
1348 | "engines": {
1349 | "node": ">= 0.6"
1350 | }
1351 | },
1352 | "node_modules/uid-safe": {
1353 | "version": "2.1.5",
1354 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
1355 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
1356 | "dependencies": {
1357 | "random-bytes": "~1.0.0"
1358 | },
1359 | "engines": {
1360 | "node": ">= 0.8"
1361 | }
1362 | },
1363 | "node_modules/undici-types": {
1364 | "version": "5.26.5",
1365 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
1366 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
1367 | },
1368 | "node_modules/unpipe": {
1369 | "version": "1.0.0",
1370 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1371 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1372 | "engines": {
1373 | "node": ">= 0.8"
1374 | }
1375 | },
1376 | "node_modules/utils-merge": {
1377 | "version": "1.0.1",
1378 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1379 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1380 | "engines": {
1381 | "node": ">= 0.4.0"
1382 | }
1383 | },
1384 | "node_modules/vary": {
1385 | "version": "1.1.2",
1386 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1387 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1388 | "engines": {
1389 | "node": ">= 0.8"
1390 | }
1391 | },
1392 | "node_modules/webidl-conversions": {
1393 | "version": "7.0.0",
1394 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1395 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1396 | "engines": {
1397 | "node": ">=12"
1398 | }
1399 | },
1400 | "node_modules/whatwg-url": {
1401 | "version": "11.0.0",
1402 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1403 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1404 | "dependencies": {
1405 | "tr46": "^3.0.0",
1406 | "webidl-conversions": "^7.0.0"
1407 | },
1408 | "engines": {
1409 | "node": ">=12"
1410 | }
1411 | }
1412 | }
1413 | }
1414 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "myapp",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "cookie-parser": "~1.4.4",
10 | "debug": "~2.6.9",
11 | "ejs": "^3.1.9",
12 | "express": "^4.18.2",
13 | "express-session": "^1.17.3",
14 | "http-errors": "~1.6.3",
15 | "mongoose": "^8.0.0",
16 | "morgan": "~1.9.1"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | a {
7 | color: #00B7FF;
8 | }
9 |
--------------------------------------------------------------------------------
/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 |
4 | // Importing mongodb setup code that is written in user.js
5 |
6 | const userModel = require("./users")
7 |
8 | /* GET home page. */
9 | router.get('/', function(req, res, next) {
10 |
11 | // Session code here
12 | req.session.anyExampleNameHere = 'exampleUserData'; // Storing user data in the session
13 |
14 |
15 | // Cookies code here
16 | res.cookie("nameHere", "valueHere")
17 |
18 | res.render('index');
19 | });
20 |
21 | // Read cookie
22 |
23 | router.get('/checkCookie', function(req, res){
24 | console.log(req.cookies)
25 | res.send("check console/terminal for cookie")
26 | })
27 |
28 | // delete cookie
29 |
30 | router.get('/deleteCookie', function(req, res){
31 | res.clearCookie("nameHere")
32 | res.send("cleared cookie")
33 | })
34 |
35 | // checking session
36 | router.get('/checkSession', function(req, res){
37 |
38 | if(req.session.anyExampleNameHere == "exampleUserData"){
39 | console.log(req.session)
40 | res.send("Session saved. see on your console/terminal")
41 | }
42 | else{
43 | res.send("Session data is not available or deleted")
44 | }
45 | })
46 |
47 | // Deleting session
48 | router.get("/removeSession", function(req, res){
49 | req.session.destroy(function(err){
50 | if(err) throw err;
51 | res.send("session deleted")
52 | })
53 | })
54 |
55 | // Creating model.
56 | router.get("/create", async function (req, res){
57 | const createdUser = await userModel.create({
58 | // these are schema details
59 | username: "aman",
60 | name: "aman kumar sinha",
61 | age: 20
62 | });
63 | res.send(createdUser);
64 | })
65 | // Note: all the things related to userModel is asynchronous nodejs function. So always write async and await
66 |
67 | // See data (READ data)
68 | router.get("/allUser", async function(req, res){
69 | let users = await userModel.find()
70 | res.send(users)
71 | })
72 |
73 | // DELETE Data
74 | router.get("/delete", async function(req, res){
75 | let deletedUser = await userModel.findOneAndDelete({
76 | username:"aman"
77 | })
78 | res.send(deletedUser)
79 | })
80 | // the above code will find user that username is aman and delete it and return its data to deletedUser variable
81 |
82 | module.exports = router;
--------------------------------------------------------------------------------
/routes/users.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose")
2 |
3 | // Connect to local host mongodb server
4 | mongoose.connect("mongodb://127.0.0.1:27017/amazonDB")
5 | // The above line create a database in mongodb named "amazonDB"
6 |
7 | const userSchema = mongoose.Schema({
8 | username: String,
9 | name: String,
10 | age: Number
11 | })
12 |
13 | module.exports = mongoose.model("userDB", userSchema)
--------------------------------------------------------------------------------
/views/error.ejs:
--------------------------------------------------------------------------------
1 | <%= message %>
2 | <%= error.status %>
3 | <%= error.stack %>
4 |
--------------------------------------------------------------------------------
/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | HOME PAGE
5 |
6 |
7 |
8 | Welcome to Home Page
9 |
10 |
11 |
--------------------------------------------------------------------------------