├── .env ├── .env.example ├── .github └── pull_request_template.md ├── .gitignore ├── .prettierignore ├── .prettierrc ├── LICENSE ├── README.md ├── app.js ├── client ├── .gitignore ├── package-lock.json ├── package.json ├── public │ ├── email.png │ ├── image.jpg │ ├── index.html │ ├── password.png │ └── person.png └── src │ ├── component │ ├── Landing , Sign up , Login page │ │ ├── Body.js │ │ └── Navbar.js │ ├── Profile page │ │ ├── App.js │ │ ├── profile.css │ │ └── profile.js │ └── Student Gate Pass Form │ │ ├── .gitkeep │ │ ├── App1.js │ │ ├── Newgatepass.js │ │ └── Newwgatepass.css │ ├── index.css │ ├── index.html │ ├── index.js │ ├── login.css │ └── login.jsx ├── designs.json ├── image └── Exit.svg ├── package-lock.json ├── package.json └── src ├── config └── db.config.js ├── controllers ├── admin.controller.js ├── auth.controller.js ├── guard.controller.js ├── student.controller.js ├── user.controller.js └── warden.controller.js ├── middlewares ├── admin.middleware.js ├── guard.middleware.js ├── student.middleware.js └── warden.middleware.js ├── models ├── form.model.js └── user.model.js ├── public └── .gitkeep ├── routes ├── admin.routes.js ├── auth.routes.js ├── form.routes.js ├── guard.routes.js ├── student.routes.js └── user.routes.js └── utils ├── password.js └── responseCodes.js /.env: -------------------------------------------------------------------------------- 1 | EMAIL=your-email@gmail.com 2 | PASS=your-app-password 3 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | PORT=4000 -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Issue: ISSUENUMBER 2 | 3 | 4 | 5 | 6 | #### Short description of what this resolves: 7 | 8 | #### Changes proposed in this pull request and/or Screenshots of changes: 9 | 10 | - 11 | - 12 | - 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | .env 4 | .env.example -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 2, 4 | "printWidth": 80, 5 | "endOfLine": "lf", 6 | "singleQuote": true, 7 | "trailingComma": "all", 8 | "arrowParens": "always" 9 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Oshankiii12 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # EasyExit (Girl's-Only-Repository) 3 | We welcome all the **female contibutors**!!! EasyExit is a full stack web development project which aims to simplify the process of issuing, approval and verification of GatePass for college students. 4 | 5 | ## What problem EasyExit solves? 6 | Experience campus convenience in style with EasyExit—where swift issue approval and gatepass verification meet effortlessly! 7 | EasyExit revolutionizes the entire experience by seamlessly simplifying the complex stages involved in the issuance, approval, and meticulous verification of Gate Passes, ensuring a swift and hassle-free process for college students. 8 | 9 | 10 | ## Tech Stack 11 | * Nodejs (v16.18.0) 12 | * ExpressJS 13 | * MongoDB 14 | * React.JS 15 | 16 | ## Design Template 17 | [Open Figma File ](https://www.figma.com/file/40sZkuDVFl2WAeVIOLhi8T/EasyExit-UI-Design?type=design&node-id=0%3A1&mode=design&t=mybCFAT2OKooqYUz-1) 18 | 19 | 20 | ## Dependencies 21 | You need npm/yarn installed in your local machine in order to run this app. 22 | 23 | ## Installation 24 | 25 | ### Frontend 26 | ```bash 27 | npm install 28 | npm run dev 29 | ``` 30 | ### Backend 31 | ```bash 32 | npm install 33 | npm start 34 | ``` 35 | 36 | ## How To Setup 37 | * Make sure your machine is having internet connection. 38 | * Fork the repository. 39 | * Open shell (which ever your OS support) on your PC. 40 | * Change drive to the location where you want your project to be copied. 41 | * Clone it to your local setup by using command git clone ``````. 42 | * Once cloned, Run the following command in the root directory of the project ```npm install```. 43 | * Make sure you have required enviornment variables saved in the ```.env``` file in the root of the project. 44 | * After the process is completed, run the command ```npm start``` for backend and ```npm start``` for frontend. 45 | * The website will be live on ```localhost:4000``` for backend and ```localhost:8080``` for frontend. 46 | 47 | 48 | ## Reference Links 49 | - [Download and install the latest version of Git.](https://git-scm.com/downloads) 50 | - [Set your username in Git.](https://help.github.com/articles/setting-your-username-in-git) 51 | - [Set your commit email address in Git.](https://help.github.com/articles/setting-your-commit-email-address-in-git) 52 | - [Setup Nodejs](https://nodejs.org/en/blog/release/v16.18.1/) 53 | - [Docs for passport-local](https://www.passportjs.org/packages/passport-local/) 54 | - [Docs for passport-jwt](http://www.passportjs.org/packages/passport-jwt/) 55 | 56 | ## Project Structure - Backend 57 | 58 | ``` 59 | / 60 | |-- src/ 61 | |-- config/ 62 | |-- db.config.js #Contains configuration for mongoDB NoSQL Database 63 | | 64 | |-- controllers/ 65 | |-- auth.controller.js #Contains http request controllers for user authentication 66 | |-- student.controller.js #Contains http request controllers for student methods 67 | |-- warden.controller.js #Contains http request controllers for warden methods 68 | |-- guard.controller.js #Contains http request controllers for guard methods 69 | | 70 | |-- middlewares/ 71 | |-- student.middleware.js #Contains student Authentication middleware 72 | |-- warden.middleware.js #Contains warden Authentication middleware 73 | |-- guard.middleware.js #Contains guard Authentication middleware 74 | | 75 | |-- models/ 76 | |-- user.model.js #Contains user model 77 | |-- form.model.js #Contains form model 78 | | 79 | |-- routes/ 80 | |-- user.routes.js #Contains all user routes 81 | |-- form.routes.js #Contains all form routes 82 | |-- public/ #Contains all the static files 83 | | 84 | |-- app.js 85 | 86 | ``` 87 | 88 | ## Models 89 | 90 | ### User Model 91 | 92 | - name: String 93 | - email : String 94 | - passwordHash: String 95 | - role: String 96 | 97 | ### Form Model 98 | 99 | - name: String 100 | - roll : String 101 | - sem: String 102 | - where: String 103 | - purpose: String 104 | - transport: String 105 | - outtime: String 106 | - data: String 107 | - ownResponsibility: Boolean 108 | - isUsed: Boolean 109 | - isAccepted: Boolean 110 | - otp: String 111 | - rejectReason: String 112 | 113 | 114 | 115 | ## Claim an issue 116 | Comment on the issue. In case of no activity on the issue even after 2 days, the issue will be reassigned. If you have difficulty approaching the issue, feel free to ask on our discord channel. 117 | ## Communication 118 | Whether you are working on a new feature or facing a doubt please feel free to ask us on our [discord](https://discord.gg/D9999YTkS8) channel. We will be happy to help you out. 119 | 120 | ## Guidelines 121 | Please help us follow the best practice to make it easy for the reviewer as well as the contributor. We want to focus on the code quality more than on managing pull request ethics. 122 | 123 | - People before code: If any of the following rules are violated, the pull-requests must not be rejected. This is to create an easy and joyful onboarding process for new programmers and first-time contributors. 124 | 125 | - Single commit per pull request and name the commit as something meaningful, example: Adding <-your-name-> in students/mentors section. 126 | 127 | - Reference the issue numbers in the commit message if it resolves an open issue. Follow the [PR Template](https://github.com/Oshankiii12/EasyExit/blob/main/.github/pull_request_template.md) Issue: < ISSUE NUMBER > 128 | 129 | - Provide the link to live gh-pages from your forked repository or relevant screenshot for easier review. 130 | 131 | - Pull Request older than 3 days with no response from the contributor shall be marked closed. 132 | 133 | - Do not make PR which is not related to any issues. You can create an issue and solve it once we approve them. 134 | 135 | - Avoid duplicate PRs, if need be comment on the older PR with the PR number of the follow-up (new PR) and close the obsolete PR yourself. 136 | 137 | - Be polite: Be polite to other community members. 138 | 139 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | // const dotenv = require('dotenv'); 2 | import dotenv from 'dotenv'; 3 | import express from 'express'; 4 | import cors from 'cors'; 5 | // const express = require('express'); 6 | // const cors = require('cors'); 7 | 8 | dotenv.config(); 9 | const port = process.env.PORT || 5000; 10 | const app = express(); 11 | 12 | app.use(express.json()); 13 | app.use(express.urlencoded({ extended: true })); 14 | app.use(cors()); 15 | 16 | import connDB from './src/config/db.config.js'; 17 | // import User from '../models/user.model.js'; 18 | // const connDB = require('./config/db.config.js'); 19 | connDB(); 20 | // conn 21 | // connDB(); 22 | // const authRoutes = require('authRoutes'); 23 | import authRoutes from './src/routes/auth.routes.js'; 24 | app.use('/', authRoutes); 25 | 26 | // const studentRoutes = require('studentRoutes'); 27 | import studentRoutes from './src/routes/student.routes.js'; 28 | app.use('/student', studentRoutes); 29 | 30 | // const adminRoutes = require('adminRoutes'); 31 | import adminRoutes from './src/routes/admin.routes.js'; 32 | app.use('/admin', adminRoutes); 33 | 34 | // const guardRoutes = require('guardRoutes'); 35 | import guardRoutes from './src/routes/guard.routes.js'; 36 | app.use('/guard', guardRoutes); 37 | 38 | 39 | app.get("/", (req, res) => { 40 | res.send("Hello World"); 41 | }); 42 | 43 | 44 | app.listen(port, () => { 45 | console.log(`🚀 Server is running on port ${port}!`); 46 | }); -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.17.0", 7 | "@testing-library/react": "^13.4.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "react": "^18.2.0", 10 | "react-dom": "^18.2.0", 11 | "react-router-dom": "^6.21.0", 12 | "react-scripts": "5.0.1", 13 | "web-vitals": "^2.1.4" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /client/public/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/client/public/email.png -------------------------------------------------------------------------------- /client/public/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/client/public/image.jpg -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /client/public/password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/client/public/password.png -------------------------------------------------------------------------------- /client/public/person.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/client/public/person.png -------------------------------------------------------------------------------- /client/src/component/Landing , Sign up , Login page/Body.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import '../../index.css' 3 | 4 | function Body(){ 5 | return( 6 |
7 |
8 |

Experience campus convenience in 9 | style with EasyExit—where swift issue, 10 | approval, and gatepass verification 11 | meet effortlessly!

12 | 13 |
14 | LOGIN 15 | SIGN UP 16 |
17 |
18 | 19 | exit-pic 20 |
21 | ) 22 | } 23 | 24 | export default Body -------------------------------------------------------------------------------- /client/src/component/Landing , Sign up , Login page/Navbar.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import '../../index.css' 3 | 4 | function Navbar(){ 5 | return( 6 |
7 | EASYEXIT 8 |
9 | ) 10 | } 11 | export default Navbar -------------------------------------------------------------------------------- /client/src/component/Profile page/App.js: -------------------------------------------------------------------------------- 1 | // App.js 2 | import React from 'react'; 3 | import profile from './profile'; 4 | 5 | function App () { 6 | return ( 7 |
8 | 9 |
10 | ); 11 | }; 12 | 13 | const root = ReactDOM.createRoot(document.getElementById("root")) 14 | root.render() 15 | 16 | 17 | // terminal Commands 18 | // npm init -y // if you haven't initialized your project with a package.json file 19 | // npm install react react-dom 20 | // npm start 21 | -------------------------------------------------------------------------------- /client/src/component/Profile page/profile.css: -------------------------------------------------------------------------------- 1 | /* profile.css */ 2 | 3 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;500;600&display=swap'); 4 | 5 | * { 6 | margin: 0; 7 | padding: 0; 8 | box-sizing: border-box; 9 | font-family: 'Poppins', sans-serif; 10 | } 11 | 12 | .body { 13 | height: 100vh; 14 | display: flex; 15 | justify-content: center; 16 | align-items: center; 17 | background-color: rgb(21, 23, 24); 18 | } 19 | .nav-links{ 20 | display: flex; 21 | align-items: center; 22 | background: #fff; 23 | padding: 20px 50px; 24 | border-radius: 12px; 25 | box-shadow: 0 5px 10px rgba(0,0,0,0.2); 26 | } 27 | 28 | .nav-links li{ 29 | list-style: none; 30 | margin: 0 12px; 31 | } 32 | .nav-links li a{ 33 | position: relative; 34 | color: #333; 35 | font-size: 20px; 36 | font-weight: 500; 37 | padding: 15px 0; 38 | text-decoration: none; 39 | } 40 | .nav-links li a:before{ 41 | content: ''; 42 | position: absolute; 43 | bottom: 0; 44 | left: 0; 45 | height: 3px; 46 | width: 0%; 47 | background: #34efdf; 48 | border-radius: 12px; 49 | transition: all 0.4s ease; 50 | } 51 | .nav-links li a:hover:before{ 52 | width: 100%; 53 | } 54 | .nav-links li.center a:before{ 55 | left: 50%; 56 | transform: translateX(-50%); 57 | } 58 | .nav-links li.upward a:before{ 59 | width: 100%; 60 | bottom: -5px; 61 | opacity: 0; 62 | } 63 | .nav-links li.upward a:hover:before{ 64 | bottom: 0px; 65 | opacity: 1; 66 | } 67 | .nav-links li.forward a:before{ 68 | width: 100%; 69 | transform: scaleX(0); 70 | transform-origin: right; 71 | transition: transform 0.4s ease; 72 | } 73 | .nav-links li.forward a:hover:before{ 74 | transform: scaleX(1); 75 | transform-origin: left; 76 | } 77 | .profile-card { 78 | display: flex; 79 | flex-direction: column; 80 | align-items: center; 81 | justify-content: center; 82 | max-width: 370px; 83 | width: 100%; 84 | background: #fff; 85 | border-radius: 24px; 86 | padding: 25px; 87 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); 88 | position: relative; 89 | margin: auto; /* Center horizontally */ 90 | top: 50%; /* Center vertically */ 91 | transform: translateY(50%); /* Adjust for vertical centering */ 92 | } 93 | 94 | .profile-card::before { 95 | content: ""; 96 | position: absolute; 97 | height: 36%; 98 | top: 0; 99 | left: 0; 100 | width: 100%; 101 | border-radius: 24px 24px 0 0; 102 | background-color: #8968FF; 103 | } 104 | 105 | .image { 106 | position: relative; 107 | height: 130px; 108 | width: 130px; 109 | border-radius: 50%; 110 | background-color: #cdc2f4; 111 | padding: 3px; 112 | overflow: hidden; 113 | margin-bottom: 10px; 114 | } 115 | 116 | .image .profle-img { 117 | height: 100%; 118 | width: 100%; 119 | object-fit: cover; 120 | border-radius: 50%; 121 | border: 3px solid #fff; 122 | } 123 | 124 | .profile-card .text-data { 125 | display: flex; 126 | flex-direction: column; 127 | align-items: center; 128 | } 129 | 130 | .text-data .name { 131 | font-size: 22px; 132 | font-weight: 500; 133 | } 134 | .name-text { 135 | color: #8968FF; 136 | font-size: 22px; 137 | font-weight: bold; 138 | } 139 | .text-data .email { 140 | padding-top: 8px; 141 | font-size: 15px; 142 | font-weight: 400; 143 | } 144 | 145 | .text-data .prof { 146 | padding-top: 15px; 147 | font-size: 18px; 148 | font-weight: 400; 149 | /* color: #8968FF; */ 150 | } 151 | 152 | .profile-card .media-button { 153 | display: flex; 154 | align-items: center; 155 | } 156 | 157 | .media-button .links { 158 | background-color: #4070f4; 159 | } 160 | -------------------------------------------------------------------------------- /client/src/component/Profile page/profile.js: -------------------------------------------------------------------------------- 1 | // Profile.js 2 | import React from 'react'; 3 | import './Profile.css'; 4 | 5 | const Profile = () => { 6 | return ( 7 |
8 | 14 | 15 |
16 |
17 | {/* add profile image */} 18 |
19 | 20 |
21 | Name:Shrutika 22 | Email id:Shrutikarathi6 23 | Logged in as:Student 24 |
25 |
26 |
27 | ); 28 | }; 29 | 30 | export default Profile; 31 | -------------------------------------------------------------------------------- /client/src/component/Student Gate Pass Form/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /client/src/component/Student Gate Pass Form/App1.js: -------------------------------------------------------------------------------- 1 | // src/App1.js 2 | 3 | import React from 'react'; 4 | import NewGatePass from './Newwgatepass'; 5 | 6 | function App1() { 7 | return ( 8 |
9 | 10 |
11 | ); 12 | } 13 | 14 | // export default App; 15 | const root = ReactDOM.createRoot(document.getElementById("root")) 16 | root.render() 17 | -------------------------------------------------------------------------------- /client/src/component/Student Gate Pass Form/Newgatepass.js: -------------------------------------------------------------------------------- 1 | // NewGatePass.js 2 | 3 | import React, { useEffect } from 'react'; 4 | import './Newwgatepass.css'; 5 | 6 | const Newgatepass = () => { 7 | useEffect(() => { 8 | const contLabels = document.querySelectorAll('.cont-label'); 9 | 10 | contLabels.forEach((label) => { 11 | label.addEventListener('click', () => { 12 | contLabels.forEach((otherLabel) => { 13 | otherLabel.classList.remove('active'); 14 | }); 15 | 16 | label.classList.add('active'); 17 | }); 18 | }); 19 | 20 | return () => { 21 | contLabels.forEach((label) => { 22 | label.removeEventListener('click', () => { 23 | // Clean up event listeners when the component unmounts 24 | }); 25 | }); 26 | }; 27 | }, []); 28 | 29 | return ( 30 |
31 |
32 |
33 |

34 | EasyExit 35 |

36 |
37 |
Profile Icon
38 |
39 |
40 | 43 | 46 | 49 |
50 |
51 |
52 |

Outpass Form

53 |
54 |
55 | 58 | 59 |
60 |
61 | 64 | 65 |
66 | 67 | {/* Add other form fields */} 68 | 69 |
70 | 73 | 74 | 75 | 78 | 79 |
80 | 81 |
82 | 83 |
84 |
85 | 86 | 87 |
88 |
89 | 90 | 91 |
92 |
93 |
94 | 95 | 98 |
99 |
100 |
101 |
102 | ); 103 | }; 104 | 105 | export default Newgatepass; 106 | -------------------------------------------------------------------------------- /client/src/component/Student Gate Pass Form/Newwgatepass.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Poppins', sans-serif; 3 | background-color: #f0f0f0; 4 | margin: 0; 5 | padding: 0; 6 | } 7 | 8 | .navbar { 9 | background-color: #fff; 10 | box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); 11 | border-radius: 5px; 12 | position: sticky; 13 | top: 0; 14 | z-index: 1000; 15 | display: flex; 16 | justify-content: space-between; 17 | align-items: center; 18 | padding: 10px 20px; 19 | } 20 | 21 | 22 | 23 | .logo h3 { 24 | margin: 0; 25 | } 26 | 27 | .cont-label.active { 28 | font-weight: bold; 29 | text-decoration: underline; 30 | text-decoration-color: #8968FF; /* Purple color for the underline */ 31 | } 32 | .form-container { 33 | background-color: #e6e6e6; 34 | padding-top: 20px; 35 | } 36 | .container1{ 37 | display: flex; 38 | background-color:#e6e6e6 ; 39 | flex-direction: row; 40 | justify-content: center; 41 | align-items: center; 42 | } 43 | .cont-label{ 44 | color: black; 45 | 46 | font-size: 22px; 47 | font-weight: 400; 48 | padding-left: 40px; 49 | padding-right: 40px; 50 | margin-top: 20px; 51 | } 52 | .container { 53 | background-color: #fff; 54 | padding: 30px; 55 | border-radius: 10px; 56 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); 57 | margin: 0 auto; 58 | max-width: 600px; 59 | } 60 | 61 | .heading { 62 | color: #8968FF; /* Purple color for the form heading */ 63 | text-align: center; 64 | font-size: 28px; /* Increased font size for the heading */ 65 | } 66 | 67 | .form-group { 68 | display: flex; 69 | flex-direction: row; 70 | justify-content: space-between; 71 | align-items: center; 72 | gap: 10px; 73 | margin-top: 15px; 74 | } 75 | 76 | .form-label { 77 | font-size: 20px; 78 | color: #8968FF; /* Purple color for the form label */ 79 | } 80 | 81 | .form-input { 82 | width: 70%; 83 | padding: 8px; 84 | box-sizing: border-box; 85 | background-color: #f9f9f9; /* Light gray background for the input box */ 86 | border: 1px solid #ccc; 87 | border-radius: 5px; 88 | } 89 | 90 | button { 91 | background-color: #8968FF; 92 | color: #fff; 93 | padding: 10px 15px; 94 | border: none; 95 | border-radius: 5px; 96 | cursor: pointer; 97 | font-size: 16px; 98 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); 99 | /* margin-left: 15vw; */ 100 | margin-top: 20px; 101 | } 102 | 103 | button:hover { 104 | background-color: #5e45b1; 105 | } 106 | .responsibility-group { 107 | display: flex; 108 | justify-content: space-between; 109 | margin-left: 20px; 110 | } 111 | 112 | .responsibility-option { 113 | /* flex: 1; 114 | */ 115 | margin-left: 20px; 116 | } 117 | 118 | 119 | .submit-button { 120 | display: block; 121 | margin: auto; 122 | } 123 | 124 | .responsibility-option input { 125 | margin-right: 5px; 126 | } 127 | -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0; 3 | padding: 0; 4 | } 5 | body { 6 | height: 100vh; 7 | padding-left: 20px; 8 | } 9 | 10 | #companyName { 11 | font-size: 30px; 12 | margin-bottom: 20px; 13 | color: black; 14 | font-weight: bold; 15 | 16 | } 17 | #companyName2 { 18 | font-size: 30px; 19 | margin-bottom: 20px; 20 | font-weight: bold; 21 | color: rgb(165, 68, 230); 22 | } 23 | 24 | 25 | #companyDescription { 26 | display: inline-block; 27 | padding: 20px; 28 | margin-top: 200px; 29 | margin-left: 50px; 30 | width: 534px; 31 | height: 156px; 32 | font-size: 26px; 33 | } 34 | 35 | 36 | #abs { 37 | font-family: 'Inter', sans-serif; 38 | font-family: 'Poppins', sans-serif; 39 | margin-top: 50px; 40 | margin-left: 20px; 41 | display: flex; 42 | 43 | } 44 | 45 | .button-container { 46 | display: flex; 47 | gap: 10px; 48 | margin-top: 0px; 49 | margin-left: 35px ; 50 | } 51 | 52 | .button { 53 | padding: 12px 24px; 54 | font-size: 1.2em; 55 | cursor: pointer; 56 | border-radius: 5px; 57 | color: black; 58 | text-decoration: none; 59 | text-align: center; 60 | transition: background-color 0.3s ease; 61 | } 62 | 63 | #loginButton { 64 | background-color: rgb(165, 68, 230); 65 | margin-left: 32px; 66 | color: white; 67 | } 68 | 69 | #signupButton { 70 | border: solid rgb(165, 68, 230) 3px; 71 | background-color: white; 72 | color: rgb(165, 68, 230); 73 | 74 | } 75 | .exit-pic{ 76 | width: 630px; 77 | height: 500px; 78 | } 79 | .content{ 80 | height: 70vh; 81 | display: flex; 82 | flex-direction: row; 83 | justify-content: space-around; 84 | align-items: center; 85 | } -------------------------------------------------------------------------------- /client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | EasyExit 10 | 11 | 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import Navbar from "./component/Landing , Sign up , Login page/Navbar" 5 | import Body from './component/Landing , Sign up , Login page/Body'; 6 | 7 | function App(){ 8 | return( 9 |
10 | 11 | 12 |
13 | ) 14 | } 15 | 16 | const root = ReactDOM.createRoot(document.getElementById("root")) 17 | root.render() 18 | 19 | -------------------------------------------------------------------------------- /client/src/login.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .container { 4 | display: flex; 5 | flex-direction: column; 6 | margin: auto; 7 | margin-top: 100px; /* Reduced margin-top */ 8 | background: #fff; 9 | padding-bottom: 20px; /* Reduced padding-bottom */ 10 | } 11 | 12 | .header { 13 | display: flex; 14 | flex-direction: column; 15 | align-items: center; 16 | gap: 6px; /* Reduced gap */ 17 | width: 100%; 18 | margin-top: 20px; /* Reduced margin-top */ 19 | } 20 | 21 | .text { 22 | color: #3c009d; 23 | font-size: 36px; /* Reduced font size */ 24 | font-weight: 700; 25 | } 26 | 27 | .underline { 28 | width: 41px; /* Reduced width */ 29 | height: 5px; /* Reduced height */ 30 | background: #3c009d; 31 | border-radius: 7px; /* Reduced border-radius */ 32 | } 33 | 34 | .inputs { 35 | margin-top: 40px; /* Reduced margin-top */ 36 | display: flex; 37 | flex-direction: column; 38 | gap: 20px; /* Reduced gap */ 39 | } 40 | 41 | .input { 42 | display: flex; 43 | align-items: center; 44 | margin: auto; 45 | width: 400px; /* Reduced width */ 46 | height: 60px; /* Reduced height */ 47 | background: #eaeaea; 48 | border-radius: 5px; /* Reduced border-radius */ 49 | } 50 | 51 | .input img { 52 | margin: 0px 20px; /* Reduced margin */ 53 | } 54 | 55 | .input input { 56 | height: 40px; /* Reduced height */ 57 | width: 300px; /* Reduced width */ 58 | background: transparent; 59 | border: none; 60 | outline: none; 61 | color: #797979; 62 | font-size: 16px; /* Reduced font size */ 63 | } 64 | 65 | .forgot-password { 66 | padding-left: 42px; /* Reduced padding-left */ 67 | margin-top: 18px; /* Reduced margin-top */ 68 | color: #797979; 69 | font-size: 16px; /* Reduced font size */ 70 | } 71 | 72 | .forgot-password span { 73 | color: #4c00b4; 74 | cursor: pointer; 75 | } 76 | 77 | .submit-container { 78 | display: flex; 79 | gap: 20px; /* Reduced gap */ 80 | margin: 40px auto; /* Reduced margin */ 81 | } 82 | 83 | .submit { 84 | display: flex; 85 | justify-content: center; 86 | align-items: center; 87 | width: 180px; /* Reduced width */ 88 | height: 49px; /* Reduced height */ 89 | color: #fff; 90 | background: #4c00b4; 91 | border-radius: 40px; /* Adjusted border-radius */ 92 | font-size: 16px; /* Reduced font size */ 93 | font-weight: 700; 94 | cursor: pointer; 95 | } 96 | .gray{ 97 | background-color: #eaeaea; 98 | color: #676767; 99 | } -------------------------------------------------------------------------------- /client/src/login.jsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import './login.css' 3 | 4 | const LoginSignup = () => { 5 | const [action, setAction] = useState("Login"); 6 | 7 | return ( 8 |
9 |
10 |
{action}
11 |
12 |
13 |
14 | {action === "Login" ? ( 15 | <> 16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 | 25 | ) : ( 26 | <> 27 |
28 | 29 | 30 |
31 |
32 | 33 | 34 |
35 |
36 | 37 | 38 |
39 | 40 | )} 41 |
42 | {/*
Lost Password?click here
*/} 43 |
44 |
{setAction('Sign Up')}}>Sign Up
45 |
{setAction('Login')}}>Login
46 |
47 |
48 | ); 49 | }; 50 | 51 | export default LoginSignup; 52 | 53 | -------------------------------------------------------------------------------- /designs.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | github: "riri-2k3" 4 | figma : "https://www.figma.com/file/DdBbtKg9O5ZIluvIT1GYDD/Easy-Exit?type=design&node-id=0%3A1&mode=design&t=QPTmGIpzoigMXPqw-1"} 5 | } 6 | ] 7 | 8 | 9 | -------------------------------------------------------------------------------- /image/Exit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 292 | 293 | 294 | 297 | 298 | 299 | 300 | 301 | 304 | 305 | 306 | 307 | 308 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 789 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1003 | 1004 | 1005 | 1008 | 1009 | 1010 | 1011 | 1012 | 1014 | 1015 | 1016 | 1019 | 1020 | 1021 | 1022 | 1023 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "easy-exit", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "easy-exit", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.20.2", 13 | "cookie-parser": "^1.4.6", 14 | "cors": "^2.8.5", 15 | "dotenv": "^16.3.1", 16 | "express": "^4.18.2", 17 | "jsonwebtoken": "^9.0.2", 18 | "mongoose": "^8.0.3", 19 | "nodemailer": "^6.9.7", 20 | "validator": "^13.11.0" 21 | }, 22 | "devDependencies": { 23 | "nodemon": "^3.0.2", 24 | "prettier": "^3.1.1" 25 | } 26 | }, 27 | "node_modules/@mongodb-js/saslprep": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", 30 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", 31 | "dependencies": { 32 | "sparse-bitfield": "^3.0.3" 33 | } 34 | }, 35 | "node_modules/@types/node": { 36 | "version": "20.10.4", 37 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", 38 | "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", 39 | "dependencies": { 40 | "undici-types": "~5.26.4" 41 | } 42 | }, 43 | "node_modules/@types/webidl-conversions": { 44 | "version": "7.0.3", 45 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 46 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 47 | }, 48 | "node_modules/@types/whatwg-url": { 49 | "version": "8.2.2", 50 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", 51 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", 52 | "dependencies": { 53 | "@types/node": "*", 54 | "@types/webidl-conversions": "*" 55 | } 56 | }, 57 | "node_modules/abbrev": { 58 | "version": "1.1.1", 59 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 60 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 61 | "dev": true 62 | }, 63 | "node_modules/accepts": { 64 | "version": "1.3.8", 65 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 66 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 67 | "dependencies": { 68 | "mime-types": "~2.1.34", 69 | "negotiator": "0.6.3" 70 | }, 71 | "engines": { 72 | "node": ">= 0.6" 73 | } 74 | }, 75 | "node_modules/anymatch": { 76 | "version": "3.1.3", 77 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 78 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 79 | "dev": true, 80 | "dependencies": { 81 | "normalize-path": "^3.0.0", 82 | "picomatch": "^2.0.4" 83 | }, 84 | "engines": { 85 | "node": ">= 8" 86 | } 87 | }, 88 | "node_modules/array-flatten": { 89 | "version": "1.1.1", 90 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 91 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 92 | }, 93 | "node_modules/balanced-match": { 94 | "version": "1.0.2", 95 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 96 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 97 | "dev": true 98 | }, 99 | "node_modules/binary-extensions": { 100 | "version": "2.2.0", 101 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 102 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 103 | "dev": true, 104 | "engines": { 105 | "node": ">=8" 106 | } 107 | }, 108 | "node_modules/body-parser": { 109 | "version": "1.20.2", 110 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 111 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 112 | "dependencies": { 113 | "bytes": "3.1.2", 114 | "content-type": "~1.0.5", 115 | "debug": "2.6.9", 116 | "depd": "2.0.0", 117 | "destroy": "1.2.0", 118 | "http-errors": "2.0.0", 119 | "iconv-lite": "0.4.24", 120 | "on-finished": "2.4.1", 121 | "qs": "6.11.0", 122 | "raw-body": "2.5.2", 123 | "type-is": "~1.6.18", 124 | "unpipe": "1.0.0" 125 | }, 126 | "engines": { 127 | "node": ">= 0.8", 128 | "npm": "1.2.8000 || >= 1.4.16" 129 | } 130 | }, 131 | "node_modules/brace-expansion": { 132 | "version": "1.1.11", 133 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 134 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 135 | "dev": true, 136 | "dependencies": { 137 | "balanced-match": "^1.0.0", 138 | "concat-map": "0.0.1" 139 | } 140 | }, 141 | "node_modules/braces": { 142 | "version": "3.0.2", 143 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 144 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 145 | "dev": true, 146 | "dependencies": { 147 | "fill-range": "^7.0.1" 148 | }, 149 | "engines": { 150 | "node": ">=8" 151 | } 152 | }, 153 | "node_modules/bson": { 154 | "version": "6.2.0", 155 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", 156 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", 157 | "engines": { 158 | "node": ">=16.20.1" 159 | } 160 | }, 161 | "node_modules/buffer-equal-constant-time": { 162 | "version": "1.0.1", 163 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 164 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 165 | }, 166 | "node_modules/bytes": { 167 | "version": "3.1.2", 168 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 169 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 170 | "engines": { 171 | "node": ">= 0.8" 172 | } 173 | }, 174 | "node_modules/call-bind": { 175 | "version": "1.0.5", 176 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 177 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 178 | "dependencies": { 179 | "function-bind": "^1.1.2", 180 | "get-intrinsic": "^1.2.1", 181 | "set-function-length": "^1.1.1" 182 | }, 183 | "funding": { 184 | "url": "https://github.com/sponsors/ljharb" 185 | } 186 | }, 187 | "node_modules/chokidar": { 188 | "version": "3.5.3", 189 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 190 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 191 | "dev": true, 192 | "funding": [ 193 | { 194 | "type": "individual", 195 | "url": "https://paulmillr.com/funding/" 196 | } 197 | ], 198 | "dependencies": { 199 | "anymatch": "~3.1.2", 200 | "braces": "~3.0.2", 201 | "glob-parent": "~5.1.2", 202 | "is-binary-path": "~2.1.0", 203 | "is-glob": "~4.0.1", 204 | "normalize-path": "~3.0.0", 205 | "readdirp": "~3.6.0" 206 | }, 207 | "engines": { 208 | "node": ">= 8.10.0" 209 | }, 210 | "optionalDependencies": { 211 | "fsevents": "~2.3.2" 212 | } 213 | }, 214 | "node_modules/concat-map": { 215 | "version": "0.0.1", 216 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 217 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 218 | "dev": true 219 | }, 220 | "node_modules/content-disposition": { 221 | "version": "0.5.4", 222 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 223 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 224 | "dependencies": { 225 | "safe-buffer": "5.2.1" 226 | }, 227 | "engines": { 228 | "node": ">= 0.6" 229 | } 230 | }, 231 | "node_modules/content-type": { 232 | "version": "1.0.5", 233 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 234 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 235 | "engines": { 236 | "node": ">= 0.6" 237 | } 238 | }, 239 | "node_modules/cookie": { 240 | "version": "0.5.0", 241 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 242 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 243 | "engines": { 244 | "node": ">= 0.6" 245 | } 246 | }, 247 | "node_modules/cookie-parser": { 248 | "version": "1.4.6", 249 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 250 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 251 | "dependencies": { 252 | "cookie": "0.4.1", 253 | "cookie-signature": "1.0.6" 254 | }, 255 | "engines": { 256 | "node": ">= 0.8.0" 257 | } 258 | }, 259 | "node_modules/cookie-parser/node_modules/cookie": { 260 | "version": "0.4.1", 261 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 262 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 263 | "engines": { 264 | "node": ">= 0.6" 265 | } 266 | }, 267 | "node_modules/cookie-signature": { 268 | "version": "1.0.6", 269 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 270 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 271 | }, 272 | "node_modules/cors": { 273 | "version": "2.8.5", 274 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 275 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 276 | "dependencies": { 277 | "object-assign": "^4", 278 | "vary": "^1" 279 | }, 280 | "engines": { 281 | "node": ">= 0.10" 282 | } 283 | }, 284 | "node_modules/debug": { 285 | "version": "2.6.9", 286 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 287 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 288 | "dependencies": { 289 | "ms": "2.0.0" 290 | } 291 | }, 292 | "node_modules/define-data-property": { 293 | "version": "1.1.1", 294 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 295 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 296 | "dependencies": { 297 | "get-intrinsic": "^1.2.1", 298 | "gopd": "^1.0.1", 299 | "has-property-descriptors": "^1.0.0" 300 | }, 301 | "engines": { 302 | "node": ">= 0.4" 303 | } 304 | }, 305 | "node_modules/depd": { 306 | "version": "2.0.0", 307 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 308 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 309 | "engines": { 310 | "node": ">= 0.8" 311 | } 312 | }, 313 | "node_modules/destroy": { 314 | "version": "1.2.0", 315 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 316 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 317 | "engines": { 318 | "node": ">= 0.8", 319 | "npm": "1.2.8000 || >= 1.4.16" 320 | } 321 | }, 322 | "node_modules/dotenv": { 323 | "version": "16.3.1", 324 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 325 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", 326 | "engines": { 327 | "node": ">=12" 328 | }, 329 | "funding": { 330 | "url": "https://github.com/motdotla/dotenv?sponsor=1" 331 | } 332 | }, 333 | "node_modules/ecdsa-sig-formatter": { 334 | "version": "1.0.11", 335 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 336 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 337 | "dependencies": { 338 | "safe-buffer": "^5.0.1" 339 | } 340 | }, 341 | "node_modules/ee-first": { 342 | "version": "1.1.1", 343 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 344 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 345 | }, 346 | "node_modules/encodeurl": { 347 | "version": "1.0.2", 348 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 349 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 350 | "engines": { 351 | "node": ">= 0.8" 352 | } 353 | }, 354 | "node_modules/escape-html": { 355 | "version": "1.0.3", 356 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 357 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 358 | }, 359 | "node_modules/etag": { 360 | "version": "1.8.1", 361 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 362 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 363 | "engines": { 364 | "node": ">= 0.6" 365 | } 366 | }, 367 | "node_modules/express": { 368 | "version": "4.18.2", 369 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 370 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 371 | "dependencies": { 372 | "accepts": "~1.3.8", 373 | "array-flatten": "1.1.1", 374 | "body-parser": "1.20.1", 375 | "content-disposition": "0.5.4", 376 | "content-type": "~1.0.4", 377 | "cookie": "0.5.0", 378 | "cookie-signature": "1.0.6", 379 | "debug": "2.6.9", 380 | "depd": "2.0.0", 381 | "encodeurl": "~1.0.2", 382 | "escape-html": "~1.0.3", 383 | "etag": "~1.8.1", 384 | "finalhandler": "1.2.0", 385 | "fresh": "0.5.2", 386 | "http-errors": "2.0.0", 387 | "merge-descriptors": "1.0.1", 388 | "methods": "~1.1.2", 389 | "on-finished": "2.4.1", 390 | "parseurl": "~1.3.3", 391 | "path-to-regexp": "0.1.7", 392 | "proxy-addr": "~2.0.7", 393 | "qs": "6.11.0", 394 | "range-parser": "~1.2.1", 395 | "safe-buffer": "5.2.1", 396 | "send": "0.18.0", 397 | "serve-static": "1.15.0", 398 | "setprototypeof": "1.2.0", 399 | "statuses": "2.0.1", 400 | "type-is": "~1.6.18", 401 | "utils-merge": "1.0.1", 402 | "vary": "~1.1.2" 403 | }, 404 | "engines": { 405 | "node": ">= 0.10.0" 406 | } 407 | }, 408 | "node_modules/express/node_modules/body-parser": { 409 | "version": "1.20.1", 410 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 411 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 412 | "dependencies": { 413 | "bytes": "3.1.2", 414 | "content-type": "~1.0.4", 415 | "debug": "2.6.9", 416 | "depd": "2.0.0", 417 | "destroy": "1.2.0", 418 | "http-errors": "2.0.0", 419 | "iconv-lite": "0.4.24", 420 | "on-finished": "2.4.1", 421 | "qs": "6.11.0", 422 | "raw-body": "2.5.1", 423 | "type-is": "~1.6.18", 424 | "unpipe": "1.0.0" 425 | }, 426 | "engines": { 427 | "node": ">= 0.8", 428 | "npm": "1.2.8000 || >= 1.4.16" 429 | } 430 | }, 431 | "node_modules/express/node_modules/raw-body": { 432 | "version": "2.5.1", 433 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 434 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 435 | "dependencies": { 436 | "bytes": "3.1.2", 437 | "http-errors": "2.0.0", 438 | "iconv-lite": "0.4.24", 439 | "unpipe": "1.0.0" 440 | }, 441 | "engines": { 442 | "node": ">= 0.8" 443 | } 444 | }, 445 | "node_modules/fill-range": { 446 | "version": "7.0.1", 447 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 448 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 449 | "dev": true, 450 | "dependencies": { 451 | "to-regex-range": "^5.0.1" 452 | }, 453 | "engines": { 454 | "node": ">=8" 455 | } 456 | }, 457 | "node_modules/finalhandler": { 458 | "version": "1.2.0", 459 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 460 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 461 | "dependencies": { 462 | "debug": "2.6.9", 463 | "encodeurl": "~1.0.2", 464 | "escape-html": "~1.0.3", 465 | "on-finished": "2.4.1", 466 | "parseurl": "~1.3.3", 467 | "statuses": "2.0.1", 468 | "unpipe": "~1.0.0" 469 | }, 470 | "engines": { 471 | "node": ">= 0.8" 472 | } 473 | }, 474 | "node_modules/forwarded": { 475 | "version": "0.2.0", 476 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 477 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 478 | "engines": { 479 | "node": ">= 0.6" 480 | } 481 | }, 482 | "node_modules/fresh": { 483 | "version": "0.5.2", 484 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 485 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 486 | "engines": { 487 | "node": ">= 0.6" 488 | } 489 | }, 490 | "node_modules/fsevents": { 491 | "version": "2.3.3", 492 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 493 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 494 | "dev": true, 495 | "hasInstallScript": true, 496 | "optional": true, 497 | "os": [ 498 | "darwin" 499 | ], 500 | "engines": { 501 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 502 | } 503 | }, 504 | "node_modules/function-bind": { 505 | "version": "1.1.2", 506 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 507 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 508 | "funding": { 509 | "url": "https://github.com/sponsors/ljharb" 510 | } 511 | }, 512 | "node_modules/get-intrinsic": { 513 | "version": "1.2.2", 514 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 515 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 516 | "dependencies": { 517 | "function-bind": "^1.1.2", 518 | "has-proto": "^1.0.1", 519 | "has-symbols": "^1.0.3", 520 | "hasown": "^2.0.0" 521 | }, 522 | "funding": { 523 | "url": "https://github.com/sponsors/ljharb" 524 | } 525 | }, 526 | "node_modules/glob-parent": { 527 | "version": "5.1.2", 528 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 529 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 530 | "dev": true, 531 | "dependencies": { 532 | "is-glob": "^4.0.1" 533 | }, 534 | "engines": { 535 | "node": ">= 6" 536 | } 537 | }, 538 | "node_modules/gopd": { 539 | "version": "1.0.1", 540 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 541 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 542 | "dependencies": { 543 | "get-intrinsic": "^1.1.3" 544 | }, 545 | "funding": { 546 | "url": "https://github.com/sponsors/ljharb" 547 | } 548 | }, 549 | "node_modules/has-flag": { 550 | "version": "3.0.0", 551 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 552 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 553 | "dev": true, 554 | "engines": { 555 | "node": ">=4" 556 | } 557 | }, 558 | "node_modules/has-property-descriptors": { 559 | "version": "1.0.1", 560 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 561 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 562 | "dependencies": { 563 | "get-intrinsic": "^1.2.2" 564 | }, 565 | "funding": { 566 | "url": "https://github.com/sponsors/ljharb" 567 | } 568 | }, 569 | "node_modules/has-proto": { 570 | "version": "1.0.1", 571 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 572 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 573 | "engines": { 574 | "node": ">= 0.4" 575 | }, 576 | "funding": { 577 | "url": "https://github.com/sponsors/ljharb" 578 | } 579 | }, 580 | "node_modules/has-symbols": { 581 | "version": "1.0.3", 582 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 583 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 584 | "engines": { 585 | "node": ">= 0.4" 586 | }, 587 | "funding": { 588 | "url": "https://github.com/sponsors/ljharb" 589 | } 590 | }, 591 | "node_modules/hasown": { 592 | "version": "2.0.0", 593 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 594 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 595 | "dependencies": { 596 | "function-bind": "^1.1.2" 597 | }, 598 | "engines": { 599 | "node": ">= 0.4" 600 | } 601 | }, 602 | "node_modules/http-errors": { 603 | "version": "2.0.0", 604 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 605 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 606 | "dependencies": { 607 | "depd": "2.0.0", 608 | "inherits": "2.0.4", 609 | "setprototypeof": "1.2.0", 610 | "statuses": "2.0.1", 611 | "toidentifier": "1.0.1" 612 | }, 613 | "engines": { 614 | "node": ">= 0.8" 615 | } 616 | }, 617 | "node_modules/iconv-lite": { 618 | "version": "0.4.24", 619 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 620 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 621 | "dependencies": { 622 | "safer-buffer": ">= 2.1.2 < 3" 623 | }, 624 | "engines": { 625 | "node": ">=0.10.0" 626 | } 627 | }, 628 | "node_modules/ignore-by-default": { 629 | "version": "1.0.1", 630 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 631 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 632 | "dev": true 633 | }, 634 | "node_modules/inherits": { 635 | "version": "2.0.4", 636 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 637 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 638 | }, 639 | "node_modules/ipaddr.js": { 640 | "version": "1.9.1", 641 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 642 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 643 | "engines": { 644 | "node": ">= 0.10" 645 | } 646 | }, 647 | "node_modules/is-binary-path": { 648 | "version": "2.1.0", 649 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 650 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 651 | "dev": true, 652 | "dependencies": { 653 | "binary-extensions": "^2.0.0" 654 | }, 655 | "engines": { 656 | "node": ">=8" 657 | } 658 | }, 659 | "node_modules/is-extglob": { 660 | "version": "2.1.1", 661 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 662 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 663 | "dev": true, 664 | "engines": { 665 | "node": ">=0.10.0" 666 | } 667 | }, 668 | "node_modules/is-glob": { 669 | "version": "4.0.3", 670 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 671 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 672 | "dev": true, 673 | "dependencies": { 674 | "is-extglob": "^2.1.1" 675 | }, 676 | "engines": { 677 | "node": ">=0.10.0" 678 | } 679 | }, 680 | "node_modules/is-number": { 681 | "version": "7.0.0", 682 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 683 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 684 | "dev": true, 685 | "engines": { 686 | "node": ">=0.12.0" 687 | } 688 | }, 689 | "node_modules/jsonwebtoken": { 690 | "version": "9.0.2", 691 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 692 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 693 | "dependencies": { 694 | "jws": "^3.2.2", 695 | "lodash.includes": "^4.3.0", 696 | "lodash.isboolean": "^3.0.3", 697 | "lodash.isinteger": "^4.0.4", 698 | "lodash.isnumber": "^3.0.3", 699 | "lodash.isplainobject": "^4.0.6", 700 | "lodash.isstring": "^4.0.1", 701 | "lodash.once": "^4.0.0", 702 | "ms": "^2.1.1", 703 | "semver": "^7.5.4" 704 | }, 705 | "engines": { 706 | "node": ">=12", 707 | "npm": ">=6" 708 | } 709 | }, 710 | "node_modules/jsonwebtoken/node_modules/ms": { 711 | "version": "2.1.3", 712 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 713 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 714 | }, 715 | "node_modules/jwa": { 716 | "version": "1.4.1", 717 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 718 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 719 | "dependencies": { 720 | "buffer-equal-constant-time": "1.0.1", 721 | "ecdsa-sig-formatter": "1.0.11", 722 | "safe-buffer": "^5.0.1" 723 | } 724 | }, 725 | "node_modules/jws": { 726 | "version": "3.2.2", 727 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 728 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 729 | "dependencies": { 730 | "jwa": "^1.4.1", 731 | "safe-buffer": "^5.0.1" 732 | } 733 | }, 734 | "node_modules/kareem": { 735 | "version": "2.5.1", 736 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 737 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", 738 | "engines": { 739 | "node": ">=12.0.0" 740 | } 741 | }, 742 | "node_modules/lodash.includes": { 743 | "version": "4.3.0", 744 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 745 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 746 | }, 747 | "node_modules/lodash.isboolean": { 748 | "version": "3.0.3", 749 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 750 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 751 | }, 752 | "node_modules/lodash.isinteger": { 753 | "version": "4.0.4", 754 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 755 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 756 | }, 757 | "node_modules/lodash.isnumber": { 758 | "version": "3.0.3", 759 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 760 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 761 | }, 762 | "node_modules/lodash.isplainobject": { 763 | "version": "4.0.6", 764 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 765 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 766 | }, 767 | "node_modules/lodash.isstring": { 768 | "version": "4.0.1", 769 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 770 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 771 | }, 772 | "node_modules/lodash.once": { 773 | "version": "4.1.1", 774 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 775 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 776 | }, 777 | "node_modules/lru-cache": { 778 | "version": "6.0.0", 779 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 780 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 781 | "dependencies": { 782 | "yallist": "^4.0.0" 783 | }, 784 | "engines": { 785 | "node": ">=10" 786 | } 787 | }, 788 | "node_modules/media-typer": { 789 | "version": "0.3.0", 790 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 791 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 792 | "engines": { 793 | "node": ">= 0.6" 794 | } 795 | }, 796 | "node_modules/memory-pager": { 797 | "version": "1.5.0", 798 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 799 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 800 | }, 801 | "node_modules/merge-descriptors": { 802 | "version": "1.0.1", 803 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 804 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 805 | }, 806 | "node_modules/methods": { 807 | "version": "1.1.2", 808 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 809 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 810 | "engines": { 811 | "node": ">= 0.6" 812 | } 813 | }, 814 | "node_modules/mime": { 815 | "version": "1.6.0", 816 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 817 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 818 | "bin": { 819 | "mime": "cli.js" 820 | }, 821 | "engines": { 822 | "node": ">=4" 823 | } 824 | }, 825 | "node_modules/mime-db": { 826 | "version": "1.52.0", 827 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 828 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 829 | "engines": { 830 | "node": ">= 0.6" 831 | } 832 | }, 833 | "node_modules/mime-types": { 834 | "version": "2.1.35", 835 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 836 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 837 | "dependencies": { 838 | "mime-db": "1.52.0" 839 | }, 840 | "engines": { 841 | "node": ">= 0.6" 842 | } 843 | }, 844 | "node_modules/minimatch": { 845 | "version": "3.1.2", 846 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 847 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 848 | "dev": true, 849 | "dependencies": { 850 | "brace-expansion": "^1.1.7" 851 | }, 852 | "engines": { 853 | "node": "*" 854 | } 855 | }, 856 | "node_modules/mongodb": { 857 | "version": "6.2.0", 858 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", 859 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", 860 | "dependencies": { 861 | "@mongodb-js/saslprep": "^1.1.0", 862 | "bson": "^6.2.0", 863 | "mongodb-connection-string-url": "^2.6.0" 864 | }, 865 | "engines": { 866 | "node": ">=16.20.1" 867 | }, 868 | "peerDependencies": { 869 | "@aws-sdk/credential-providers": "^3.188.0", 870 | "@mongodb-js/zstd": "^1.1.0", 871 | "gcp-metadata": "^5.2.0", 872 | "kerberos": "^2.0.1", 873 | "mongodb-client-encryption": ">=6.0.0 <7", 874 | "snappy": "^7.2.2", 875 | "socks": "^2.7.1" 876 | }, 877 | "peerDependenciesMeta": { 878 | "@aws-sdk/credential-providers": { 879 | "optional": true 880 | }, 881 | "@mongodb-js/zstd": { 882 | "optional": true 883 | }, 884 | "gcp-metadata": { 885 | "optional": true 886 | }, 887 | "kerberos": { 888 | "optional": true 889 | }, 890 | "mongodb-client-encryption": { 891 | "optional": true 892 | }, 893 | "snappy": { 894 | "optional": true 895 | }, 896 | "socks": { 897 | "optional": true 898 | } 899 | } 900 | }, 901 | "node_modules/mongodb-connection-string-url": { 902 | "version": "2.6.0", 903 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", 904 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", 905 | "dependencies": { 906 | "@types/whatwg-url": "^8.2.1", 907 | "whatwg-url": "^11.0.0" 908 | } 909 | }, 910 | "node_modules/mongoose": { 911 | "version": "8.0.3", 912 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.3.tgz", 913 | "integrity": "sha512-LJRT0yP4TW14HT4r2RkxqyvoTylMSzWpl5QOeVHTnRggCLQSpkoBdgbUtORFq/mSL2o9cLCPJz+6uzFj25qbHw==", 914 | "dependencies": { 915 | "bson": "^6.2.0", 916 | "kareem": "2.5.1", 917 | "mongodb": "6.2.0", 918 | "mpath": "0.9.0", 919 | "mquery": "5.0.0", 920 | "ms": "2.1.3", 921 | "sift": "16.0.1" 922 | }, 923 | "engines": { 924 | "node": ">=16.20.1" 925 | }, 926 | "funding": { 927 | "type": "opencollective", 928 | "url": "https://opencollective.com/mongoose" 929 | } 930 | }, 931 | "node_modules/mongoose/node_modules/ms": { 932 | "version": "2.1.3", 933 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 934 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 935 | }, 936 | "node_modules/mpath": { 937 | "version": "0.9.0", 938 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 939 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 940 | "engines": { 941 | "node": ">=4.0.0" 942 | } 943 | }, 944 | "node_modules/mquery": { 945 | "version": "5.0.0", 946 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 947 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 948 | "dependencies": { 949 | "debug": "4.x" 950 | }, 951 | "engines": { 952 | "node": ">=14.0.0" 953 | } 954 | }, 955 | "node_modules/mquery/node_modules/debug": { 956 | "version": "4.3.4", 957 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 958 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 959 | "dependencies": { 960 | "ms": "2.1.2" 961 | }, 962 | "engines": { 963 | "node": ">=6.0" 964 | }, 965 | "peerDependenciesMeta": { 966 | "supports-color": { 967 | "optional": true 968 | } 969 | } 970 | }, 971 | "node_modules/mquery/node_modules/ms": { 972 | "version": "2.1.2", 973 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 974 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 975 | }, 976 | "node_modules/ms": { 977 | "version": "2.0.0", 978 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 979 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 980 | }, 981 | "node_modules/negotiator": { 982 | "version": "0.6.3", 983 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 984 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 985 | "engines": { 986 | "node": ">= 0.6" 987 | } 988 | }, 989 | "node_modules/nodemailer": { 990 | "version": "6.9.7", 991 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", 992 | "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", 993 | "engines": { 994 | "node": ">=6.0.0" 995 | } 996 | }, 997 | "node_modules/nodemon": { 998 | "version": "3.0.2", 999 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", 1000 | "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "chokidar": "^3.5.2", 1004 | "debug": "^4", 1005 | "ignore-by-default": "^1.0.1", 1006 | "minimatch": "^3.1.2", 1007 | "pstree.remy": "^1.1.8", 1008 | "semver": "^7.5.3", 1009 | "simple-update-notifier": "^2.0.0", 1010 | "supports-color": "^5.5.0", 1011 | "touch": "^3.1.0", 1012 | "undefsafe": "^2.0.5" 1013 | }, 1014 | "bin": { 1015 | "nodemon": "bin/nodemon.js" 1016 | }, 1017 | "engines": { 1018 | "node": ">=10" 1019 | }, 1020 | "funding": { 1021 | "type": "opencollective", 1022 | "url": "https://opencollective.com/nodemon" 1023 | } 1024 | }, 1025 | "node_modules/nodemon/node_modules/debug": { 1026 | "version": "4.3.4", 1027 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1028 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1029 | "dev": true, 1030 | "dependencies": { 1031 | "ms": "2.1.2" 1032 | }, 1033 | "engines": { 1034 | "node": ">=6.0" 1035 | }, 1036 | "peerDependenciesMeta": { 1037 | "supports-color": { 1038 | "optional": true 1039 | } 1040 | } 1041 | }, 1042 | "node_modules/nodemon/node_modules/ms": { 1043 | "version": "2.1.2", 1044 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1045 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1046 | "dev": true 1047 | }, 1048 | "node_modules/nopt": { 1049 | "version": "1.0.10", 1050 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1051 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 1052 | "dev": true, 1053 | "dependencies": { 1054 | "abbrev": "1" 1055 | }, 1056 | "bin": { 1057 | "nopt": "bin/nopt.js" 1058 | }, 1059 | "engines": { 1060 | "node": "*" 1061 | } 1062 | }, 1063 | "node_modules/normalize-path": { 1064 | "version": "3.0.0", 1065 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1066 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1067 | "dev": true, 1068 | "engines": { 1069 | "node": ">=0.10.0" 1070 | } 1071 | }, 1072 | "node_modules/object-assign": { 1073 | "version": "4.1.1", 1074 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1075 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1076 | "engines": { 1077 | "node": ">=0.10.0" 1078 | } 1079 | }, 1080 | "node_modules/object-inspect": { 1081 | "version": "1.13.1", 1082 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1083 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1084 | "funding": { 1085 | "url": "https://github.com/sponsors/ljharb" 1086 | } 1087 | }, 1088 | "node_modules/on-finished": { 1089 | "version": "2.4.1", 1090 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1091 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1092 | "dependencies": { 1093 | "ee-first": "1.1.1" 1094 | }, 1095 | "engines": { 1096 | "node": ">= 0.8" 1097 | } 1098 | }, 1099 | "node_modules/parseurl": { 1100 | "version": "1.3.3", 1101 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1102 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1103 | "engines": { 1104 | "node": ">= 0.8" 1105 | } 1106 | }, 1107 | "node_modules/path-to-regexp": { 1108 | "version": "0.1.7", 1109 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1110 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1111 | }, 1112 | "node_modules/picomatch": { 1113 | "version": "2.3.1", 1114 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1115 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1116 | "dev": true, 1117 | "engines": { 1118 | "node": ">=8.6" 1119 | }, 1120 | "funding": { 1121 | "url": "https://github.com/sponsors/jonschlinkert" 1122 | } 1123 | }, 1124 | "node_modules/prettier": { 1125 | "version": "3.1.1", 1126 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", 1127 | "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", 1128 | "dev": true, 1129 | "bin": { 1130 | "prettier": "bin/prettier.cjs" 1131 | }, 1132 | "engines": { 1133 | "node": ">=14" 1134 | }, 1135 | "funding": { 1136 | "url": "https://github.com/prettier/prettier?sponsor=1" 1137 | } 1138 | }, 1139 | "node_modules/proxy-addr": { 1140 | "version": "2.0.7", 1141 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1142 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1143 | "dependencies": { 1144 | "forwarded": "0.2.0", 1145 | "ipaddr.js": "1.9.1" 1146 | }, 1147 | "engines": { 1148 | "node": ">= 0.10" 1149 | } 1150 | }, 1151 | "node_modules/pstree.remy": { 1152 | "version": "1.1.8", 1153 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1154 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1155 | "dev": true 1156 | }, 1157 | "node_modules/punycode": { 1158 | "version": "2.3.1", 1159 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1160 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1161 | "engines": { 1162 | "node": ">=6" 1163 | } 1164 | }, 1165 | "node_modules/qs": { 1166 | "version": "6.11.0", 1167 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1168 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1169 | "dependencies": { 1170 | "side-channel": "^1.0.4" 1171 | }, 1172 | "engines": { 1173 | "node": ">=0.6" 1174 | }, 1175 | "funding": { 1176 | "url": "https://github.com/sponsors/ljharb" 1177 | } 1178 | }, 1179 | "node_modules/range-parser": { 1180 | "version": "1.2.1", 1181 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1182 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1183 | "engines": { 1184 | "node": ">= 0.6" 1185 | } 1186 | }, 1187 | "node_modules/raw-body": { 1188 | "version": "2.5.2", 1189 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1190 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1191 | "dependencies": { 1192 | "bytes": "3.1.2", 1193 | "http-errors": "2.0.0", 1194 | "iconv-lite": "0.4.24", 1195 | "unpipe": "1.0.0" 1196 | }, 1197 | "engines": { 1198 | "node": ">= 0.8" 1199 | } 1200 | }, 1201 | "node_modules/readdirp": { 1202 | "version": "3.6.0", 1203 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1204 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1205 | "dev": true, 1206 | "dependencies": { 1207 | "picomatch": "^2.2.1" 1208 | }, 1209 | "engines": { 1210 | "node": ">=8.10.0" 1211 | } 1212 | }, 1213 | "node_modules/safe-buffer": { 1214 | "version": "5.2.1", 1215 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1216 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1217 | "funding": [ 1218 | { 1219 | "type": "github", 1220 | "url": "https://github.com/sponsors/feross" 1221 | }, 1222 | { 1223 | "type": "patreon", 1224 | "url": "https://www.patreon.com/feross" 1225 | }, 1226 | { 1227 | "type": "consulting", 1228 | "url": "https://feross.org/support" 1229 | } 1230 | ] 1231 | }, 1232 | "node_modules/safer-buffer": { 1233 | "version": "2.1.2", 1234 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1235 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1236 | }, 1237 | "node_modules/semver": { 1238 | "version": "7.5.4", 1239 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1240 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1241 | "dependencies": { 1242 | "lru-cache": "^6.0.0" 1243 | }, 1244 | "bin": { 1245 | "semver": "bin/semver.js" 1246 | }, 1247 | "engines": { 1248 | "node": ">=10" 1249 | } 1250 | }, 1251 | "node_modules/send": { 1252 | "version": "0.18.0", 1253 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1254 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1255 | "dependencies": { 1256 | "debug": "2.6.9", 1257 | "depd": "2.0.0", 1258 | "destroy": "1.2.0", 1259 | "encodeurl": "~1.0.2", 1260 | "escape-html": "~1.0.3", 1261 | "etag": "~1.8.1", 1262 | "fresh": "0.5.2", 1263 | "http-errors": "2.0.0", 1264 | "mime": "1.6.0", 1265 | "ms": "2.1.3", 1266 | "on-finished": "2.4.1", 1267 | "range-parser": "~1.2.1", 1268 | "statuses": "2.0.1" 1269 | }, 1270 | "engines": { 1271 | "node": ">= 0.8.0" 1272 | } 1273 | }, 1274 | "node_modules/send/node_modules/ms": { 1275 | "version": "2.1.3", 1276 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1277 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1278 | }, 1279 | "node_modules/serve-static": { 1280 | "version": "1.15.0", 1281 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1282 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1283 | "dependencies": { 1284 | "encodeurl": "~1.0.2", 1285 | "escape-html": "~1.0.3", 1286 | "parseurl": "~1.3.3", 1287 | "send": "0.18.0" 1288 | }, 1289 | "engines": { 1290 | "node": ">= 0.8.0" 1291 | } 1292 | }, 1293 | "node_modules/set-function-length": { 1294 | "version": "1.1.1", 1295 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 1296 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 1297 | "dependencies": { 1298 | "define-data-property": "^1.1.1", 1299 | "get-intrinsic": "^1.2.1", 1300 | "gopd": "^1.0.1", 1301 | "has-property-descriptors": "^1.0.0" 1302 | }, 1303 | "engines": { 1304 | "node": ">= 0.4" 1305 | } 1306 | }, 1307 | "node_modules/setprototypeof": { 1308 | "version": "1.2.0", 1309 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1310 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1311 | }, 1312 | "node_modules/side-channel": { 1313 | "version": "1.0.4", 1314 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1315 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1316 | "dependencies": { 1317 | "call-bind": "^1.0.0", 1318 | "get-intrinsic": "^1.0.2", 1319 | "object-inspect": "^1.9.0" 1320 | }, 1321 | "funding": { 1322 | "url": "https://github.com/sponsors/ljharb" 1323 | } 1324 | }, 1325 | "node_modules/sift": { 1326 | "version": "16.0.1", 1327 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 1328 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 1329 | }, 1330 | "node_modules/simple-update-notifier": { 1331 | "version": "2.0.0", 1332 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 1333 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 1334 | "dev": true, 1335 | "dependencies": { 1336 | "semver": "^7.5.3" 1337 | }, 1338 | "engines": { 1339 | "node": ">=10" 1340 | } 1341 | }, 1342 | "node_modules/sparse-bitfield": { 1343 | "version": "3.0.3", 1344 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1345 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 1346 | "dependencies": { 1347 | "memory-pager": "^1.0.2" 1348 | } 1349 | }, 1350 | "node_modules/statuses": { 1351 | "version": "2.0.1", 1352 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1353 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1354 | "engines": { 1355 | "node": ">= 0.8" 1356 | } 1357 | }, 1358 | "node_modules/supports-color": { 1359 | "version": "5.5.0", 1360 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1361 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1362 | "dev": true, 1363 | "dependencies": { 1364 | "has-flag": "^3.0.0" 1365 | }, 1366 | "engines": { 1367 | "node": ">=4" 1368 | } 1369 | }, 1370 | "node_modules/to-regex-range": { 1371 | "version": "5.0.1", 1372 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1373 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1374 | "dev": true, 1375 | "dependencies": { 1376 | "is-number": "^7.0.0" 1377 | }, 1378 | "engines": { 1379 | "node": ">=8.0" 1380 | } 1381 | }, 1382 | "node_modules/toidentifier": { 1383 | "version": "1.0.1", 1384 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1385 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1386 | "engines": { 1387 | "node": ">=0.6" 1388 | } 1389 | }, 1390 | "node_modules/touch": { 1391 | "version": "3.1.0", 1392 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1393 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1394 | "dev": true, 1395 | "dependencies": { 1396 | "nopt": "~1.0.10" 1397 | }, 1398 | "bin": { 1399 | "nodetouch": "bin/nodetouch.js" 1400 | } 1401 | }, 1402 | "node_modules/tr46": { 1403 | "version": "3.0.0", 1404 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 1405 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 1406 | "dependencies": { 1407 | "punycode": "^2.1.1" 1408 | }, 1409 | "engines": { 1410 | "node": ">=12" 1411 | } 1412 | }, 1413 | "node_modules/type-is": { 1414 | "version": "1.6.18", 1415 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1416 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1417 | "dependencies": { 1418 | "media-typer": "0.3.0", 1419 | "mime-types": "~2.1.24" 1420 | }, 1421 | "engines": { 1422 | "node": ">= 0.6" 1423 | } 1424 | }, 1425 | "node_modules/undefsafe": { 1426 | "version": "2.0.5", 1427 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1428 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1429 | "dev": true 1430 | }, 1431 | "node_modules/undici-types": { 1432 | "version": "5.26.5", 1433 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1434 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 1435 | }, 1436 | "node_modules/unpipe": { 1437 | "version": "1.0.0", 1438 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1439 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1440 | "engines": { 1441 | "node": ">= 0.8" 1442 | } 1443 | }, 1444 | "node_modules/utils-merge": { 1445 | "version": "1.0.1", 1446 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1447 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1448 | "engines": { 1449 | "node": ">= 0.4.0" 1450 | } 1451 | }, 1452 | "node_modules/validator": { 1453 | "version": "13.11.0", 1454 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", 1455 | "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", 1456 | "engines": { 1457 | "node": ">= 0.10" 1458 | } 1459 | }, 1460 | "node_modules/vary": { 1461 | "version": "1.1.2", 1462 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1463 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1464 | "engines": { 1465 | "node": ">= 0.8" 1466 | } 1467 | }, 1468 | "node_modules/webidl-conversions": { 1469 | "version": "7.0.0", 1470 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 1471 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 1472 | "engines": { 1473 | "node": ">=12" 1474 | } 1475 | }, 1476 | "node_modules/whatwg-url": { 1477 | "version": "11.0.0", 1478 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 1479 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 1480 | "dependencies": { 1481 | "tr46": "^3.0.0", 1482 | "webidl-conversions": "^7.0.0" 1483 | }, 1484 | "engines": { 1485 | "node": ">=12" 1486 | } 1487 | }, 1488 | "node_modules/yallist": { 1489 | "version": "4.0.0", 1490 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1491 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1492 | } 1493 | }, 1494 | "dependencies": { 1495 | "@mongodb-js/saslprep": { 1496 | "version": "1.1.1", 1497 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", 1498 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", 1499 | "requires": { 1500 | "sparse-bitfield": "^3.0.3" 1501 | } 1502 | }, 1503 | "@types/node": { 1504 | "version": "20.10.4", 1505 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", 1506 | "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", 1507 | "requires": { 1508 | "undici-types": "~5.26.4" 1509 | } 1510 | }, 1511 | "@types/webidl-conversions": { 1512 | "version": "7.0.3", 1513 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 1514 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 1515 | }, 1516 | "@types/whatwg-url": { 1517 | "version": "8.2.2", 1518 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", 1519 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", 1520 | "requires": { 1521 | "@types/node": "*", 1522 | "@types/webidl-conversions": "*" 1523 | } 1524 | }, 1525 | "abbrev": { 1526 | "version": "1.1.1", 1527 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 1528 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 1529 | "dev": true 1530 | }, 1531 | "accepts": { 1532 | "version": "1.3.8", 1533 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1534 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1535 | "requires": { 1536 | "mime-types": "~2.1.34", 1537 | "negotiator": "0.6.3" 1538 | } 1539 | }, 1540 | "anymatch": { 1541 | "version": "3.1.3", 1542 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1543 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1544 | "dev": true, 1545 | "requires": { 1546 | "normalize-path": "^3.0.0", 1547 | "picomatch": "^2.0.4" 1548 | } 1549 | }, 1550 | "array-flatten": { 1551 | "version": "1.1.1", 1552 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1553 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 1554 | }, 1555 | "balanced-match": { 1556 | "version": "1.0.2", 1557 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1558 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1559 | "dev": true 1560 | }, 1561 | "binary-extensions": { 1562 | "version": "2.2.0", 1563 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1564 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1565 | "dev": true 1566 | }, 1567 | "body-parser": { 1568 | "version": "1.20.2", 1569 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 1570 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 1571 | "requires": { 1572 | "bytes": "3.1.2", 1573 | "content-type": "~1.0.5", 1574 | "debug": "2.6.9", 1575 | "depd": "2.0.0", 1576 | "destroy": "1.2.0", 1577 | "http-errors": "2.0.0", 1578 | "iconv-lite": "0.4.24", 1579 | "on-finished": "2.4.1", 1580 | "qs": "6.11.0", 1581 | "raw-body": "2.5.2", 1582 | "type-is": "~1.6.18", 1583 | "unpipe": "1.0.0" 1584 | } 1585 | }, 1586 | "brace-expansion": { 1587 | "version": "1.1.11", 1588 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1589 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1590 | "dev": true, 1591 | "requires": { 1592 | "balanced-match": "^1.0.0", 1593 | "concat-map": "0.0.1" 1594 | } 1595 | }, 1596 | "braces": { 1597 | "version": "3.0.2", 1598 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1599 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1600 | "dev": true, 1601 | "requires": { 1602 | "fill-range": "^7.0.1" 1603 | } 1604 | }, 1605 | "bson": { 1606 | "version": "6.2.0", 1607 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", 1608 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==" 1609 | }, 1610 | "buffer-equal-constant-time": { 1611 | "version": "1.0.1", 1612 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 1613 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 1614 | }, 1615 | "bytes": { 1616 | "version": "3.1.2", 1617 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1618 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1619 | }, 1620 | "call-bind": { 1621 | "version": "1.0.5", 1622 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 1623 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 1624 | "requires": { 1625 | "function-bind": "^1.1.2", 1626 | "get-intrinsic": "^1.2.1", 1627 | "set-function-length": "^1.1.1" 1628 | } 1629 | }, 1630 | "chokidar": { 1631 | "version": "3.5.3", 1632 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1633 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1634 | "dev": true, 1635 | "requires": { 1636 | "anymatch": "~3.1.2", 1637 | "braces": "~3.0.2", 1638 | "fsevents": "~2.3.2", 1639 | "glob-parent": "~5.1.2", 1640 | "is-binary-path": "~2.1.0", 1641 | "is-glob": "~4.0.1", 1642 | "normalize-path": "~3.0.0", 1643 | "readdirp": "~3.6.0" 1644 | } 1645 | }, 1646 | "concat-map": { 1647 | "version": "0.0.1", 1648 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1649 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1650 | "dev": true 1651 | }, 1652 | "content-disposition": { 1653 | "version": "0.5.4", 1654 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 1655 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 1656 | "requires": { 1657 | "safe-buffer": "5.2.1" 1658 | } 1659 | }, 1660 | "content-type": { 1661 | "version": "1.0.5", 1662 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 1663 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 1664 | }, 1665 | "cookie": { 1666 | "version": "0.5.0", 1667 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 1668 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 1669 | }, 1670 | "cookie-parser": { 1671 | "version": "1.4.6", 1672 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 1673 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 1674 | "requires": { 1675 | "cookie": "0.4.1", 1676 | "cookie-signature": "1.0.6" 1677 | }, 1678 | "dependencies": { 1679 | "cookie": { 1680 | "version": "0.4.1", 1681 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 1682 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" 1683 | } 1684 | } 1685 | }, 1686 | "cookie-signature": { 1687 | "version": "1.0.6", 1688 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 1689 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 1690 | }, 1691 | "cors": { 1692 | "version": "2.8.5", 1693 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 1694 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 1695 | "requires": { 1696 | "object-assign": "^4", 1697 | "vary": "^1" 1698 | } 1699 | }, 1700 | "debug": { 1701 | "version": "2.6.9", 1702 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1703 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1704 | "requires": { 1705 | "ms": "2.0.0" 1706 | } 1707 | }, 1708 | "define-data-property": { 1709 | "version": "1.1.1", 1710 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 1711 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 1712 | "requires": { 1713 | "get-intrinsic": "^1.2.1", 1714 | "gopd": "^1.0.1", 1715 | "has-property-descriptors": "^1.0.0" 1716 | } 1717 | }, 1718 | "depd": { 1719 | "version": "2.0.0", 1720 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 1721 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 1722 | }, 1723 | "destroy": { 1724 | "version": "1.2.0", 1725 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 1726 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 1727 | }, 1728 | "dotenv": { 1729 | "version": "16.3.1", 1730 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", 1731 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" 1732 | }, 1733 | "ecdsa-sig-formatter": { 1734 | "version": "1.0.11", 1735 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 1736 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 1737 | "requires": { 1738 | "safe-buffer": "^5.0.1" 1739 | } 1740 | }, 1741 | "ee-first": { 1742 | "version": "1.1.1", 1743 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 1744 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 1745 | }, 1746 | "encodeurl": { 1747 | "version": "1.0.2", 1748 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1749 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1750 | }, 1751 | "escape-html": { 1752 | "version": "1.0.3", 1753 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1754 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1755 | }, 1756 | "etag": { 1757 | "version": "1.8.1", 1758 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1759 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1760 | }, 1761 | "express": { 1762 | "version": "4.18.2", 1763 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1764 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1765 | "requires": { 1766 | "accepts": "~1.3.8", 1767 | "array-flatten": "1.1.1", 1768 | "body-parser": "1.20.1", 1769 | "content-disposition": "0.5.4", 1770 | "content-type": "~1.0.4", 1771 | "cookie": "0.5.0", 1772 | "cookie-signature": "1.0.6", 1773 | "debug": "2.6.9", 1774 | "depd": "2.0.0", 1775 | "encodeurl": "~1.0.2", 1776 | "escape-html": "~1.0.3", 1777 | "etag": "~1.8.1", 1778 | "finalhandler": "1.2.0", 1779 | "fresh": "0.5.2", 1780 | "http-errors": "2.0.0", 1781 | "merge-descriptors": "1.0.1", 1782 | "methods": "~1.1.2", 1783 | "on-finished": "2.4.1", 1784 | "parseurl": "~1.3.3", 1785 | "path-to-regexp": "0.1.7", 1786 | "proxy-addr": "~2.0.7", 1787 | "qs": "6.11.0", 1788 | "range-parser": "~1.2.1", 1789 | "safe-buffer": "5.2.1", 1790 | "send": "0.18.0", 1791 | "serve-static": "1.15.0", 1792 | "setprototypeof": "1.2.0", 1793 | "statuses": "2.0.1", 1794 | "type-is": "~1.6.18", 1795 | "utils-merge": "1.0.1", 1796 | "vary": "~1.1.2" 1797 | }, 1798 | "dependencies": { 1799 | "body-parser": { 1800 | "version": "1.20.1", 1801 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 1802 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 1803 | "requires": { 1804 | "bytes": "3.1.2", 1805 | "content-type": "~1.0.4", 1806 | "debug": "2.6.9", 1807 | "depd": "2.0.0", 1808 | "destroy": "1.2.0", 1809 | "http-errors": "2.0.0", 1810 | "iconv-lite": "0.4.24", 1811 | "on-finished": "2.4.1", 1812 | "qs": "6.11.0", 1813 | "raw-body": "2.5.1", 1814 | "type-is": "~1.6.18", 1815 | "unpipe": "1.0.0" 1816 | } 1817 | }, 1818 | "raw-body": { 1819 | "version": "2.5.1", 1820 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1821 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1822 | "requires": { 1823 | "bytes": "3.1.2", 1824 | "http-errors": "2.0.0", 1825 | "iconv-lite": "0.4.24", 1826 | "unpipe": "1.0.0" 1827 | } 1828 | } 1829 | } 1830 | }, 1831 | "fill-range": { 1832 | "version": "7.0.1", 1833 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1834 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1835 | "dev": true, 1836 | "requires": { 1837 | "to-regex-range": "^5.0.1" 1838 | } 1839 | }, 1840 | "finalhandler": { 1841 | "version": "1.2.0", 1842 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1843 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1844 | "requires": { 1845 | "debug": "2.6.9", 1846 | "encodeurl": "~1.0.2", 1847 | "escape-html": "~1.0.3", 1848 | "on-finished": "2.4.1", 1849 | "parseurl": "~1.3.3", 1850 | "statuses": "2.0.1", 1851 | "unpipe": "~1.0.0" 1852 | } 1853 | }, 1854 | "forwarded": { 1855 | "version": "0.2.0", 1856 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1857 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1858 | }, 1859 | "fresh": { 1860 | "version": "0.5.2", 1861 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1862 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1863 | }, 1864 | "fsevents": { 1865 | "version": "2.3.3", 1866 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1867 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1868 | "dev": true, 1869 | "optional": true 1870 | }, 1871 | "function-bind": { 1872 | "version": "1.1.2", 1873 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1874 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 1875 | }, 1876 | "get-intrinsic": { 1877 | "version": "1.2.2", 1878 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 1879 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 1880 | "requires": { 1881 | "function-bind": "^1.1.2", 1882 | "has-proto": "^1.0.1", 1883 | "has-symbols": "^1.0.3", 1884 | "hasown": "^2.0.0" 1885 | } 1886 | }, 1887 | "glob-parent": { 1888 | "version": "5.1.2", 1889 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1890 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1891 | "dev": true, 1892 | "requires": { 1893 | "is-glob": "^4.0.1" 1894 | } 1895 | }, 1896 | "gopd": { 1897 | "version": "1.0.1", 1898 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1899 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1900 | "requires": { 1901 | "get-intrinsic": "^1.1.3" 1902 | } 1903 | }, 1904 | "has-flag": { 1905 | "version": "3.0.0", 1906 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1907 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1908 | "dev": true 1909 | }, 1910 | "has-property-descriptors": { 1911 | "version": "1.0.1", 1912 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 1913 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 1914 | "requires": { 1915 | "get-intrinsic": "^1.2.2" 1916 | } 1917 | }, 1918 | "has-proto": { 1919 | "version": "1.0.1", 1920 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1921 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" 1922 | }, 1923 | "has-symbols": { 1924 | "version": "1.0.3", 1925 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1926 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1927 | }, 1928 | "hasown": { 1929 | "version": "2.0.0", 1930 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 1931 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 1932 | "requires": { 1933 | "function-bind": "^1.1.2" 1934 | } 1935 | }, 1936 | "http-errors": { 1937 | "version": "2.0.0", 1938 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1939 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1940 | "requires": { 1941 | "depd": "2.0.0", 1942 | "inherits": "2.0.4", 1943 | "setprototypeof": "1.2.0", 1944 | "statuses": "2.0.1", 1945 | "toidentifier": "1.0.1" 1946 | } 1947 | }, 1948 | "iconv-lite": { 1949 | "version": "0.4.24", 1950 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1951 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1952 | "requires": { 1953 | "safer-buffer": ">= 2.1.2 < 3" 1954 | } 1955 | }, 1956 | "ignore-by-default": { 1957 | "version": "1.0.1", 1958 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1959 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 1960 | "dev": true 1961 | }, 1962 | "inherits": { 1963 | "version": "2.0.4", 1964 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1965 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1966 | }, 1967 | "ipaddr.js": { 1968 | "version": "1.9.1", 1969 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1970 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1971 | }, 1972 | "is-binary-path": { 1973 | "version": "2.1.0", 1974 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1975 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1976 | "dev": true, 1977 | "requires": { 1978 | "binary-extensions": "^2.0.0" 1979 | } 1980 | }, 1981 | "is-extglob": { 1982 | "version": "2.1.1", 1983 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1984 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1985 | "dev": true 1986 | }, 1987 | "is-glob": { 1988 | "version": "4.0.3", 1989 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1990 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1991 | "dev": true, 1992 | "requires": { 1993 | "is-extglob": "^2.1.1" 1994 | } 1995 | }, 1996 | "is-number": { 1997 | "version": "7.0.0", 1998 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1999 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2000 | "dev": true 2001 | }, 2002 | "jsonwebtoken": { 2003 | "version": "9.0.2", 2004 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 2005 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 2006 | "requires": { 2007 | "jws": "^3.2.2", 2008 | "lodash.includes": "^4.3.0", 2009 | "lodash.isboolean": "^3.0.3", 2010 | "lodash.isinteger": "^4.0.4", 2011 | "lodash.isnumber": "^3.0.3", 2012 | "lodash.isplainobject": "^4.0.6", 2013 | "lodash.isstring": "^4.0.1", 2014 | "lodash.once": "^4.0.0", 2015 | "ms": "^2.1.1", 2016 | "semver": "^7.5.4" 2017 | }, 2018 | "dependencies": { 2019 | "ms": { 2020 | "version": "2.1.3", 2021 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2022 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2023 | } 2024 | } 2025 | }, 2026 | "jwa": { 2027 | "version": "1.4.1", 2028 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 2029 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 2030 | "requires": { 2031 | "buffer-equal-constant-time": "1.0.1", 2032 | "ecdsa-sig-formatter": "1.0.11", 2033 | "safe-buffer": "^5.0.1" 2034 | } 2035 | }, 2036 | "jws": { 2037 | "version": "3.2.2", 2038 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 2039 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 2040 | "requires": { 2041 | "jwa": "^1.4.1", 2042 | "safe-buffer": "^5.0.1" 2043 | } 2044 | }, 2045 | "kareem": { 2046 | "version": "2.5.1", 2047 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", 2048 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" 2049 | }, 2050 | "lodash.includes": { 2051 | "version": "4.3.0", 2052 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 2053 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 2054 | }, 2055 | "lodash.isboolean": { 2056 | "version": "3.0.3", 2057 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 2058 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 2059 | }, 2060 | "lodash.isinteger": { 2061 | "version": "4.0.4", 2062 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 2063 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 2064 | }, 2065 | "lodash.isnumber": { 2066 | "version": "3.0.3", 2067 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 2068 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 2069 | }, 2070 | "lodash.isplainobject": { 2071 | "version": "4.0.6", 2072 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 2073 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 2074 | }, 2075 | "lodash.isstring": { 2076 | "version": "4.0.1", 2077 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 2078 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 2079 | }, 2080 | "lodash.once": { 2081 | "version": "4.1.1", 2082 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 2083 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 2084 | }, 2085 | "lru-cache": { 2086 | "version": "6.0.0", 2087 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2088 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2089 | "requires": { 2090 | "yallist": "^4.0.0" 2091 | } 2092 | }, 2093 | "media-typer": { 2094 | "version": "0.3.0", 2095 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2096 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 2097 | }, 2098 | "memory-pager": { 2099 | "version": "1.5.0", 2100 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 2101 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 2102 | }, 2103 | "merge-descriptors": { 2104 | "version": "1.0.1", 2105 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2106 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 2107 | }, 2108 | "methods": { 2109 | "version": "1.1.2", 2110 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2111 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 2112 | }, 2113 | "mime": { 2114 | "version": "1.6.0", 2115 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2116 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2117 | }, 2118 | "mime-db": { 2119 | "version": "1.52.0", 2120 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2121 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 2122 | }, 2123 | "mime-types": { 2124 | "version": "2.1.35", 2125 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2126 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2127 | "requires": { 2128 | "mime-db": "1.52.0" 2129 | } 2130 | }, 2131 | "minimatch": { 2132 | "version": "3.1.2", 2133 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2134 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2135 | "dev": true, 2136 | "requires": { 2137 | "brace-expansion": "^1.1.7" 2138 | } 2139 | }, 2140 | "mongodb": { 2141 | "version": "6.2.0", 2142 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", 2143 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", 2144 | "requires": { 2145 | "@mongodb-js/saslprep": "^1.1.0", 2146 | "bson": "^6.2.0", 2147 | "mongodb-connection-string-url": "^2.6.0" 2148 | } 2149 | }, 2150 | "mongodb-connection-string-url": { 2151 | "version": "2.6.0", 2152 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", 2153 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", 2154 | "requires": { 2155 | "@types/whatwg-url": "^8.2.1", 2156 | "whatwg-url": "^11.0.0" 2157 | } 2158 | }, 2159 | "mongoose": { 2160 | "version": "8.0.3", 2161 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.3.tgz", 2162 | "integrity": "sha512-LJRT0yP4TW14HT4r2RkxqyvoTylMSzWpl5QOeVHTnRggCLQSpkoBdgbUtORFq/mSL2o9cLCPJz+6uzFj25qbHw==", 2163 | "requires": { 2164 | "bson": "^6.2.0", 2165 | "kareem": "2.5.1", 2166 | "mongodb": "6.2.0", 2167 | "mpath": "0.9.0", 2168 | "mquery": "5.0.0", 2169 | "ms": "2.1.3", 2170 | "sift": "16.0.1" 2171 | }, 2172 | "dependencies": { 2173 | "ms": { 2174 | "version": "2.1.3", 2175 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2176 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2177 | } 2178 | } 2179 | }, 2180 | "mpath": { 2181 | "version": "0.9.0", 2182 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 2183 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" 2184 | }, 2185 | "mquery": { 2186 | "version": "5.0.0", 2187 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 2188 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 2189 | "requires": { 2190 | "debug": "4.x" 2191 | }, 2192 | "dependencies": { 2193 | "debug": { 2194 | "version": "4.3.4", 2195 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2196 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2197 | "requires": { 2198 | "ms": "2.1.2" 2199 | } 2200 | }, 2201 | "ms": { 2202 | "version": "2.1.2", 2203 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2204 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2205 | } 2206 | } 2207 | }, 2208 | "ms": { 2209 | "version": "2.0.0", 2210 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2211 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 2212 | }, 2213 | "negotiator": { 2214 | "version": "0.6.3", 2215 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2216 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 2217 | }, 2218 | "nodemailer": { 2219 | "version": "6.9.7", 2220 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", 2221 | "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==" 2222 | }, 2223 | "nodemon": { 2224 | "version": "3.0.2", 2225 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz", 2226 | "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==", 2227 | "dev": true, 2228 | "requires": { 2229 | "chokidar": "^3.5.2", 2230 | "debug": "^4", 2231 | "ignore-by-default": "^1.0.1", 2232 | "minimatch": "^3.1.2", 2233 | "pstree.remy": "^1.1.8", 2234 | "semver": "^7.5.3", 2235 | "simple-update-notifier": "^2.0.0", 2236 | "supports-color": "^5.5.0", 2237 | "touch": "^3.1.0", 2238 | "undefsafe": "^2.0.5" 2239 | }, 2240 | "dependencies": { 2241 | "debug": { 2242 | "version": "4.3.4", 2243 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2244 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2245 | "dev": true, 2246 | "requires": { 2247 | "ms": "2.1.2" 2248 | } 2249 | }, 2250 | "ms": { 2251 | "version": "2.1.2", 2252 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2253 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2254 | "dev": true 2255 | } 2256 | } 2257 | }, 2258 | "nopt": { 2259 | "version": "1.0.10", 2260 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 2261 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 2262 | "dev": true, 2263 | "requires": { 2264 | "abbrev": "1" 2265 | } 2266 | }, 2267 | "normalize-path": { 2268 | "version": "3.0.0", 2269 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2270 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2271 | "dev": true 2272 | }, 2273 | "object-assign": { 2274 | "version": "4.1.1", 2275 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2276 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" 2277 | }, 2278 | "object-inspect": { 2279 | "version": "1.13.1", 2280 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 2281 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" 2282 | }, 2283 | "on-finished": { 2284 | "version": "2.4.1", 2285 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 2286 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 2287 | "requires": { 2288 | "ee-first": "1.1.1" 2289 | } 2290 | }, 2291 | "parseurl": { 2292 | "version": "1.3.3", 2293 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2294 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2295 | }, 2296 | "path-to-regexp": { 2297 | "version": "0.1.7", 2298 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2299 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 2300 | }, 2301 | "picomatch": { 2302 | "version": "2.3.1", 2303 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2304 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2305 | "dev": true 2306 | }, 2307 | "prettier": { 2308 | "version": "3.1.1", 2309 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", 2310 | "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", 2311 | "dev": true 2312 | }, 2313 | "proxy-addr": { 2314 | "version": "2.0.7", 2315 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2316 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2317 | "requires": { 2318 | "forwarded": "0.2.0", 2319 | "ipaddr.js": "1.9.1" 2320 | } 2321 | }, 2322 | "pstree.remy": { 2323 | "version": "1.1.8", 2324 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 2325 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 2326 | "dev": true 2327 | }, 2328 | "punycode": { 2329 | "version": "2.3.1", 2330 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2331 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" 2332 | }, 2333 | "qs": { 2334 | "version": "6.11.0", 2335 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 2336 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 2337 | "requires": { 2338 | "side-channel": "^1.0.4" 2339 | } 2340 | }, 2341 | "range-parser": { 2342 | "version": "1.2.1", 2343 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2344 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2345 | }, 2346 | "raw-body": { 2347 | "version": "2.5.2", 2348 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 2349 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 2350 | "requires": { 2351 | "bytes": "3.1.2", 2352 | "http-errors": "2.0.0", 2353 | "iconv-lite": "0.4.24", 2354 | "unpipe": "1.0.0" 2355 | } 2356 | }, 2357 | "readdirp": { 2358 | "version": "3.6.0", 2359 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2360 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2361 | "dev": true, 2362 | "requires": { 2363 | "picomatch": "^2.2.1" 2364 | } 2365 | }, 2366 | "safe-buffer": { 2367 | "version": "5.2.1", 2368 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2369 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2370 | }, 2371 | "safer-buffer": { 2372 | "version": "2.1.2", 2373 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2374 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2375 | }, 2376 | "semver": { 2377 | "version": "7.5.4", 2378 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2379 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2380 | "requires": { 2381 | "lru-cache": "^6.0.0" 2382 | } 2383 | }, 2384 | "send": { 2385 | "version": "0.18.0", 2386 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 2387 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 2388 | "requires": { 2389 | "debug": "2.6.9", 2390 | "depd": "2.0.0", 2391 | "destroy": "1.2.0", 2392 | "encodeurl": "~1.0.2", 2393 | "escape-html": "~1.0.3", 2394 | "etag": "~1.8.1", 2395 | "fresh": "0.5.2", 2396 | "http-errors": "2.0.0", 2397 | "mime": "1.6.0", 2398 | "ms": "2.1.3", 2399 | "on-finished": "2.4.1", 2400 | "range-parser": "~1.2.1", 2401 | "statuses": "2.0.1" 2402 | }, 2403 | "dependencies": { 2404 | "ms": { 2405 | "version": "2.1.3", 2406 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2407 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2408 | } 2409 | } 2410 | }, 2411 | "serve-static": { 2412 | "version": "1.15.0", 2413 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 2414 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 2415 | "requires": { 2416 | "encodeurl": "~1.0.2", 2417 | "escape-html": "~1.0.3", 2418 | "parseurl": "~1.3.3", 2419 | "send": "0.18.0" 2420 | } 2421 | }, 2422 | "set-function-length": { 2423 | "version": "1.1.1", 2424 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 2425 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 2426 | "requires": { 2427 | "define-data-property": "^1.1.1", 2428 | "get-intrinsic": "^1.2.1", 2429 | "gopd": "^1.0.1", 2430 | "has-property-descriptors": "^1.0.0" 2431 | } 2432 | }, 2433 | "setprototypeof": { 2434 | "version": "1.2.0", 2435 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2436 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2437 | }, 2438 | "side-channel": { 2439 | "version": "1.0.4", 2440 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2441 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2442 | "requires": { 2443 | "call-bind": "^1.0.0", 2444 | "get-intrinsic": "^1.0.2", 2445 | "object-inspect": "^1.9.0" 2446 | } 2447 | }, 2448 | "sift": { 2449 | "version": "16.0.1", 2450 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", 2451 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" 2452 | }, 2453 | "simple-update-notifier": { 2454 | "version": "2.0.0", 2455 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 2456 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 2457 | "dev": true, 2458 | "requires": { 2459 | "semver": "^7.5.3" 2460 | } 2461 | }, 2462 | "sparse-bitfield": { 2463 | "version": "3.0.3", 2464 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 2465 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 2466 | "requires": { 2467 | "memory-pager": "^1.0.2" 2468 | } 2469 | }, 2470 | "statuses": { 2471 | "version": "2.0.1", 2472 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2473 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 2474 | }, 2475 | "supports-color": { 2476 | "version": "5.5.0", 2477 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2478 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2479 | "dev": true, 2480 | "requires": { 2481 | "has-flag": "^3.0.0" 2482 | } 2483 | }, 2484 | "to-regex-range": { 2485 | "version": "5.0.1", 2486 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2487 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2488 | "dev": true, 2489 | "requires": { 2490 | "is-number": "^7.0.0" 2491 | } 2492 | }, 2493 | "toidentifier": { 2494 | "version": "1.0.1", 2495 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2496 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 2497 | }, 2498 | "touch": { 2499 | "version": "3.1.0", 2500 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 2501 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 2502 | "dev": true, 2503 | "requires": { 2504 | "nopt": "~1.0.10" 2505 | } 2506 | }, 2507 | "tr46": { 2508 | "version": "3.0.0", 2509 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", 2510 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", 2511 | "requires": { 2512 | "punycode": "^2.1.1" 2513 | } 2514 | }, 2515 | "type-is": { 2516 | "version": "1.6.18", 2517 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2518 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2519 | "requires": { 2520 | "media-typer": "0.3.0", 2521 | "mime-types": "~2.1.24" 2522 | } 2523 | }, 2524 | "undefsafe": { 2525 | "version": "2.0.5", 2526 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 2527 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 2528 | "dev": true 2529 | }, 2530 | "undici-types": { 2531 | "version": "5.26.5", 2532 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2533 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 2534 | }, 2535 | "unpipe": { 2536 | "version": "1.0.0", 2537 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2538 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 2539 | }, 2540 | "utils-merge": { 2541 | "version": "1.0.1", 2542 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2543 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 2544 | }, 2545 | "validator": { 2546 | "version": "13.11.0", 2547 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", 2548 | "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==" 2549 | }, 2550 | "vary": { 2551 | "version": "1.1.2", 2552 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2553 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 2554 | }, 2555 | "webidl-conversions": { 2556 | "version": "7.0.0", 2557 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 2558 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" 2559 | }, 2560 | "whatwg-url": { 2561 | "version": "11.0.0", 2562 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", 2563 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", 2564 | "requires": { 2565 | "tr46": "^3.0.0", 2566 | "webidl-conversions": "^7.0.0" 2567 | } 2568 | }, 2569 | "yallist": { 2570 | "version": "4.0.0", 2571 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2572 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2573 | } 2574 | } 2575 | } 2576 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "name": "easy-exit", 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "app.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.20.2", 14 | "cookie-parser": "^1.4.6", 15 | "cors": "^2.8.5", 16 | "dotenv": "^16.3.1", 17 | "express": "^4.18.2", 18 | "jsonwebtoken": "^9.0.2", 19 | "mongoose": "^8.0.3", 20 | "nodemailer": "^6.9.7", 21 | "validator": "^13.11.0" 22 | }, 23 | "devDependencies": { 24 | "nodemon": "^3.0.2", 25 | "prettier": "^3.1.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/config/db.config.js: -------------------------------------------------------------------------------- 1 | import mongoose from 'mongoose'; 2 | 3 | export default function connDB() { 4 | mongoose.set('strictQuery', true); 5 | mongoose 6 | .connect(process.env.MONGODB_URL) 7 | .then(() => { 8 | console.log('connected to db'); 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /src/controllers/admin.controller.js: -------------------------------------------------------------------------------- 1 | import { 2 | response_200, 3 | response_500, 4 | } from '../utils/responseCodes.js'; 5 | import Form from '../models/form.model.js'; 6 | import nodemailer from 'nodemailer'; 7 | import User from '../models/user.model.js'; 8 | 9 | // Load environment variables 10 | require('dotenv').config(); 11 | 12 | // Configure nodemailer using environment variables 13 | let transporter = nodemailer.createTransport({ 14 | host: 'smtp.gmail.com', // Assuming you are using Gmail as the email service 15 | port: 587, 16 | secure: false, 17 | auth: { 18 | user: process.env.EMAIL, // Your email address from environment variable 19 | pass: process.env.PASS // Your app password from environment variable 20 | } 21 | }); 22 | 23 | // Verify transporter configuration 24 | transporter.verify(function (err, success) { 25 | if (err) { 26 | console.error('Error verifying email transporter:', err); 27 | return; 28 | } 29 | console.log('Email transporter is ready to send emails'); 30 | }); 31 | 32 | export async function pendingPasses(req, res) { 33 | try { 34 | const pendingForms = await Form.find({ isAccepted: null }); 35 | return response_200(res, 'Pending outpasses fetched successfully', pendingForms); 36 | } catch (error) { 37 | return response_500(res, 'Error fetching pending outpasses', error); 38 | } 39 | } 40 | 41 | export async function acceptedPasses(req, res) { 42 | try { 43 | const acceptedForms = await Form.find({ isAccepted: true }); 44 | return response_200(res, 'Accepted outpasses fetched successfully', acceptedForms); 45 | } catch (error) { 46 | return response_500(res, 'Error fetching accepted outpasses', error); 47 | } 48 | } 49 | 50 | export async function rejectedPasses(req, res) { 51 | try { 52 | const rejectedForms = await Form.find({ isAccepted: false }); 53 | return response_200(res, 'Rejected outpasses fetched successfully', rejectedForms); 54 | } catch (error) { 55 | return response_500(res, 'Error fetching rejected outpasses', error); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/controllers/auth.controller.js: -------------------------------------------------------------------------------- 1 | import { 2 | response_200, 3 | response_201, 4 | response_400, 5 | response_404, 6 | response_500, 7 | } from '../utils/responseCodes.js'; 8 | import { hash_password, getJwt } from '../utils/password.js'; 9 | import User from '../models/user.model.js'; 10 | import validator from 'validator'; 11 | 12 | export async function logIn(req, res) { 13 | const { email, role } = req.body; 14 | 15 | console.log(email + " " + role) 16 | 17 | if (!(email && role && req.body.password)) 18 | 19 | return response_400(res, 'Some parameters are missing!'); 20 | 21 | const password = await hash_password(req.body.password); 22 | 23 | 24 | 25 | try { 26 | 27 | const checkUser = await User.findOne({ email: email, role:role }); 28 | 29 | console.log(checkUser) 30 | 31 | if (!checkUser) return response_404(res, "User Doesn't exist"); 32 | 33 | const checkPassword = password === checkUser.passwordHash; 34 | 35 | if (!checkPassword) return response_400(res, 'Password is incorrect'); 36 | 37 | const jwtToken = getJwt({ id: checkUser._id, email: email }); 38 | 39 | return response_200(res, 'Log In Succesful', { 40 | 41 | name: checkUser.name, 42 | 43 | email: email, 44 | 45 | role: checkUser.role, 46 | 47 | secret: jwtToken, 48 | 49 | }); 50 | 51 | } catch (error) { 52 | 53 | return response_500(res, 'Internal server error', error); 54 | 55 | } 56 | } 57 | export async function signUp(req, res) { 58 | const { name, email, role } = req.body; 59 | 60 | if (!(name && email && role && req.body.password)) 61 | 62 | return response_400(res, 'Some parameters are missing!'); 63 | 64 | 65 | 66 | if (req.body.password.length < 6) 67 | 68 | return response_400(res, 'Password must be longer than 6 letters'); 69 | 70 | 71 | 72 | if (!validator.isEmail(email)) return response_400(res, 'Email is invalid'); 73 | 74 | const checkUser = await User.findOne({ email: email }); 75 | 76 | if (checkUser) return response_400(res, 'Email already in use'); 77 | 78 | const password = await hash_password(req.body.password); 79 | 80 | let newUser = User({ 81 | 82 | email, 83 | 84 | name, 85 | 86 | role, 87 | 88 | passwordHash: password 89 | 90 | }); 91 | 92 | try { 93 | 94 | newUser = await newUser.save(); 95 | 96 | const jwtToken = getJwt({ id: newUser._id, email: newUser.email }); 97 | 98 | return response_201(res, 'Sign Up Successful', { 99 | 100 | name, 101 | 102 | email, 103 | 104 | role, 105 | 106 | secret: jwtToken, 107 | 108 | }); 109 | 110 | } catch (error) { 111 | 112 | return response_500(res, 'Internal server error', error); 113 | 114 | } 115 | 116 | } 117 | -------------------------------------------------------------------------------- /src/controllers/guard.controller.js: -------------------------------------------------------------------------------- 1 | import { 2 | response_200, 3 | response_400, 4 | response_500, 5 | } from '../utils/responseCodes.js'; 6 | import Form from '../models/form.model.js'; 7 | 8 | export async function searchOutpass(req, res) { 9 | if (!req.body.otp) return response_400(res, 'Please enter otp!!'); 10 | Form.findOne({ isAccepted: true, isUsed: false, otp: req.body.otp }) 11 | .then((result) => { 12 | return response_200(res, 'Outpass found!!!', result); 13 | }) 14 | } 15 | 16 | export async function acceptOutpass(req, res) { 17 | // console.log(req.query.id) 18 | Form.findByIdAndUpdate(req.query.id, { $set: { isUsed: true } }, { new: true }) 19 | .then((finalResult) => { 20 | console.log(finalResult) 21 | return response_200(res, 'Outpass Used', finalResult); 22 | }).catch(error => { return response_500(res, 'Internal server error', error); }); 23 | } 24 | 25 | export async function verifiedPasses(req, res) { 26 | Form.find({ isUsed: true }) 27 | .then((finalResult) => { 28 | return response_200(res, 'Fetched all verified outpasses!!', finalResult); 29 | }).catch(error => { return response_500(res, 'Internal server error', error); }); 30 | 31 | } -------------------------------------------------------------------------------- /src/controllers/student.controller.js: -------------------------------------------------------------------------------- 1 | import { 2 | response_200, 3 | response_201, 4 | response_400, 5 | response_500, 6 | } from '../utils/responseCodes.js'; 7 | import Form from '../models/form.model.js'; 8 | 9 | 10 | 11 | export async function newPass(req, res) { 12 | 13 | } 14 | 15 | 16 | export async function pastPasses(req, res) { 17 | 18 | } 19 | 20 | export async function passStatus(req, res) { 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/controllers/user.controller.js: -------------------------------------------------------------------------------- 1 | import { 2 | response_200, 3 | response_400, 4 | } from '../utils/responseCodes.js'; 5 | import { hash_password } from '../utils/password.js'; 6 | 7 | export async function getUserProfile(req, res) { 8 | return response_200(res, 'User data', { 9 | name: req.user.name, 10 | email: req.user.email, 11 | role: req.user.role 12 | }); 13 | } 14 | 15 | export async function updatePassword(req, res) { 16 | if (!(req.body.oldPassword && req.body.newPassword)) 17 | return response_400(res, 'All request parameters not provided'); 18 | const password = await hash_password(req.body.oldPassword); 19 | if (password !== req.user.passwordHash) 20 | return response_400(res, 'Wrong Password'); 21 | if (req.body.newPassword.length < 6) 22 | return response_400(res, 'New password length too short'); 23 | req.user.passwordHash = await hash_password(req.body.newPassword); 24 | await req.user.save(); 25 | return response_200(res, 'Password updated'); 26 | } 27 | -------------------------------------------------------------------------------- /src/controllers/warden.controller.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/src/controllers/warden.controller.js -------------------------------------------------------------------------------- /src/middlewares/admin.middleware.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | import { 4 | response_401, 5 | response_400, 6 | response_500, 7 | } from '../utils/responseCodes.js'; 8 | import User from '../models/user.model.js'; 9 | 10 | const adminMiddleware = async (req, res, next) => { 11 | try { 12 | const authHeader = req.header('Authorization'); 13 | 14 | if (!authHeader || !/(Bearer )\w+/.test(authHeader)) { 15 | // authorization header is not present or is not of the required format 16 | return response_400(res, 'Request is invalid'); 17 | } 18 | 19 | // extracting the token and verifying it 20 | const authToken = authHeader.replace('Bearer ', ''); 21 | 22 | let userMongoId; 23 | 24 | try { 25 | const { payload } = jwt.verify(authToken, process.env.SECRET); // will throw err if token is invalid or expired 26 | req.isAuthenticated = true; 27 | userMongoId = payload.id; 28 | } catch (err) { 29 | // token is invalid or expired 30 | return response_401(res, 'Request is unauthorized'); 31 | } 32 | 33 | // extracting user info from DB 34 | const user = await User.findById(userMongoId); 35 | 36 | if (!user || user.role!="Admin") { 37 | // user is not present in DB 38 | return response_401(res, 'Request is unauthorized!'); 39 | } 40 | 41 | req.user = user; 42 | next(); 43 | } catch (err) { 44 | return response_500(res, 'Internal Server Error', err); 45 | } 46 | }; 47 | 48 | export default adminMiddleware; 49 | -------------------------------------------------------------------------------- /src/middlewares/guard.middleware.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | import { 4 | response_401, 5 | response_400, 6 | response_500, 7 | } from '../utils/responseCodes.js'; 8 | import User from '../models/user.model.js'; 9 | 10 | const guardMiddleware = async (req, res, next) => { 11 | try { 12 | const authHeader = req.header('Authorization'); 13 | 14 | if (!authHeader || !/(Bearer )\w+/.test(authHeader)) { 15 | // authorization header is not present or is not of the required format 16 | return response_400(res, 'Request is invalid'); 17 | } 18 | 19 | // extracting the token and verifying it 20 | const authToken = authHeader.replace('Bearer ', ''); 21 | 22 | let userMongoId; 23 | 24 | try { 25 | const { payload } = jwt.verify(authToken, process.env.SECRET); // will throw err if token is invalid or expired 26 | req.isAuthenticated = true; 27 | userMongoId = payload.id; 28 | } catch (err) { 29 | // token is invalid or expired 30 | return response_401(res, 'Request is unauthorized'); 31 | } 32 | 33 | // extracting user info from DB 34 | const user = await User.findById(userMongoId); 35 | 36 | if (!user || user.role!="Guard") { 37 | // user is not present in DB 38 | return response_401(res, 'Request is unauthorized'); 39 | } 40 | 41 | req.user = user; 42 | next(); 43 | } catch (err) { 44 | return response_500(res, 'Internal Server Error', err); 45 | } 46 | }; 47 | 48 | export default guardMiddleware; 49 | -------------------------------------------------------------------------------- /src/middlewares/student.middleware.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken'; 2 | 3 | import { 4 | response_401, 5 | response_400, 6 | response_500, 7 | } from '../utils/responseCodes.js'; 8 | import User from '../models/user.model.js'; 9 | 10 | const studentMiddleware = async (req, res, next) => { 11 | try { 12 | 13 | const authHeader = req.header('Authorization'); 14 | 15 | 16 | 17 | if (!authHeader || !/(Bearer )\w+/.test(authHeader)) { 18 | 19 | // authorization header is not present or is not of the required format 20 | 21 | return response_400(res, 'Request is invalid'); 22 | 23 | } 24 | 25 | 26 | 27 | // extracting the token and verifying it 28 | 29 | const authToken = authHeader.replace('Bearer ', ''); 30 | 31 | 32 | 33 | let userMongoId; 34 | 35 | 36 | 37 | try { 38 | 39 | const { payload } = jwt.verify(authToken, process.env.SECRET); // will throw err if token is invalid or expired 40 | 41 | req.isAuthenticated = true; 42 | 43 | userMongoId = payload.id; 44 | 45 | } catch (err) { 46 | 47 | // token is invalid or expired 48 | 49 | return response_401(res, 'Request is unauthorized'); 50 | 51 | } 52 | 53 | 54 | 55 | // extracting user info from DB 56 | 57 | const user = await User.findById(userMongoId); 58 | 59 | 60 | 61 | if (!user || user.role!="Student") { 62 | 63 | // user is not present in DB 64 | 65 | return response_401(res, 'Request is unauthorized'); 66 | 67 | } 68 | 69 | 70 | 71 | req.user = user; 72 | 73 | next(); 74 | 75 | } catch (err) { 76 | 77 | return response_500(res, 'Internal Server Error', err); 78 | 79 | } 80 | }; 81 | 82 | export default studentMiddleware; 83 | -------------------------------------------------------------------------------- /src/middlewares/warden.middleware.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/src/middlewares/warden.middleware.js -------------------------------------------------------------------------------- /src/models/form.model.js: -------------------------------------------------------------------------------- 1 | import { Schema, model } from 'mongoose'; 2 | 3 | const formSchema = new Schema( 4 | { 5 | name: { 6 | type: String, 7 | required: true, 8 | }, 9 | roll: { 10 | type: String, 11 | required: true, 12 | }, 13 | sem: { 14 | type: String, 15 | required: true, 16 | }, 17 | where: { 18 | type: String, 19 | required: true, 20 | }, 21 | purpose: { 22 | type: String, 23 | required: true, 24 | }, 25 | transport: { 26 | type: String, 27 | required: true, 28 | }, 29 | outtime: { 30 | type: String, 31 | required: true, 32 | }, 33 | date: { 34 | type: String, 35 | required: true, 36 | }, 37 | ownResponsibility: { 38 | type: Boolean, 39 | default: false, 40 | }, 41 | isUsed: { 42 | type: Boolean, 43 | default: false, 44 | }, 45 | isAccepted: { 46 | type: Boolean, 47 | }, 48 | otp: { 49 | type: String 50 | }, 51 | rejectReason: { 52 | type: String 53 | } 54 | 55 | }, 56 | { timestamps: true }, 57 | ); 58 | 59 | const Form = model('form', formSchema); 60 | 61 | export default Form; 62 | -------------------------------------------------------------------------------- /src/models/user.model.js: -------------------------------------------------------------------------------- 1 | import { model, Schema } from 'mongoose'; 2 | 3 | const userSchema = new Schema({ 4 | name:{ 5 | type: String, 6 | required: true, 7 | trim: true 8 | }, 9 | email:{ 10 | type: String, 11 | required: true, 12 | trim: true 13 | }, 14 | passwordHash:{ 15 | type: String, 16 | required: true 17 | }, 18 | role:{ 19 | type: String, 20 | required:true 21 | } 22 | }, { timestamps: true }); 23 | 24 | const User = model('user', userSchema); 25 | 26 | export default User; 27 | -------------------------------------------------------------------------------- /src/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/src/public/.gitkeep -------------------------------------------------------------------------------- /src/routes/admin.routes.js: -------------------------------------------------------------------------------- 1 | import adminMiddleware from '../middlewares/admin.middleware.js'; 2 | import { acceptedPasses, outpass, pendingPasses, rejectedPasses } from '../controllers/admin.controller.js'; 3 | import { getUserProfile, updatePassword } from '../controllers/user.controller.js'; 4 | 5 | import { Router } from 'express'; 6 | 7 | const router = Router(); 8 | 9 | // All routes configured here 10 | router.get('/', adminMiddleware, pendingPasses); 11 | router.post('/outpass', adminMiddleware, outpass); 12 | router.get('/accepted', adminMiddleware, acceptedPasses); 13 | router.get('/rejected', adminMiddleware, rejectedPasses); 14 | router.get('/profile', adminMiddleware, getUserProfile); 15 | router.patch('/profile/changePassword', adminMiddleware, updatePassword); 16 | 17 | export default router; -------------------------------------------------------------------------------- /src/routes/auth.routes.js: -------------------------------------------------------------------------------- 1 | // import handler (controller) functions to route them 2 | import { logIn, signUp } from '../controllers/auth.controller.js'; 3 | import { Router } from 'express'; 4 | const router = Router(); 5 | 6 | router.post('/login', logIn); 7 | router.post('/signup', signUp); 8 | 9 | export default router; -------------------------------------------------------------------------------- /src/routes/form.routes.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/src/routes/form.routes.js -------------------------------------------------------------------------------- /src/routes/guard.routes.js: -------------------------------------------------------------------------------- 1 | import guardMiddleware from '../middlewares/guard.middleware.js'; 2 | import { acceptOutpass, searchOutpass } from '../controllers/guard.controller.js'; 3 | import { getUserProfile, updatePassword } from '../controllers/user.controller.js'; 4 | 5 | import { Router } from 'express'; 6 | 7 | const router = Router(); 8 | 9 | // All routes configured here 10 | router.post('/', guardMiddleware, searchOutpass); 11 | router.patch('/accept', guardMiddleware, acceptOutpass); 12 | router.get('/profile', guardMiddleware, getUserProfile); 13 | router.patch('/profile/changePassword', guardMiddleware, updatePassword); 14 | 15 | export default router; 16 | 17 | -------------------------------------------------------------------------------- /src/routes/student.routes.js: -------------------------------------------------------------------------------- 1 | import studentMiddleware from '../middlewares/student.middleware.js'; 2 | import { newPass, passStatus, pastPasses } from '../controllers/student.controller.js'; 3 | import { getUserProfile, updatePassword } from '../controllers/user.controller.js'; 4 | 5 | import { Router } from 'express'; 6 | 7 | const router = Router(); 8 | 9 | // All routes configured here 10 | router.post('/', studentMiddleware, newPass); 11 | router.get('/history', studentMiddleware, pastPasses); 12 | router.get('/status', studentMiddleware, passStatus); 13 | router.get('/profile', studentMiddleware, getUserProfile); 14 | router.patch('/profile/changePassword', studentMiddleware, updatePassword); 15 | 16 | export default router; -------------------------------------------------------------------------------- /src/routes/user.routes.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opencodeiiita/EasyExit/5575c02e5bfcaab4eeeae902a4cbc3a707d940c7/src/routes/user.routes.js -------------------------------------------------------------------------------- /src/utils/password.js: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import crypto from 'crypto'; 3 | import jwt from 'jsonwebtoken'; 4 | 5 | dotenv.config(); 6 | 7 | const SECRET = process.env.SECRET || 'default_secret'; // Use the environment variable or a default value 8 | 9 | export function getJwt(object, expiresIn = '30d') { 10 | return jwt.sign(object, SECRET, { expiresIn }); 11 | } 12 | 13 | export async function hash_password(password) { 14 | return new Promise((resolve, reject) => { 15 | const salt = crypto.randomBytes(16).toString('hex'); 16 | 17 | crypto.scrypt(password, salt, 64, (err, derivedKey) => { 18 | if (err) reject(err); 19 | resolve(`${salt}:${derivedKey.toString('hex')}`); 20 | }); 21 | }); 22 | } 23 | 24 | // You can also use the getJwt function like this: 25 | const userObject = { userId: '123', username: 'john_doe' }; 26 | const token = getJwt(userObject); 27 | console.log('JWT Token:', token); 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/utils/responseCodes.js: -------------------------------------------------------------------------------- 1 | export function response_200(res, message, data) { 2 | return res.status(200).json({ 3 | status: 'OK', 4 | message, 5 | data, 6 | }); 7 | } 8 | 9 | export function response_201(res, message, data) { 10 | return res.status(201).json({ 11 | status: 'Inserted', 12 | message, 13 | data, 14 | }); 15 | } 16 | 17 | export function response_204(res, message) { 18 | return res.status(204).json({ 19 | status: 'No content', 20 | message, 21 | }); 22 | } 23 | 24 | export function response_400(res, message) { 25 | return res.status(400).json({ 26 | status: 'error', 27 | error: message, 28 | }); 29 | } 30 | 31 | export function response_401(res, message) { 32 | return res.status(401).json({ 33 | status: 'error', 34 | error: message, 35 | }); 36 | } 37 | 38 | export function response_403(res, message) { 39 | return res.status(403).json({ 40 | status: 'error', 41 | error: message, 42 | }); 43 | } 44 | 45 | export function response_404(res, message) { 46 | return res.status(404).json({ 47 | status: 'error', 48 | error: message, 49 | }); 50 | } 51 | 52 | export function response_500(res, log_message, err) { 53 | var message = err != null ? `${log_message}: ${err}` : log_message; 54 | 55 | console.debug(message); 56 | 57 | return res.status(500).json({ 58 | status: 'error', 59 | error: `Something went wrong.\n${message}`, 60 | }); 61 | } --------------------------------------------------------------------------------