├── .gitignore
├── client
├── .dockerignore
├── .gitignore
├── Dockerfile
├── README.md
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── Components
│ ├── addTask.js
│ ├── editTask.js
│ ├── home.js
│ ├── login.js
│ ├── myTasks.js
│ ├── navbar.js
│ ├── register.js
│ └── viewTask.js
│ ├── assets
│ ├── catmeme.gif
│ └── logo.png
│ ├── backendUrl.js
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── reportWebVitals.js
│ └── setupTests.js
├── docker-compose.yaml
└── server
├── .dockerignore
├── .gitignore
├── Dockerfile
├── db
└── connect.js
├── index.js
├── middleware
└── authenticate.js
├── model
├── taskSchema.js
└── userSchema.js
├── package-lock.json
├── package.json
├── routes.js
└── vercel.json
/.gitignore:
--------------------------------------------------------------------------------
1 | keys
--------------------------------------------------------------------------------
/client/.dockerignore:
--------------------------------------------------------------------------------
1 | # dependencies
2 | /node_modules
3 |
4 | .gitignore
--------------------------------------------------------------------------------
/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/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine
2 | WORKDIR /app/client
3 | COPY package*.json ./
4 | RUN npm install
5 | COPY . .
6 | EXPOSE 3000
7 | CMD ["npm", "start"]
--------------------------------------------------------------------------------
/client/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 | # T o d o - L i s t - W e b - A p p l i c a t i o n
72 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "todo-list-web-application",
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.18.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/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/priyanshudevsingh/Task-Management-System/446d10efb6edc22934314fde1f8a1f8f0719f0d7/client/public/favicon.ico
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 |
28 |
29 | Prioritize
30 |
31 |
32 | You need to enable JavaScript to run this app.
33 |
34 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/client/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/priyanshudevsingh/Task-Management-System/446d10efb6edc22934314fde1f8a1f8f0719f0d7/client/public/logo192.png
--------------------------------------------------------------------------------
/client/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/priyanshudevsingh/Task-Management-System/446d10efb6edc22934314fde1f8a1f8f0719f0d7/client/public/logo512.png
--------------------------------------------------------------------------------
/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/client/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@500&display=swap");
2 | * {
3 | font-family: "poppins", sans-serif;
4 | }
5 |
6 | body {
7 | margin: 0;
8 | padding: 0;
9 | }
10 |
11 | /* login & register page css */
12 | .loginpage {
13 | display: flex;
14 | justify-content: center;
15 | align-items: center;
16 | min-height: 89.5vh;
17 | width: 100%;
18 | background-color: #1b2430;
19 | }
20 |
21 | .registerpage {
22 | display: flex;
23 | justify-content: center;
24 | align-items: center;
25 | min-height: 89.5vh;
26 | width: 100%;
27 | background-color: #1b2430;
28 | }
29 |
30 | .form-box-login {
31 | position: relative;
32 | width: 450px;
33 | height: 350px;
34 | background: transparent;
35 | border: 2px solid rgba(255, 255, 255, 0.5);
36 | border-radius: 20px;
37 | display: flex;
38 | justify-content: center;
39 | align-items: center;
40 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
41 | }
42 |
43 | .form-box-register {
44 | position: relative;
45 | width: 450px;
46 | height: 480px;
47 | background: transparent;
48 | border: 2px solid rgba(255, 255, 255, 0.5);
49 | border-radius: 20px;
50 | display: flex;
51 | justify-content: center;
52 | align-items: center;
53 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
54 | }
55 |
56 | .textl {
57 | text-align: center;
58 | color: #bababa;
59 | margin: 0;
60 | font-weight: bold;
61 | }
62 |
63 | .textr {
64 | text-align: center;
65 | color: #bababa;
66 | margin: 0;
67 | }
68 |
69 | .inputbox {
70 | position: relative;
71 | margin: 25px 0;
72 | width: 300px;
73 | }
74 |
75 | .inputbox label {
76 | position: absolute;
77 | top: 50%;
78 | left: 5px;
79 | transform: translateY(-50%);
80 | color: #fff;
81 | font-size: 1em;
82 | pointer-events: none;
83 | transition: 0.5s;
84 | }
85 |
86 | .inputbox input {
87 | width: 100%;
88 | height: 50px;
89 | background: transparent;
90 | border: none;
91 | outline: none;
92 | font-size: 1em;
93 | padding: 0 35px 0 5px;
94 | color: #fff;
95 | border-bottom: 2px solid #fff;
96 | }
97 |
98 | .click input {
99 | width: 100%;
100 | height: 40px;
101 | border-radius: 40px;
102 | background: #f26c22;
103 | border: none;
104 | outline: none;
105 | cursor: pointer;
106 | font-size: 1em;
107 | font-weight: 600;
108 | color: #f5f2f2;
109 | }
110 |
111 | .already {
112 | margin: 5px;
113 | display: flex;
114 | justify-content: right;
115 | color: #f19a6b;
116 | text-decoration: underline;
117 | }
118 |
119 | .material-symbols-outlined {
120 | position: absolute;
121 | right: 8px;
122 | color: #f19a6b;
123 | font-size: 1.7em;
124 | }
125 |
126 | /* navbar css */
127 | nav {
128 | display: flex;
129 | align-items: center;
130 | justify-content: space-between;
131 | background-color: #1b2430;
132 | padding: 9px 10px;
133 | }
134 |
135 | #navbar {
136 | display: flex;
137 | align-items: center;
138 | justify-content: center;
139 | margin: 0px;
140 | }
141 |
142 | #navbar li {
143 | list-style: none;
144 | padding: 0px 20px;
145 | position: relative;
146 | }
147 |
148 | #navbar li a {
149 | text-decoration: none;
150 | font-size: 1.15rem;
151 | font-weight: 600;
152 | color: #fff;
153 | transition: 0.3s ease-in-out;
154 | }
155 |
156 | #navbar li a:hover {
157 | color: #f26c22;
158 | }
159 |
160 | #navbar li a:hover::after {
161 | content: "";
162 | width: 30%;
163 | height: 2px;
164 | background-color: #f26c22;
165 | position: absolute;
166 | bottom: -4px;
167 | left: 20px;
168 | }
169 |
170 | .logout {
171 | cursor: pointer;
172 | }
173 |
174 | /* Responsive Styles for Mobile */
175 | @media (max-width: 768px) {
176 | nav {
177 | flex-direction: column;
178 | padding: 10px;
179 | }
180 |
181 | #navbar {
182 | flex-direction: column;
183 | margin-top: 10px;
184 | }
185 |
186 | #navbar li {
187 | padding: 10px 0;
188 | }
189 |
190 | #navbar li a {
191 | font-size: 1rem;
192 | }
193 |
194 | #navbar li a:hover::after {
195 | content: "";
196 | width: 100%;
197 | height: 2px;
198 | background-color: #f26c22;
199 | position: absolute;
200 | bottom: -4px;
201 | left: 0;
202 | }
203 | }
204 |
205 |
206 | /* My Tasks page css */
207 | .tasktable {
208 | display: flex;
209 | justify-content: center;
210 | align-items: flex-start;
211 | min-height: 89.5vh;
212 | width: 100%;
213 | background-color: #1b2430;
214 | }
215 |
216 | .content-table {
217 | border-collapse: collapse;
218 | margin: 10px auto;
219 | font-size: 0.9em;
220 | min-width: 1000px;
221 | border-radius: 20px 20px 0 0;
222 | overflow: hidden;
223 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
224 | justify-content: center;
225 | align-items: center;
226 | }
227 |
228 | /* Media query for smaller screens */
229 | @media (max-width: 1050px) {
230 | .content-table {
231 | min-width: 100%;
232 | }
233 | }
234 |
235 | .content-table thead tr {
236 | background-color: #f26c22;
237 | color: #1b2430;
238 | text-align: left;
239 | }
240 |
241 | .content-table th,
242 | .content-table td {
243 | padding: 10px 15px;
244 | }
245 |
246 | .content-table tbody tr:nth-of-type(even) {
247 | background-color: #e3e1e1;
248 | }
249 |
250 | .content-table tbody tr:nth-of-type(odd) {
251 | background-color: #ffffff;
252 | }
253 |
254 | .content-table tbody tr:last-of-type {
255 | border-bottom: 3.5px solid #f26c22;
256 | }
257 |
258 | .content-table a {
259 | text-decoration: none;
260 | color: #3481e7;
261 | font-weight: bold;
262 | }
263 |
264 | .content-table a:hover {
265 | color: #f26c22;
266 | }
267 |
268 | .Low {
269 | color: #3bc240;
270 | font-weight: bold;
271 | }
272 |
273 | .Medium {
274 | color: #f1a824;
275 | font-weight: bold;
276 | }
277 |
278 | .High {
279 | color: #d23636;
280 | font-weight: bold;
281 | }
282 |
283 | .text1 {
284 | text-align: center;
285 | color: #bababa;
286 | margin: 0;
287 | font-weight: bold;
288 | }
289 |
290 | .sort {
291 | color: #f26c22;
292 | display: block;
293 | align-items: center;
294 | margin: 0 0 5px 0;
295 | }
296 |
297 | .label {
298 | margin-right: 10px;
299 | font-weight: bold;
300 | }
301 |
302 | .select {
303 | border-radius: 10px;
304 | border: 2px solid #9d9b9b;
305 | background-color: #1b2430;
306 | color: #fff;
307 | }
308 |
309 | .download-link {
310 | display: inline-block;
311 | padding: 10px;
312 | background-color: #f26c22;
313 | color: #fff;
314 | text-decoration: none;
315 | border-radius: 15px;
316 | margin-top: 16px;
317 | }
318 |
319 | .download-link:hover {
320 | background-color: #0056b3;
321 | }
322 |
323 | /* Add Task page css */
324 | .addtaskpage {
325 | display: flex;
326 | justify-content: center;
327 | align-items: center;
328 | min-height: 89.5vh;
329 | width: 100%;
330 | background-color: #1b2430;
331 | }
332 |
333 | .form-box-addtask {
334 | position: relative;
335 | width: 700px;
336 | height: 450px;
337 | background: transparent;
338 | border: 2px solid rgba(255, 255, 255, 0.5);
339 | border-radius: 20px;
340 | display: flex;
341 | justify-content: center;
342 | align-items: center;
343 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
344 | }
345 |
346 | .text1 {
347 | text-align: center;
348 | color: #bababa;
349 | margin: 0;
350 | font-weight: bold;
351 | padding: 0 0 20px 0;
352 | }
353 |
354 | .inputboxaddtask {
355 | margin-bottom: 15px;
356 | outline: none;
357 | }
358 |
359 | label {
360 | display: block;
361 | font-size: 14px;
362 | font-weight: 500;
363 | margin-bottom: 5px;
364 | }
365 |
366 | .date-inputs {
367 | display: flex;
368 | }
369 |
370 | .date-input {
371 | width: 40px;
372 | margin-right: 5px;
373 | }
374 |
375 | .click {
376 | text-align: center;
377 | }
378 |
379 | select[name="priority"] option {
380 | font-weight: bold;
381 | color: #1b2430;
382 | }
383 | select[name="priority"] option[name="Low"] {
384 | font-weight: bold;
385 | color: #3bc240;
386 | }
387 | select[name="priority"] option[name="Medium"] {
388 | font-weight: bold;
389 | color: #f1a824;
390 | }
391 | select[name="priority"] option[name="High"] {
392 | font-weight: bold;
393 | color: #d23636;
394 | }
395 |
396 | select[name="status"] option {
397 | font-weight: bold;
398 | color: #1b2430;
399 | }
400 |
401 | .dd{
402 | color: #bababa;
403 | padding: 0 0 0 10px;
404 | }
405 |
406 | /* View Task page css */
407 | .everything {
408 | background-color: #1b2430;
409 | min-height: 89.5vh;
410 | width: 100%;
411 | }
412 |
413 | .task-details {
414 | display: flex;
415 | justify-content: center;
416 | align-items: flex-start;
417 | min-height: 89.5vh;
418 | width: 100%;
419 | background-color: #1b2430;
420 | }
421 |
422 | .task-box {
423 | position: relative;
424 | min-width: 400px;
425 | max-width: 1000px;
426 | background: transparent;
427 | border: 2px solid rgba(255, 255, 255, 0.5);
428 | border-radius: 20px;
429 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
430 | }
431 |
432 | .mega-content {
433 | padding: 20px 25px 25px 25px;
434 | font-weight: 900;
435 | font-size: 1.5em;
436 | color: #d5d5d5;
437 | }
438 |
439 | .des {
440 | padding: 0 25px 0 25px;
441 | font-weight: bold;
442 | color: #9c9c9c;
443 | }
444 |
445 | .des-content {
446 | padding: 0 25px 0 65px;
447 | color: #fff;
448 | font-size: 0.95em;
449 | }
450 |
451 | .pri {
452 | padding: 10px 25px 0 25px;
453 | font-weight: bold;
454 | color: #9c9c9c;
455 | }
456 |
457 | .ddd {
458 | padding: 10px 25px 25px 25px;
459 | font-weight: bold;
460 | color: #9c9c9c;
461 | }
462 |
463 | .sta {
464 | padding: 10px 25px 0 25px;
465 | font-weight: bold;
466 | color: #9c9c9c;
467 | }
468 |
469 | .dd-content,
470 | .sta-content {
471 | color: #fff;
472 | font-weight: lighter;
473 | font-size: 0.9em;
474 | }
475 |
476 | .priority-low {
477 | color: #3bc240;
478 | }
479 |
480 | .priority-medium {
481 | color: #f1a824;
482 | }
483 |
484 | .priority-high {
485 | color: #d23636;
486 | }
487 |
488 | button.edit-task {
489 | margin: 0 25px 20px 25px;
490 | padding: 10px 15px;
491 | border: none;
492 | color: #fff;
493 | font-weight: bold;
494 | border-radius: 5px;
495 | cursor: pointer;
496 | background-color: #f26c22;
497 | }
498 |
499 | button.delete-task {
500 | padding: 10px 15px;
501 | border: none;
502 | color: #fff;
503 | font-weight: bold;
504 | border-radius: 5px;
505 | cursor: pointer;
506 | background-color: #fa0000;
507 | }
508 |
509 | .text1 {
510 | text-align: center;
511 | color: #bababa;
512 | margin: 0;
513 | font-weight: bold;
514 | }
515 |
516 | .hist-details {
517 | display: flex;
518 | justify-content: center;
519 | align-items: flex-start;
520 | min-height: 89.5vh;
521 | width: 100%;
522 | background-color: #1b2430;
523 | }
524 |
525 | .content-table {
526 | border-collapse: collapse;
527 | margin: 10px auto;
528 | font-size: 0.9em;
529 | min-width: 1000px;
530 | max-width: 1200px;
531 | border-radius: 20px 20px 0 0;
532 | overflow: hidden;
533 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
534 | justify-content: center;
535 | align-items: center;
536 | }
537 |
538 | /* Media query for smaller screens */
539 | @media (max-width: 1050px) {
540 | .content-table {
541 | min-width: 100%;
542 | }
543 | }
544 |
545 | .content-table thead tr {
546 | background-color: #f26c22;
547 | color: #1b2430;
548 | text-align: center;
549 | font-size: 1.2em;
550 | font-weight: bold;
551 | }
552 |
553 | .content-table th,
554 | .content-table td {
555 | padding: 10px 15px;
556 | }
557 |
558 | .content-table tbody tr:nth-of-type(even) {
559 | background-color: #e3e1e1;
560 | }
561 |
562 | .content-table tbody tr:nth-of-type(odd) {
563 | background-color: #ffffff;
564 | }
565 |
566 | .content-table tbody tr:last-of-type {
567 | border-bottom: 3.5px solid #f26c22;
568 | }
569 |
570 | .mainh{
571 | color: #f26c22;
572 | font-weight: bold;
573 | font-size: 1.2em;
574 | }
575 |
576 | .before, .after{
577 | font-weight: bold;
578 | padding: 0 0 0 20px;
579 | }
580 |
581 | .histcont{
582 | font-weight: lighter;
583 | font-size: 0.95em;
584 | }
585 |
586 | .udttime{
587 | color: #000000;
588 | font-weight: lighter;
589 | font-size: 0.95em;
590 | }
591 |
592 | /* Edit Task page css */
593 | .edittaskpage {
594 | display: flex;
595 | justify-content: center;
596 | align-items: center;
597 | min-height: 89.5vh;
598 | width: 100%;
599 | background-color: #1b2430;
600 | }
601 |
602 | .form-box-edittask {
603 | position: relative;
604 | width: 700px;
605 | height: 450px;
606 | background: transparent;
607 | border: 2px solid rgba(255, 255, 255, 0.5);
608 | border-radius: 20px;
609 | display: flex;
610 | justify-content: center;
611 | align-items: center;
612 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
613 | }
614 |
615 | .text1 {
616 | text-align: center;
617 | color: #bababa;
618 | margin: 0;
619 | font-weight: bold;
620 | padding: 0 0 20px 0;
621 | }
622 |
623 | .inputboxedittask {
624 | margin-bottom: 15px;
625 | outline: none;
626 | }
627 |
628 | input[type="text"],
629 | select {
630 | width: 100%;
631 | padding: 10px;
632 | border: 2px solid rgba(255, 255, 255, 0.5);
633 | border-radius: 20px;
634 | font-size: 14px;
635 | box-sizing: border-box;
636 | background: transparent;
637 | color: #bababa;
638 | }
639 |
640 | .date-inputs {
641 | display: flex;
642 | }
643 |
644 | .date-input {
645 | width: 40px;
646 | margin-right: 5px;
647 | }
648 |
649 | .click {
650 | text-align: center;
651 | }
652 |
653 | select[name="priority"] option {
654 | font-weight: bold;
655 | color: #1b2430;
656 | }
657 | select[name="priority"] option[name="Low"] {
658 | font-weight: bold;
659 | color: #3bc240;
660 | }
661 | select[name="priority"] option[name="Medium"] {
662 | font-weight: bold;
663 | color: #f1a824;
664 | }
665 | select[name="priority"] option[name="High"] {
666 | font-weight: bold;
667 | color: #d23636;
668 | }
669 |
670 | select[name="status"] option {
671 | font-weight: bold;
672 | color: #1b2430;
673 | }
674 |
675 | .dd {
676 | color: #bababa;
677 | padding: 0 0 0 10px;
678 | }
679 |
680 | /* home page css */
681 | .linkedinlink {
682 | color: #f19a6b;
683 | text-decoration: underline;
684 | }
685 |
686 | .homepage {
687 | background-color: #1b2430;
688 | min-height: 89.5vh;
689 | width: 100%;
690 | }
691 |
692 | .text1 {
693 | color: #c5c5c5;
694 | text-align: center;
695 | margin: 0;
696 | padding: 0 0 15px 0;
697 | font-weight: bold;
698 | }
699 |
700 | .text4 {
701 | color: #c5c5c5;
702 | text-align: center;
703 | margin: 0;
704 | padding: 0;
705 | }
706 |
707 | @keyframes colorChange {
708 | 0% {
709 | color: #04ff0d;
710 | }
711 | 25% {
712 | color: #f26c22;
713 | }
714 | 50% {
715 | color: #ffc965;
716 | }
717 | 75% {
718 | color: #ff6df5;
719 | }
720 | 100% {
721 | color: #9bff82;
722 | }
723 | }
724 |
725 | .tuoj {
726 | animation: colorChange 3s infinite;
727 | font-weight: bold;
728 | }
729 |
730 | .catmeme {
731 | display: block;
732 | margin: 0 auto;
733 | padding: 0 0 10px 0;
734 | box-shadow: 0 5px 200px rgba(242, 108, 34, 1);
735 | border-radius: 20px 20px 20px 20px;
736 | }
737 |
738 | .redirectbut {
739 | display: block;
740 | margin: 0 auto;
741 | padding: 5px 10px 5px 10px;
742 | font-weight: 1000;
743 | border-radius: 20px 20px 20px 20px;
744 | cursor: pointer;
745 | background-color: #f26c22;
746 | }
747 |
--------------------------------------------------------------------------------
/client/src/App.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { BrowserRouter, Routes, Route } from "react-router-dom";
3 | import "./App.css";
4 | import NavBar from "./Components/navbar";
5 | import Home from "./Components/home";
6 | import AddTask from "./Components/addTask";
7 | import MyTasks from "./Components/myTasks";
8 | import Login from "./Components/login";
9 | import Register from "./Components/register";
10 | import ViewTask from "./Components/viewTask";
11 | import EditTask from "./Components/editTask";
12 |
13 | function App() {
14 | return (
15 | <>
16 |
17 |
18 |
19 | } />
20 | } />
21 | } />
22 | } />
23 | } />
24 | } />
25 | } />
26 |
27 |
28 | >
29 | );
30 | }
31 |
32 | export default App;
33 |
--------------------------------------------------------------------------------
/client/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render( );
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/client/src/Components/addTask.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { useNavigate } from "react-router-dom";
3 | import { backendUrl } from "../backendUrl";
4 |
5 | const AddTask = () => {
6 | const navigate = useNavigate();
7 |
8 | let email='';
9 | const [userEmail, setuserEmail] = useState("");
10 | const [title, setTitle] = useState("");
11 | const [description, setDescription] = useState("");
12 | const [priority, setPriority] = useState("");
13 | const [status, setStatus] = useState("");
14 | const [duedateDay, setDuedateDay] = useState("");
15 | const [duedateMonth, setDuedateMonth] = useState("");
16 | const [duedateYear, setDuedateYear] = useState("");
17 |
18 | useEffect(() => {
19 | fetchUserData();
20 | }, []);
21 |
22 | const fetchUserData = async () => {
23 | try {
24 | const res = await fetch(`${backendUrl}/userdata`, {
25 | method: "GET",
26 | headers: {
27 | Accept: "application/json",
28 | "Content-Type": "application/json",
29 | Authorization: localStorage.getItem("jwtToken"),
30 | },
31 | credentials: "include",
32 | });
33 |
34 | const data = await res.json();
35 | email=data.email;
36 | setuserEmail(data.email);
37 | } catch (error) {
38 | console.log(error);
39 | navigate("/login");
40 | }
41 | };
42 |
43 | const addTask = async (e) => {
44 | e.preventDefault();
45 |
46 | if (!duedateDay || !duedateMonth || !duedateYear) {
47 | window.alert("You're missing the Due Date");
48 | console.log("You're missing the Due Date");
49 | return;
50 | }
51 |
52 | const duedate = `${duedateDay}-${duedateMonth}-${duedateYear}`;
53 |
54 | if (!title || !description || !duedate || !priority || !status) {
55 | window.alert("You're missing some fields");
56 | console.log("You're missing some fields");
57 | return;
58 | }
59 |
60 | try {
61 | const res = await fetch(
62 | `${backendUrl}/addtask?email=${encodeURIComponent(email || userEmail)}`,
63 | {
64 | method: "POST",
65 | headers: {
66 | Accept: "application/json",
67 | "Content-Type": "application/json",
68 | Authorization: localStorage.getItem("jwtToken"),
69 | },
70 | credentials: "include",
71 | body: JSON.stringify({
72 | title,
73 | description,
74 | duedate,
75 | priority,
76 | status,
77 | }),
78 | }
79 | );
80 |
81 | const data = await res.json();
82 | console.log(data);
83 |
84 | if (data) {
85 | alert("Task Added Successfully");
86 | console.log("Task Added Successfully");
87 | navigate("/mytasks");
88 | }
89 | } catch (error) {
90 | console.log(error);
91 | if (error.res && error.res.status === 422) {
92 | alert("You're missing some fields");
93 | }
94 | }
95 | };
96 |
97 | return (
98 |
205 | );
206 | };
207 |
208 | export default AddTask;
209 |
--------------------------------------------------------------------------------
/client/src/Components/editTask.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import { useNavigate, useParams } from 'react-router-dom';
3 | import { backendUrl } from "../backendUrl";
4 |
5 | const Edittask = () => {
6 | const navigate = useNavigate();
7 | const { taskId } = useParams();
8 |
9 | let email='';
10 | const [userEmail, setuserEmail] = useState('');
11 | const [title, setTitle] = useState('');
12 | const [description, setDescription] = useState('');
13 | const [priority, setPriority] = useState('');
14 | const [status, setStatus] = useState('');
15 | const [duedateDay, setDuedateDay] = useState('');
16 | const [duedateMonth, setDuedateMonth] = useState('');
17 | const [duedateYear, setDuedateYear] = useState('');
18 |
19 | useEffect(() => {
20 | fetchUserData();
21 | }, []);
22 |
23 | const fetchUserData = async () => {
24 | try {
25 | const res = await fetch(`${backendUrl}/userdata`, {
26 | method: "GET",
27 | headers: {
28 | Accept: "application/json",
29 | "Content-Type": "application/json",
30 | Authorization: localStorage.getItem("jwtToken"),
31 | },
32 | credentials: "include",
33 | });
34 |
35 | const data = await res.json();
36 | email=data.email;
37 | setuserEmail(data.email);
38 | callTasks();
39 | } catch (error) {
40 | console.log(error);
41 | navigate("/login");
42 | }
43 | };
44 |
45 | const callTasks = async () => {
46 | try {
47 | const res = await fetch(`${backendUrl}/viewtask/${taskId}?email=${encodeURIComponent(email || userEmail)}`, {
48 | headers: {
49 | Accept: 'application/json',
50 | 'Content-Type': 'application/json',
51 | Authorization: localStorage.getItem('jwtToken'),
52 | },
53 | credentials: "include",
54 | });
55 |
56 | const data = await res.json();
57 | if (data) {
58 | console.log(data);
59 | setTitle(data.title || '');
60 | setDescription(data.description || '');
61 | setPriority(data.priority || '');
62 | setStatus(data.status || '');
63 |
64 | if (data.duedate) {
65 | const [day, month, year] = data.duedate.split('-');
66 | setDuedateDay(day || '');
67 | setDuedateMonth(month || '');
68 | setDuedateYear(year || '');
69 | }
70 | }
71 | } catch (error) {
72 | console.log(error);
73 | navigate('/login');
74 | }
75 | };
76 |
77 | const editTask = async (e) => {
78 | e.preventDefault();
79 | const duedate = `${duedateDay}-${duedateMonth}-${duedateYear}`;
80 |
81 | if (!title || !description || !duedate || !priority || !status) {
82 | window.alert("You're missing some fields");
83 | console.log("You're missing some fields");
84 | return;
85 | }
86 |
87 | try {
88 | const res = await fetch(
89 | `${backendUrl}/edittask/${taskId}?email=${encodeURIComponent(email || userEmail)}`,
90 | {
91 | method: "PATCH",
92 | headers: {
93 | Accept: "application/json",
94 | "Content-Type": "application/json",
95 | Authorization: localStorage.getItem("jwtToken"),
96 | },
97 | credentials: "include",
98 | body: JSON.stringify({
99 | title,
100 | description,
101 | duedate,
102 | priority,
103 | status,
104 | }),
105 | }
106 | );
107 |
108 | const data = await res.json();
109 | console.log(data);
110 | if (data) {
111 | alert('Task Edited successfully');
112 | console.log('Task Edited successfully');
113 | navigate(`/viewtask/${taskId}`);
114 | } else {
115 | alert('Failed to Edit task.');
116 | console.log('Failed to Edit task.');
117 | }
118 | } catch (error) {
119 | console.log(error);
120 | }
121 | };
122 |
123 | return (
124 |
229 | );
230 | };
231 |
232 | export default Edittask;
233 |
--------------------------------------------------------------------------------
/client/src/Components/home.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import catmeme from "../assets/catmeme.gif";
3 | import { useNavigate } from "react-router-dom";
4 |
5 | const Home = () => {
6 | const navigate = useNavigate();
7 | const redirect = (e) => {
8 | e.preventDefault();
9 | navigate("/mytasks");
10 | };
11 |
12 | return (
13 | <>
14 |
15 |
16 | Welcome to Prioritize , a MERN
17 | stack-based Task Management System!
18 |
19 |
20 |
21 | Made With ❤️ By
22 |
26 | Priyanshu Singh
27 |
28 |
29 |
30 |
31 |
32 |
33 | View your Tasks
34 |
35 |
36 | >
37 | );
38 | };
39 |
40 | export default Home;
41 |
--------------------------------------------------------------------------------
/client/src/Components/login.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { NavLink, useNavigate } from "react-router-dom";
3 | import { backendUrl } from "../backendUrl.js";
4 |
5 | const Login = () => {
6 | const navigate = useNavigate();
7 |
8 | const [email, setEmail] = useState("");
9 | const [password, setPassword] = useState("");
10 |
11 | // connecting login page to backend
12 | const PostData = async (e) => {
13 | try {
14 | e.preventDefault();
15 |
16 | const res = await fetch(`${backendUrl}/login`, {
17 | method: "POST",
18 | headers: {
19 | "Content-Type": "application/json",
20 | },
21 | credentials: "include",
22 | body: JSON.stringify({
23 | email,
24 | password,
25 | }),
26 | });
27 |
28 | const data = await res.json();
29 |
30 | if (!data) {
31 | window.alert("You're missing some fields");
32 | console.log("You're missing some fields");
33 | } else if (res.status === 422) {
34 | window.alert("You're missing some fields");
35 | console.log("You're missing some fields");
36 | } else if (res.status === 400) {
37 | window.alert("Invalid Credentials");
38 | console.log("Invalid Credentials");
39 | } else {
40 | localStorage.setItem("jwtToken", data.token);
41 | window.alert("Login Successful");
42 | console.log("Login Successful");
43 | navigate("/");
44 | }
45 | } catch (err) {
46 | console.log(err);
47 | }
48 | };
49 |
50 | return (
51 | <>
52 |
53 |
54 |
55 |
92 |
93 |
94 | Not Registered Yet?
95 |
96 |
97 |
98 |
99 | >
100 | );
101 | };
102 |
103 | export default Login;
104 |
--------------------------------------------------------------------------------
/client/src/Components/myTasks.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { useNavigate } from "react-router-dom";
3 | import { backendUrl } from "../backendUrl";
4 |
5 | const Mytasks = () => {
6 | const navigate = useNavigate();
7 |
8 | const [tasks, setTasks] = useState(null);
9 | const [userEmail, setuserEmail] = useState("");
10 | let email='';
11 |
12 | useEffect(() => {
13 | fetchUserData();
14 | }, []);
15 |
16 | const fetchUserData = async () => {
17 | try {
18 | const res = await fetch(`${backendUrl}/userdata`, {
19 | method: "GET",
20 | headers: {
21 | Accept: "application/json",
22 | "Content-Type": "application/json",
23 | Authorization: localStorage.getItem("jwtToken"),
24 | },
25 | credentials: "include",
26 | });
27 |
28 | const data = await res.json();
29 | email=data.email;
30 | setuserEmail(data.email);
31 | callTasks();
32 | } catch (error) {
33 | console.log(error);
34 | navigate("/login");
35 | }
36 | };
37 |
38 | const callTasks = async () => {
39 | try {
40 | const res = await fetch(
41 | `${backendUrl}/mytasks?email=${encodeURIComponent(email || userEmail)}`,
42 | {
43 | method: "GET",
44 | headers: {
45 | Accept: "application/json",
46 | "Content-Type": "application/json",
47 | Authorization: localStorage.getItem("jwtToken"),
48 | },
49 | credentials: "include",
50 | }
51 | );
52 |
53 | const data = await res.json();
54 | setTasks(data);
55 | } catch (error) {
56 | console.log(error);
57 | navigate("/login");
58 | }
59 | };
60 |
61 | let sortOpt = "";
62 |
63 | const sortTasks = () => {
64 | let sortedTasks = [...tasks];
65 | if (sortOpt === "priority") {
66 | sortedTasks.sort((a, b) => comparePriority(a.priority, b.priority));
67 | } else if (sortOpt === "status") {
68 | sortedTasks.sort((a, b) => compareStatus(a.status, b.status));
69 | } else if (sortOpt === "duedate") {
70 | sortedTasks.sort((a, b) => compareDueDate(a.duedate, b.duedate));
71 | }
72 | setTasks([...sortedTasks]);
73 | };
74 |
75 | const comparePriority = (priorityA, priorityB) => {
76 | const priorityOrder = { High: 1, Medium: 2, Low: 3 };
77 | return priorityOrder[priorityA] - priorityOrder[priorityB];
78 | };
79 |
80 | const compareStatus = (statusA, statusB) => {
81 | const statusOrder = { "To-Do": 1, "In-Progress": 2, Completed: 3 };
82 | return statusOrder[statusA] - statusOrder[statusB];
83 | };
84 |
85 | const compareDueDate = (dateA, dateB) => {
86 | const dateAComponents = dateA.split("-").map(Number);
87 | const dateBComponents = dateB.split("-").map(Number);
88 |
89 | for (let i = 2; i >= 0; i--) {
90 | if (dateAComponents[i] < dateBComponents[i]) return -1;
91 | if (dateAComponents[i] > dateBComponents[i]) return 1;
92 | }
93 |
94 | return 0;
95 | };
96 |
97 | const calDateTime = (createdAt) => {
98 | const dateTime = new Date(createdAt);
99 |
100 | const day = String(dateTime.getDate()).padStart(2, "0");
101 | const month = String(dateTime.getMonth() + 1).padStart(2, "0");
102 | const year = dateTime.getFullYear();
103 |
104 | const hours = String(dateTime.getHours()).padStart(2, "0");
105 | const minutes = String(dateTime.getMinutes()).padStart(2, "0");
106 |
107 | return `${day}-${month}-${year} at ${hours}:${minutes}`;
108 | };
109 |
110 | const generateCSV = () => {
111 | let csv = "Title, Description, Due Date, Priority, Status, Created At\n";
112 | tasks.forEach((task) => {
113 | csv += `"${task.title}","${task.description}","${task.duedate}","${
114 | task.priority
115 | }","${task.status}","${calDateTime(task.createdAt)}"\n`;
116 | });
117 | return csv;
118 | };
119 |
120 | const generateDownloadLink = () => {
121 | const csvData = generateCSV();
122 | const blob = new Blob([csvData], { type: "csv" });
123 | return URL.createObjectURL(blob);
124 | };
125 |
126 | const onSortBy = (event) => {
127 | const selectedValue = event.target.value;
128 | sortOpt = selectedValue;
129 | sortTasks();
130 | };
131 |
132 | return (
133 |
134 | {tasks ? (
135 |
136 | {/* for sorting */}
137 |
138 |
139 | Sort By:
140 |
141 |
147 | Select Sorting Option
148 | Priority
149 | Status
150 | Due Date
151 |
152 |
153 |
154 | {/* For downloading .csv file */}
155 |
160 | Download CSV
161 |
162 |
163 | {/* task list display */}
164 |
165 |
166 |
167 | Title
168 | Due Date
169 | Priority
170 | Status
171 |
172 |
173 |
174 | {tasks.map((i) => (
175 |
176 |
177 | {i.title}
178 |
179 | {i.duedate}
180 | {i.priority}
181 | {i.status}
182 |
183 | ))}
184 |
185 |
186 |
187 | ):(Loading...
)}
188 |
189 |
190 | );
191 | };
192 |
193 | export default Mytasks;
194 |
--------------------------------------------------------------------------------
/client/src/Components/navbar.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import logo from "../assets/logo.png";
3 | import { NavLink, useNavigate } from "react-router-dom";
4 |
5 | const NavBar = () => {
6 | const [auth, setAuth] = useState(false);
7 | const navigate = useNavigate();
8 |
9 | const fetchAuthStatus = async () => {
10 | try {
11 | const jwtToken = localStorage.getItem("jwtToken");
12 | if (!jwtToken) {
13 | setAuth(false);
14 | } else {
15 | setAuth(true);
16 | }
17 | } catch (err) {
18 | console.log(err);
19 | }
20 | };
21 |
22 | useEffect(() => {
23 | fetchAuthStatus();
24 | });
25 |
26 | const handlelogout = () => {
27 | localStorage.removeItem("jwtToken");
28 | navigate("/login");
29 | setAuth(false);
30 | };
31 |
32 | const RenderMenu = () => {
33 | return (
34 | <>
35 |
41 |
42 |
43 |
44 | Home
45 |
46 |
47 | Add Task
48 |
49 |
50 | My Tasks
51 |
52 | {auth ? (
53 |
54 |
55 | LogOut
56 |
57 |
58 | ) : (
59 | <>
60 |
61 | Register
62 |
63 |
64 | Login
65 |
66 | >
67 | )}
68 |
69 |
70 | >
71 | );
72 | };
73 |
74 | return (
75 | <>
76 |
77 |
78 |
79 | >
80 | );
81 | };
82 |
83 | export default NavBar;
84 |
--------------------------------------------------------------------------------
/client/src/Components/register.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { NavLink, useNavigate } from "react-router-dom";
3 | import { backendUrl } from "../backendUrl";
4 |
5 | const Register = () => {
6 | const navigate = useNavigate();
7 | const [user, setUser] = useState({
8 | name: "",
9 | email: "",
10 | password: "",
11 | cpassword: "",
12 | });
13 |
14 | let name, value;
15 | const handleInputs = (e) => {
16 | name = e.target.name;
17 | value = e.target.value;
18 | setUser({ ...user, [name]: value });
19 | };
20 |
21 | // connecting register page to backend
22 | const PostData = async (e) => {
23 | e.preventDefault();
24 |
25 | const { name, email, password, cpassword } = user;
26 |
27 | const res = await fetch(`${backendUrl}/register`, {
28 | method: "POST",
29 | headers: {
30 | "Content-Type": "application/json",
31 | },
32 | credentials: "include",
33 | body: JSON.stringify({
34 | name,
35 | email,
36 | password,
37 | cpassword,
38 | }),
39 | });
40 |
41 | const data = await res.json();
42 |
43 | if (!data) {
44 | window.alert("You're missing some fields");
45 | console.log("You're missing some fields");
46 | } else if (res.status === 422) {
47 | window.alert("You're missing some fields");
48 | console.log("You're missing some fields");
49 | } else if (res.status === 409) {
50 | window.alert("Email already Exists");
51 | console.log("Email already Exists");
52 | } else if (res.status === 406) {
53 | window.alert("This UserID is not available");
54 | console.log("This UserID is not available");
55 | } else if (res.status === 400) {
56 | window.alert("Passwords are not matching");
57 | console.log("Passwords are not matching");
58 | } else {
59 | window.alert("Registration Successful");
60 | console.log("Registration Successful");
61 | navigate("/login");
62 | }
63 | };
64 |
65 | return (
66 | <>
67 |
68 |
69 |
70 |
137 |
138 |
139 | I am already registered!
140 |
141 |
142 |
143 |
144 | >
145 | );
146 | };
147 |
148 | export default Register;
149 |
--------------------------------------------------------------------------------
/client/src/Components/viewTask.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from "react";
2 | import { useNavigate, useParams } from "react-router-dom";
3 | import { backendUrl } from "../backendUrl";
4 |
5 | const ViewTask = () => {
6 | const navigate = useNavigate();
7 | const { taskId } = useParams();
8 | const [userEmail, setuserEmail] = useState("");
9 | const [task, setTask] = useState("");
10 | const [hist, setHist] = useState(null);
11 |
12 | let email = "";
13 |
14 | useEffect(() => {
15 | fetchUserData();
16 | }, []);
17 |
18 | const getPriorityClass = (priority) => {
19 | switch (priority) {
20 | case "Low":
21 | return "priority-low";
22 | case "Medium":
23 | return "priority-medium";
24 | case "High":
25 | return "priority-high";
26 | default:
27 | return "";
28 | }
29 | };
30 |
31 | const fetchUserData = async () => {
32 | try {
33 | const res = await fetch(`${backendUrl}/userdata`, {
34 | method: "GET",
35 | headers: {
36 | Accept: "application/json",
37 | "Content-Type": "application/json",
38 | Authorization: localStorage.getItem("jwtToken"),
39 | },
40 | credentials: "include",
41 | });
42 |
43 | const data = await res.json();
44 | email = data.email;
45 | setuserEmail(data.email);
46 | callTasks();
47 | viewHistory();
48 | } catch (error) {
49 | console.log(error);
50 | navigate("/login");
51 | }
52 | };
53 |
54 | const callTasks = async () => {
55 | try {
56 | const res = await fetch(
57 | `${backendUrl}/viewtask/${taskId}?email=${encodeURIComponent(
58 | email || userEmail
59 | )}`,
60 | {
61 | method: "GET",
62 | headers: {
63 | Accept: "application/json",
64 | "Content-Type": "application/json",
65 | Authorization: localStorage.getItem("jwtToken"),
66 | },
67 | credentials: "include",
68 | }
69 | );
70 |
71 | const data = await res.json();
72 | setTask(data);
73 | } catch (error) {
74 | console.log(error);
75 | navigate("/mytasks");
76 | }
77 | };
78 |
79 | const calAgoTime = (createdAt) => {
80 | const currentTime = Date.now();
81 | const givenTime = new Date(createdAt).getTime();
82 | const timeDifference = currentTime - givenTime;
83 |
84 | const seconds = Math.floor(timeDifference / 1000);
85 | const minutes = Math.floor(seconds / 60);
86 | const hours = Math.floor(minutes / 60);
87 | const days = Math.floor(hours / 24);
88 |
89 | let agoMessage = "";
90 |
91 | if (days > 0) {
92 | agoMessage = `${days} day(s) ago`;
93 | } else if (hours > 0) {
94 | agoMessage = `${hours} hour(s) ago`;
95 | } else if (minutes > 0) {
96 | agoMessage = `${minutes} minute(s) ago`;
97 | } else {
98 | agoMessage = `${seconds} second(s) ago`;
99 | }
100 |
101 | return agoMessage;
102 | };
103 |
104 | const calDateTime = (createdAt) => {
105 | const dateTime = new Date(createdAt);
106 |
107 | const day = String(dateTime.getDate()).padStart(2, "0");
108 | const month = String(dateTime.getMonth() + 1).padStart(2, "0");
109 | const year = dateTime.getFullYear();
110 |
111 | const hours = String(dateTime.getHours()).padStart(2, "0");
112 | const minutes = String(dateTime.getMinutes()).padStart(2, "0");
113 |
114 | const formattedDate = `${day}-${month}-${year} at ${hours}:${minutes}`;
115 |
116 | return formattedDate;
117 | };
118 |
119 | const viewHistory = async () => {
120 | try {
121 | const res = await fetch(
122 | `${backendUrl}/viewhistory/${taskId}?email=${encodeURIComponent(email || userEmail)}`,
123 | {
124 | method: "GET",
125 | headers: {
126 | Accept: "application/json",
127 | "Content-Type": "application/json",
128 | Authorization: localStorage.getItem("jwtToken"),
129 | },
130 | withCredentials: true,
131 | }
132 | );
133 |
134 | const data = await res.json();
135 | setHist(data);
136 | console.log(data);
137 | } catch (error) {
138 | console.log(error);
139 | navigate("/login");
140 | }
141 | };
142 |
143 | const editTask = () => {
144 | navigate(`/editTask/${taskId}`);
145 | };
146 |
147 | const deleteTask = async () => {
148 | try {
149 | const res = await fetch(
150 | `${backendUrl}/delete/${taskId}?email=${encodeURIComponent(
151 | email || userEmail
152 | )}`,
153 | {
154 | method: "DELETE",
155 | headers: {
156 | Accept: "application/json",
157 | "Content-Type": "application/json",
158 | Authorization: localStorage.getItem("jwtToken"),
159 | },
160 | credentials: "include",
161 | }
162 | );
163 |
164 | alert("Task deleted successfully");
165 | console.log("Task deleted successfully");
166 | navigate("/mytasks");
167 | } catch (error) {
168 | console.log(error);
169 | alert("Failed to delete task.");
170 | console.log("Failed to delete task.");
171 | }
172 | };
173 |
174 | return (
175 |
176 | {task ? (
177 |
178 |
179 |
180 |
{task?.title}
181 |
182 |
Description
183 |
{task?.description}
184 |
185 |
186 | Priority:{" "}
187 |
188 | {task?.priority}
189 |
190 |
191 |
192 |
193 | Status: {task?.status}
194 |
195 |
196 |
197 | Due Date: {task?.duedate}
198 |
199 |
200 |
201 | Created At:{" "}
202 |
203 | {calDateTime(task?.createdAt)} | {calAgoTime(task?.createdAt)}
204 |
205 |
206 |
207 |
208 | Edit Task
209 |
210 |
211 | Delete Task
212 |
213 |
214 |
215 | Loading...
216 |
217 |
218 |
219 |
223 |
224 |
225 |
226 |
227 | Edits History
228 |
229 |
230 |
231 | {hist
232 | ?.slice()
233 | .reverse()
234 | .map((i) => (
235 |
236 |
237 |
238 | Updated At:{" "}
239 |
240 | {calDateTime(i.updatedAt)} |{" "}
241 | {calAgoTime(i.updatedAt)}
242 |
243 |
244 |
245 | {i.title_prev !== i.title_now && (
246 | <>
247 | Title
248 |
249 | Before:{" "}
250 | {i.title_prev}
251 |
252 |
253 | After:{" "}
254 | {i.title_now}
255 |
256 | >
257 | )}
258 |
259 | {i.description_prev !== i.description_now && (
260 | <>
261 | Description
262 |
263 | Before:{" "}
264 |
265 | {i.description_prev}
266 |
267 |
268 |
269 | After:{" "}
270 |
271 | {i.description_now}
272 |
273 |
274 | >
275 | )}
276 |
277 | {i.priority_prev !== i.priority_now && (
278 | <>
279 | Priority
280 |
281 | Before:{" "}
282 |
283 | {i.priority_prev}
284 |
285 |
286 |
287 | After:{" "}
288 |
289 | {i.priority_now}
290 |
291 |
292 | >
293 | )}
294 |
295 | {i.status_prev !== i.status_now && (
296 | <>
297 | Status
298 |
299 | Before:{" "}
300 |
301 | {i.status_prev}
302 |
303 |
304 |
305 | After:{" "}
306 | {i.status_now}
307 |
308 | >
309 | )}
310 |
311 | {i.duedate_prev !== i.duedate_now && (
312 | <>
313 | Due Date
314 |
315 | Before:{" "}
316 |
317 | {i.duedate_prev}
318 |
319 |
320 |
321 | After:{" "}
322 |
323 | {i.duedate_now}
324 |
325 |
326 | >
327 | )}
328 |
329 |
330 | ))}
331 |
332 |
333 |
337 | No Edits Found
338 |
339 |
340 |
341 |
342 | ) : (
343 | Loading...
344 | )}
345 |
346 | );
347 | };
348 |
349 | export default ViewTask;
350 |
--------------------------------------------------------------------------------
/client/src/assets/catmeme.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/priyanshudevsingh/Task-Management-System/446d10efb6edc22934314fde1f8a1f8f0719f0d7/client/src/assets/catmeme.gif
--------------------------------------------------------------------------------
/client/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/priyanshudevsingh/Task-Management-System/446d10efb6edc22934314fde1f8a1f8f0719f0d7/client/src/assets/logo.png
--------------------------------------------------------------------------------
/client/src/backendUrl.js:
--------------------------------------------------------------------------------
1 | export const backendUrl = 'https://task-management-system-server-smoky.vercel.app';
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/client/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/client/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/client/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | client:
5 | image: priyanshudevsingh/task-management-system:tms-client
6 | ports:
7 | - 3000:3000
8 | depends_on:
9 | - server
10 |
11 | server:
12 | image: priyanshudevsingh/task-management-system:tms-server
13 | ports:
14 | - 5000:5000
--------------------------------------------------------------------------------
/server/.dockerignore:
--------------------------------------------------------------------------------
1 | # dependencies
2 | /node_modules
3 |
4 | .gitignore
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | config.env
2 | node_modules
--------------------------------------------------------------------------------
/server/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine
2 | WORKDIR /app/server
3 | COPY package*.json ./
4 | RUN npm install
5 | COPY . .
6 | EXPOSE 5000
7 | CMD ["node", "index.js"]
--------------------------------------------------------------------------------
/server/db/connect.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const DB = process.env.DATABASE;
4 |
5 | mongoose
6 | .connect(DB)
7 | .then(() => {
8 | console.log("DB connection successful");
9 | })
10 | .catch((err) => console.log("DB connection failed"));
11 |
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | const dotenv = require("dotenv");
2 | const express = require("express");
3 | const cors = require("cors");
4 |
5 | const app = express();
6 |
7 | dotenv.config({ path: "./config.env" });
8 |
9 | require("./db/connect");
10 |
11 | app.use(express.json());
12 | app.use(express.urlencoded({ extended: true }));
13 | app.use(
14 | cors({
15 | origin: [
16 | "http://localhost:3000",
17 | "https://task-management-system-client-red.vercel.app",
18 | "https://www.tms.cleverescrow.com"
19 | ],
20 | methods: ["GET", "POST", "DELETE", "PATCH"],
21 | allowedHeaders: ["Content-Type", "Authorization", "Accept"],
22 | credentials: true,
23 | })
24 | );
25 |
26 | app.use(require("./routes"));
27 |
28 | const PORT = process.env.PORT || 5000;
29 |
30 | app.listen(PORT, () => {
31 | console.log(`server is running at port ${PORT}`);
32 | });
33 |
--------------------------------------------------------------------------------
/server/middleware/authenticate.js:
--------------------------------------------------------------------------------
1 | const jwt = require("jsonwebtoken");
2 | const User = require("../model/userSchema");
3 |
4 | const authenticate = async (req, res, next) => {
5 | try {
6 | const token = req.headers.authorization;
7 | if (!token) {
8 | throw new Error("Unauthorized: No token provided");
9 | }
10 |
11 | const verifyToken = jwt.verify(token, process.env.SECRET_KEY);
12 |
13 | const rootUser = await User.findOne({
14 | _id: verifyToken._id,
15 | "tokens.token": token,
16 | });
17 |
18 | if (!rootUser) {
19 | throw new Error("User not Found");
20 | }
21 |
22 | req.userdata = rootUser;
23 |
24 | next();
25 | } catch (err) {
26 | res.status(401).send("Unauthorized: No token provided");
27 | }
28 | };
29 |
30 | module.exports = authenticate;
31 |
--------------------------------------------------------------------------------
/server/model/taskSchema.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 |
3 | const taskSchema = new mongoose.Schema({
4 | email: {
5 | type: String,
6 | required: true,
7 | },
8 | tasks: [
9 | {
10 | taskid: {
11 | type: String,
12 | required: true,
13 | },
14 | title: {
15 | type: String,
16 | required: true,
17 | },
18 | description: {
19 | type: String,
20 | required: true,
21 | },
22 | duedate: {
23 | type: String,
24 | required: true,
25 | },
26 | priority: {
27 | type: String,
28 | required: true,
29 | },
30 | status: {
31 | type: String,
32 | required: true,
33 | },
34 | createdAt: {
35 | type: Date,
36 | default: Date.now,
37 | },
38 | history: [
39 | {
40 | title_prev: String,
41 | description_prev: String,
42 | duedate_prev: String,
43 | priority_prev: String,
44 | status_prev: String,
45 | title_now: String,
46 | description_now: String,
47 | duedate_now: String,
48 | priority_now: String,
49 | status_now: String,
50 | updatedAt: {
51 | type: Date,
52 | default: Date.now,
53 | },
54 | },
55 | ],
56 | },
57 | ],
58 | });
59 |
60 | const Task = mongoose.model("tasks", taskSchema);
61 |
62 | module.exports = Task;
63 |
--------------------------------------------------------------------------------
/server/model/userSchema.js:
--------------------------------------------------------------------------------
1 | const mongoose = require("mongoose");
2 | const bcrypt = require("bcrypt");
3 | const jwt = require("jsonwebtoken");
4 |
5 | const userSchema = new mongoose.Schema({
6 | name: {
7 | type: String,
8 | required: true,
9 | },
10 | email: {
11 | type: String,
12 | required: true,
13 | },
14 | password: {
15 | type: String,
16 | required: true,
17 | },
18 | tokens: [
19 | {
20 | token: {
21 | type: String,
22 | required: true,
23 | },
24 | },
25 | ],
26 | });
27 |
28 | // password hashing
29 | userSchema.pre("save", async function (next) {
30 | if (this.isModified("password")) {
31 | this.password = await bcrypt.hash(this.password, 12);
32 | }
33 | next();
34 | });
35 |
36 | // token generation
37 | userSchema.methods.generateAuthToken = async function () {
38 | try {
39 | let token = jwt.sign({ _id: this._id }, process.env.SECRET_KEY);
40 | this.tokens = this.tokens.concat({ token: token });
41 | await this.save();
42 | return token;
43 | } catch (err) {
44 | console.log(err);
45 | }
46 | };
47 |
48 | const User = mongoose.model("users", userSchema);
49 |
50 | module.exports = User;
51 |
--------------------------------------------------------------------------------
/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "server",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "bcrypt": "^5.1.1",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.3.1",
15 | "express": "^4.18.2",
16 | "jsonwebtoken": "^9.0.2",
17 | "mongoose": "^8.0.0",
18 | "nodemon": "^3.0.1",
19 | "uuid": "^9.0.1"
20 | }
21 | },
22 | "node_modules/@mapbox/node-pre-gyp": {
23 | "version": "1.0.11",
24 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
25 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
26 | "dependencies": {
27 | "detect-libc": "^2.0.0",
28 | "https-proxy-agent": "^5.0.0",
29 | "make-dir": "^3.1.0",
30 | "node-fetch": "^2.6.7",
31 | "nopt": "^5.0.0",
32 | "npmlog": "^5.0.1",
33 | "rimraf": "^3.0.2",
34 | "semver": "^7.3.5",
35 | "tar": "^6.1.11"
36 | },
37 | "bin": {
38 | "node-pre-gyp": "bin/node-pre-gyp"
39 | }
40 | },
41 | "node_modules/@mongodb-js/saslprep": {
42 | "version": "1.1.1",
43 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz",
44 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==",
45 | "dependencies": {
46 | "sparse-bitfield": "^3.0.3"
47 | }
48 | },
49 | "node_modules/@types/node": {
50 | "version": "20.9.0",
51 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz",
52 | "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==",
53 | "dependencies": {
54 | "undici-types": "~5.26.4"
55 | }
56 | },
57 | "node_modules/@types/webidl-conversions": {
58 | "version": "7.0.3",
59 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
60 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
61 | },
62 | "node_modules/@types/whatwg-url": {
63 | "version": "8.2.2",
64 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
65 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
66 | "dependencies": {
67 | "@types/node": "*",
68 | "@types/webidl-conversions": "*"
69 | }
70 | },
71 | "node_modules/abbrev": {
72 | "version": "1.1.1",
73 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
74 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
75 | },
76 | "node_modules/accepts": {
77 | "version": "1.3.8",
78 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
79 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
80 | "dependencies": {
81 | "mime-types": "~2.1.34",
82 | "negotiator": "0.6.3"
83 | },
84 | "engines": {
85 | "node": ">= 0.6"
86 | }
87 | },
88 | "node_modules/agent-base": {
89 | "version": "6.0.2",
90 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
91 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
92 | "dependencies": {
93 | "debug": "4"
94 | },
95 | "engines": {
96 | "node": ">= 6.0.0"
97 | }
98 | },
99 | "node_modules/ansi-regex": {
100 | "version": "5.0.1",
101 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
102 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
103 | "engines": {
104 | "node": ">=8"
105 | }
106 | },
107 | "node_modules/anymatch": {
108 | "version": "3.1.3",
109 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
110 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
111 | "dependencies": {
112 | "normalize-path": "^3.0.0",
113 | "picomatch": "^2.0.4"
114 | },
115 | "engines": {
116 | "node": ">= 8"
117 | }
118 | },
119 | "node_modules/aproba": {
120 | "version": "2.0.0",
121 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
122 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
123 | },
124 | "node_modules/are-we-there-yet": {
125 | "version": "2.0.0",
126 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
127 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
128 | "dependencies": {
129 | "delegates": "^1.0.0",
130 | "readable-stream": "^3.6.0"
131 | },
132 | "engines": {
133 | "node": ">=10"
134 | }
135 | },
136 | "node_modules/array-flatten": {
137 | "version": "1.1.1",
138 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
139 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
140 | },
141 | "node_modules/balanced-match": {
142 | "version": "1.0.2",
143 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
144 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
145 | },
146 | "node_modules/bcrypt": {
147 | "version": "5.1.1",
148 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
149 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
150 | "hasInstallScript": true,
151 | "dependencies": {
152 | "@mapbox/node-pre-gyp": "^1.0.11",
153 | "node-addon-api": "^5.0.0"
154 | },
155 | "engines": {
156 | "node": ">= 10.0.0"
157 | }
158 | },
159 | "node_modules/binary-extensions": {
160 | "version": "2.2.0",
161 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
162 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
163 | "engines": {
164 | "node": ">=8"
165 | }
166 | },
167 | "node_modules/body-parser": {
168 | "version": "1.20.1",
169 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
170 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
171 | "dependencies": {
172 | "bytes": "3.1.2",
173 | "content-type": "~1.0.4",
174 | "debug": "2.6.9",
175 | "depd": "2.0.0",
176 | "destroy": "1.2.0",
177 | "http-errors": "2.0.0",
178 | "iconv-lite": "0.4.24",
179 | "on-finished": "2.4.1",
180 | "qs": "6.11.0",
181 | "raw-body": "2.5.1",
182 | "type-is": "~1.6.18",
183 | "unpipe": "1.0.0"
184 | },
185 | "engines": {
186 | "node": ">= 0.8",
187 | "npm": "1.2.8000 || >= 1.4.16"
188 | }
189 | },
190 | "node_modules/body-parser/node_modules/debug": {
191 | "version": "2.6.9",
192 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
193 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
194 | "dependencies": {
195 | "ms": "2.0.0"
196 | }
197 | },
198 | "node_modules/body-parser/node_modules/ms": {
199 | "version": "2.0.0",
200 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
201 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
202 | },
203 | "node_modules/brace-expansion": {
204 | "version": "1.1.11",
205 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
206 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
207 | "dependencies": {
208 | "balanced-match": "^1.0.0",
209 | "concat-map": "0.0.1"
210 | }
211 | },
212 | "node_modules/braces": {
213 | "version": "3.0.2",
214 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
215 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
216 | "dependencies": {
217 | "fill-range": "^7.0.1"
218 | },
219 | "engines": {
220 | "node": ">=8"
221 | }
222 | },
223 | "node_modules/bson": {
224 | "version": "6.2.0",
225 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
226 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
227 | "engines": {
228 | "node": ">=16.20.1"
229 | }
230 | },
231 | "node_modules/buffer-equal-constant-time": {
232 | "version": "1.0.1",
233 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
234 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
235 | },
236 | "node_modules/bytes": {
237 | "version": "3.1.2",
238 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
239 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
240 | "engines": {
241 | "node": ">= 0.8"
242 | }
243 | },
244 | "node_modules/call-bind": {
245 | "version": "1.0.5",
246 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
247 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
248 | "dependencies": {
249 | "function-bind": "^1.1.2",
250 | "get-intrinsic": "^1.2.1",
251 | "set-function-length": "^1.1.1"
252 | },
253 | "funding": {
254 | "url": "https://github.com/sponsors/ljharb"
255 | }
256 | },
257 | "node_modules/chokidar": {
258 | "version": "3.5.3",
259 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
260 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
261 | "funding": [
262 | {
263 | "type": "individual",
264 | "url": "https://paulmillr.com/funding/"
265 | }
266 | ],
267 | "dependencies": {
268 | "anymatch": "~3.1.2",
269 | "braces": "~3.0.2",
270 | "glob-parent": "~5.1.2",
271 | "is-binary-path": "~2.1.0",
272 | "is-glob": "~4.0.1",
273 | "normalize-path": "~3.0.0",
274 | "readdirp": "~3.6.0"
275 | },
276 | "engines": {
277 | "node": ">= 8.10.0"
278 | },
279 | "optionalDependencies": {
280 | "fsevents": "~2.3.2"
281 | }
282 | },
283 | "node_modules/chownr": {
284 | "version": "2.0.0",
285 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
286 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
287 | "engines": {
288 | "node": ">=10"
289 | }
290 | },
291 | "node_modules/color-support": {
292 | "version": "1.1.3",
293 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
294 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
295 | "bin": {
296 | "color-support": "bin.js"
297 | }
298 | },
299 | "node_modules/concat-map": {
300 | "version": "0.0.1",
301 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
302 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
303 | },
304 | "node_modules/console-control-strings": {
305 | "version": "1.1.0",
306 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
307 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="
308 | },
309 | "node_modules/content-disposition": {
310 | "version": "0.5.4",
311 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
312 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
313 | "dependencies": {
314 | "safe-buffer": "5.2.1"
315 | },
316 | "engines": {
317 | "node": ">= 0.6"
318 | }
319 | },
320 | "node_modules/content-type": {
321 | "version": "1.0.5",
322 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
323 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
324 | "engines": {
325 | "node": ">= 0.6"
326 | }
327 | },
328 | "node_modules/cookie": {
329 | "version": "0.5.0",
330 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
331 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
332 | "engines": {
333 | "node": ">= 0.6"
334 | }
335 | },
336 | "node_modules/cookie-signature": {
337 | "version": "1.0.6",
338 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
339 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
340 | },
341 | "node_modules/cors": {
342 | "version": "2.8.5",
343 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
344 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
345 | "dependencies": {
346 | "object-assign": "^4",
347 | "vary": "^1"
348 | },
349 | "engines": {
350 | "node": ">= 0.10"
351 | }
352 | },
353 | "node_modules/debug": {
354 | "version": "4.3.4",
355 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
356 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
357 | "dependencies": {
358 | "ms": "2.1.2"
359 | },
360 | "engines": {
361 | "node": ">=6.0"
362 | },
363 | "peerDependenciesMeta": {
364 | "supports-color": {
365 | "optional": true
366 | }
367 | }
368 | },
369 | "node_modules/define-data-property": {
370 | "version": "1.1.1",
371 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
372 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
373 | "dependencies": {
374 | "get-intrinsic": "^1.2.1",
375 | "gopd": "^1.0.1",
376 | "has-property-descriptors": "^1.0.0"
377 | },
378 | "engines": {
379 | "node": ">= 0.4"
380 | }
381 | },
382 | "node_modules/delegates": {
383 | "version": "1.0.0",
384 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
385 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="
386 | },
387 | "node_modules/depd": {
388 | "version": "2.0.0",
389 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
390 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
391 | "engines": {
392 | "node": ">= 0.8"
393 | }
394 | },
395 | "node_modules/destroy": {
396 | "version": "1.2.0",
397 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
398 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
399 | "engines": {
400 | "node": ">= 0.8",
401 | "npm": "1.2.8000 || >= 1.4.16"
402 | }
403 | },
404 | "node_modules/detect-libc": {
405 | "version": "2.0.2",
406 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
407 | "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
408 | "engines": {
409 | "node": ">=8"
410 | }
411 | },
412 | "node_modules/dotenv": {
413 | "version": "16.3.1",
414 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
415 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
416 | "engines": {
417 | "node": ">=12"
418 | },
419 | "funding": {
420 | "url": "https://github.com/motdotla/dotenv?sponsor=1"
421 | }
422 | },
423 | "node_modules/ecdsa-sig-formatter": {
424 | "version": "1.0.11",
425 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
426 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
427 | "dependencies": {
428 | "safe-buffer": "^5.0.1"
429 | }
430 | },
431 | "node_modules/ee-first": {
432 | "version": "1.1.1",
433 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
434 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
435 | },
436 | "node_modules/emoji-regex": {
437 | "version": "8.0.0",
438 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
439 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
440 | },
441 | "node_modules/encodeurl": {
442 | "version": "1.0.2",
443 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
444 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
445 | "engines": {
446 | "node": ">= 0.8"
447 | }
448 | },
449 | "node_modules/escape-html": {
450 | "version": "1.0.3",
451 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
452 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
453 | },
454 | "node_modules/etag": {
455 | "version": "1.8.1",
456 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
457 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
458 | "engines": {
459 | "node": ">= 0.6"
460 | }
461 | },
462 | "node_modules/express": {
463 | "version": "4.18.2",
464 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
465 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
466 | "dependencies": {
467 | "accepts": "~1.3.8",
468 | "array-flatten": "1.1.1",
469 | "body-parser": "1.20.1",
470 | "content-disposition": "0.5.4",
471 | "content-type": "~1.0.4",
472 | "cookie": "0.5.0",
473 | "cookie-signature": "1.0.6",
474 | "debug": "2.6.9",
475 | "depd": "2.0.0",
476 | "encodeurl": "~1.0.2",
477 | "escape-html": "~1.0.3",
478 | "etag": "~1.8.1",
479 | "finalhandler": "1.2.0",
480 | "fresh": "0.5.2",
481 | "http-errors": "2.0.0",
482 | "merge-descriptors": "1.0.1",
483 | "methods": "~1.1.2",
484 | "on-finished": "2.4.1",
485 | "parseurl": "~1.3.3",
486 | "path-to-regexp": "0.1.7",
487 | "proxy-addr": "~2.0.7",
488 | "qs": "6.11.0",
489 | "range-parser": "~1.2.1",
490 | "safe-buffer": "5.2.1",
491 | "send": "0.18.0",
492 | "serve-static": "1.15.0",
493 | "setprototypeof": "1.2.0",
494 | "statuses": "2.0.1",
495 | "type-is": "~1.6.18",
496 | "utils-merge": "1.0.1",
497 | "vary": "~1.1.2"
498 | },
499 | "engines": {
500 | "node": ">= 0.10.0"
501 | }
502 | },
503 | "node_modules/express/node_modules/debug": {
504 | "version": "2.6.9",
505 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
506 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
507 | "dependencies": {
508 | "ms": "2.0.0"
509 | }
510 | },
511 | "node_modules/express/node_modules/ms": {
512 | "version": "2.0.0",
513 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
514 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
515 | },
516 | "node_modules/fill-range": {
517 | "version": "7.0.1",
518 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
519 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
520 | "dependencies": {
521 | "to-regex-range": "^5.0.1"
522 | },
523 | "engines": {
524 | "node": ">=8"
525 | }
526 | },
527 | "node_modules/finalhandler": {
528 | "version": "1.2.0",
529 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
530 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
531 | "dependencies": {
532 | "debug": "2.6.9",
533 | "encodeurl": "~1.0.2",
534 | "escape-html": "~1.0.3",
535 | "on-finished": "2.4.1",
536 | "parseurl": "~1.3.3",
537 | "statuses": "2.0.1",
538 | "unpipe": "~1.0.0"
539 | },
540 | "engines": {
541 | "node": ">= 0.8"
542 | }
543 | },
544 | "node_modules/finalhandler/node_modules/debug": {
545 | "version": "2.6.9",
546 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
547 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
548 | "dependencies": {
549 | "ms": "2.0.0"
550 | }
551 | },
552 | "node_modules/finalhandler/node_modules/ms": {
553 | "version": "2.0.0",
554 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
555 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
556 | },
557 | "node_modules/forwarded": {
558 | "version": "0.2.0",
559 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
560 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
561 | "engines": {
562 | "node": ">= 0.6"
563 | }
564 | },
565 | "node_modules/fresh": {
566 | "version": "0.5.2",
567 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
568 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
569 | "engines": {
570 | "node": ">= 0.6"
571 | }
572 | },
573 | "node_modules/fs-minipass": {
574 | "version": "2.1.0",
575 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
576 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
577 | "dependencies": {
578 | "minipass": "^3.0.0"
579 | },
580 | "engines": {
581 | "node": ">= 8"
582 | }
583 | },
584 | "node_modules/fs-minipass/node_modules/minipass": {
585 | "version": "3.3.6",
586 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
587 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
588 | "dependencies": {
589 | "yallist": "^4.0.0"
590 | },
591 | "engines": {
592 | "node": ">=8"
593 | }
594 | },
595 | "node_modules/fs.realpath": {
596 | "version": "1.0.0",
597 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
598 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
599 | },
600 | "node_modules/fsevents": {
601 | "version": "2.3.3",
602 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
603 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
604 | "hasInstallScript": true,
605 | "optional": true,
606 | "os": [
607 | "darwin"
608 | ],
609 | "engines": {
610 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
611 | }
612 | },
613 | "node_modules/function-bind": {
614 | "version": "1.1.2",
615 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
616 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
617 | "funding": {
618 | "url": "https://github.com/sponsors/ljharb"
619 | }
620 | },
621 | "node_modules/gauge": {
622 | "version": "3.0.2",
623 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
624 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
625 | "dependencies": {
626 | "aproba": "^1.0.3 || ^2.0.0",
627 | "color-support": "^1.1.2",
628 | "console-control-strings": "^1.0.0",
629 | "has-unicode": "^2.0.1",
630 | "object-assign": "^4.1.1",
631 | "signal-exit": "^3.0.0",
632 | "string-width": "^4.2.3",
633 | "strip-ansi": "^6.0.1",
634 | "wide-align": "^1.1.2"
635 | },
636 | "engines": {
637 | "node": ">=10"
638 | }
639 | },
640 | "node_modules/get-intrinsic": {
641 | "version": "1.2.2",
642 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
643 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
644 | "dependencies": {
645 | "function-bind": "^1.1.2",
646 | "has-proto": "^1.0.1",
647 | "has-symbols": "^1.0.3",
648 | "hasown": "^2.0.0"
649 | },
650 | "funding": {
651 | "url": "https://github.com/sponsors/ljharb"
652 | }
653 | },
654 | "node_modules/glob": {
655 | "version": "7.2.3",
656 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
657 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
658 | "dependencies": {
659 | "fs.realpath": "^1.0.0",
660 | "inflight": "^1.0.4",
661 | "inherits": "2",
662 | "minimatch": "^3.1.1",
663 | "once": "^1.3.0",
664 | "path-is-absolute": "^1.0.0"
665 | },
666 | "engines": {
667 | "node": "*"
668 | },
669 | "funding": {
670 | "url": "https://github.com/sponsors/isaacs"
671 | }
672 | },
673 | "node_modules/glob-parent": {
674 | "version": "5.1.2",
675 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
676 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
677 | "dependencies": {
678 | "is-glob": "^4.0.1"
679 | },
680 | "engines": {
681 | "node": ">= 6"
682 | }
683 | },
684 | "node_modules/gopd": {
685 | "version": "1.0.1",
686 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
687 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
688 | "dependencies": {
689 | "get-intrinsic": "^1.1.3"
690 | },
691 | "funding": {
692 | "url": "https://github.com/sponsors/ljharb"
693 | }
694 | },
695 | "node_modules/has-flag": {
696 | "version": "3.0.0",
697 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
698 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
699 | "engines": {
700 | "node": ">=4"
701 | }
702 | },
703 | "node_modules/has-property-descriptors": {
704 | "version": "1.0.1",
705 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
706 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
707 | "dependencies": {
708 | "get-intrinsic": "^1.2.2"
709 | },
710 | "funding": {
711 | "url": "https://github.com/sponsors/ljharb"
712 | }
713 | },
714 | "node_modules/has-proto": {
715 | "version": "1.0.1",
716 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
717 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
718 | "engines": {
719 | "node": ">= 0.4"
720 | },
721 | "funding": {
722 | "url": "https://github.com/sponsors/ljharb"
723 | }
724 | },
725 | "node_modules/has-symbols": {
726 | "version": "1.0.3",
727 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
728 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
729 | "engines": {
730 | "node": ">= 0.4"
731 | },
732 | "funding": {
733 | "url": "https://github.com/sponsors/ljharb"
734 | }
735 | },
736 | "node_modules/has-unicode": {
737 | "version": "2.0.1",
738 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
739 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="
740 | },
741 | "node_modules/hasown": {
742 | "version": "2.0.0",
743 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
744 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
745 | "dependencies": {
746 | "function-bind": "^1.1.2"
747 | },
748 | "engines": {
749 | "node": ">= 0.4"
750 | }
751 | },
752 | "node_modules/http-errors": {
753 | "version": "2.0.0",
754 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
755 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
756 | "dependencies": {
757 | "depd": "2.0.0",
758 | "inherits": "2.0.4",
759 | "setprototypeof": "1.2.0",
760 | "statuses": "2.0.1",
761 | "toidentifier": "1.0.1"
762 | },
763 | "engines": {
764 | "node": ">= 0.8"
765 | }
766 | },
767 | "node_modules/https-proxy-agent": {
768 | "version": "5.0.1",
769 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
770 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
771 | "dependencies": {
772 | "agent-base": "6",
773 | "debug": "4"
774 | },
775 | "engines": {
776 | "node": ">= 6"
777 | }
778 | },
779 | "node_modules/iconv-lite": {
780 | "version": "0.4.24",
781 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
782 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
783 | "dependencies": {
784 | "safer-buffer": ">= 2.1.2 < 3"
785 | },
786 | "engines": {
787 | "node": ">=0.10.0"
788 | }
789 | },
790 | "node_modules/ignore-by-default": {
791 | "version": "1.0.1",
792 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
793 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
794 | },
795 | "node_modules/inflight": {
796 | "version": "1.0.6",
797 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
798 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
799 | "dependencies": {
800 | "once": "^1.3.0",
801 | "wrappy": "1"
802 | }
803 | },
804 | "node_modules/inherits": {
805 | "version": "2.0.4",
806 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
807 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
808 | },
809 | "node_modules/ipaddr.js": {
810 | "version": "1.9.1",
811 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
812 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
813 | "engines": {
814 | "node": ">= 0.10"
815 | }
816 | },
817 | "node_modules/is-binary-path": {
818 | "version": "2.1.0",
819 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
820 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
821 | "dependencies": {
822 | "binary-extensions": "^2.0.0"
823 | },
824 | "engines": {
825 | "node": ">=8"
826 | }
827 | },
828 | "node_modules/is-extglob": {
829 | "version": "2.1.1",
830 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
831 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
832 | "engines": {
833 | "node": ">=0.10.0"
834 | }
835 | },
836 | "node_modules/is-fullwidth-code-point": {
837 | "version": "3.0.0",
838 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
839 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
840 | "engines": {
841 | "node": ">=8"
842 | }
843 | },
844 | "node_modules/is-glob": {
845 | "version": "4.0.3",
846 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
847 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
848 | "dependencies": {
849 | "is-extglob": "^2.1.1"
850 | },
851 | "engines": {
852 | "node": ">=0.10.0"
853 | }
854 | },
855 | "node_modules/is-number": {
856 | "version": "7.0.0",
857 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
858 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
859 | "engines": {
860 | "node": ">=0.12.0"
861 | }
862 | },
863 | "node_modules/jsonwebtoken": {
864 | "version": "9.0.2",
865 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
866 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
867 | "dependencies": {
868 | "jws": "^3.2.2",
869 | "lodash.includes": "^4.3.0",
870 | "lodash.isboolean": "^3.0.3",
871 | "lodash.isinteger": "^4.0.4",
872 | "lodash.isnumber": "^3.0.3",
873 | "lodash.isplainobject": "^4.0.6",
874 | "lodash.isstring": "^4.0.1",
875 | "lodash.once": "^4.0.0",
876 | "ms": "^2.1.1",
877 | "semver": "^7.5.4"
878 | },
879 | "engines": {
880 | "node": ">=12",
881 | "npm": ">=6"
882 | }
883 | },
884 | "node_modules/jwa": {
885 | "version": "1.4.1",
886 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
887 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
888 | "dependencies": {
889 | "buffer-equal-constant-time": "1.0.1",
890 | "ecdsa-sig-formatter": "1.0.11",
891 | "safe-buffer": "^5.0.1"
892 | }
893 | },
894 | "node_modules/jws": {
895 | "version": "3.2.2",
896 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
897 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
898 | "dependencies": {
899 | "jwa": "^1.4.1",
900 | "safe-buffer": "^5.0.1"
901 | }
902 | },
903 | "node_modules/kareem": {
904 | "version": "2.5.1",
905 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
906 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
907 | "engines": {
908 | "node": ">=12.0.0"
909 | }
910 | },
911 | "node_modules/lodash.includes": {
912 | "version": "4.3.0",
913 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
914 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
915 | },
916 | "node_modules/lodash.isboolean": {
917 | "version": "3.0.3",
918 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
919 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
920 | },
921 | "node_modules/lodash.isinteger": {
922 | "version": "4.0.4",
923 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
924 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
925 | },
926 | "node_modules/lodash.isnumber": {
927 | "version": "3.0.3",
928 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
929 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
930 | },
931 | "node_modules/lodash.isplainobject": {
932 | "version": "4.0.6",
933 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
934 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
935 | },
936 | "node_modules/lodash.isstring": {
937 | "version": "4.0.1",
938 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
939 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
940 | },
941 | "node_modules/lodash.once": {
942 | "version": "4.1.1",
943 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
944 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
945 | },
946 | "node_modules/lru-cache": {
947 | "version": "6.0.0",
948 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
949 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
950 | "dependencies": {
951 | "yallist": "^4.0.0"
952 | },
953 | "engines": {
954 | "node": ">=10"
955 | }
956 | },
957 | "node_modules/make-dir": {
958 | "version": "3.1.0",
959 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
960 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
961 | "dependencies": {
962 | "semver": "^6.0.0"
963 | },
964 | "engines": {
965 | "node": ">=8"
966 | },
967 | "funding": {
968 | "url": "https://github.com/sponsors/sindresorhus"
969 | }
970 | },
971 | "node_modules/make-dir/node_modules/semver": {
972 | "version": "6.3.1",
973 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
974 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
975 | "bin": {
976 | "semver": "bin/semver.js"
977 | }
978 | },
979 | "node_modules/media-typer": {
980 | "version": "0.3.0",
981 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
982 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
983 | "engines": {
984 | "node": ">= 0.6"
985 | }
986 | },
987 | "node_modules/memory-pager": {
988 | "version": "1.5.0",
989 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
990 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
991 | },
992 | "node_modules/merge-descriptors": {
993 | "version": "1.0.1",
994 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
995 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
996 | },
997 | "node_modules/methods": {
998 | "version": "1.1.2",
999 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1000 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1001 | "engines": {
1002 | "node": ">= 0.6"
1003 | }
1004 | },
1005 | "node_modules/mime": {
1006 | "version": "1.6.0",
1007 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1008 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1009 | "bin": {
1010 | "mime": "cli.js"
1011 | },
1012 | "engines": {
1013 | "node": ">=4"
1014 | }
1015 | },
1016 | "node_modules/mime-db": {
1017 | "version": "1.52.0",
1018 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1019 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1020 | "engines": {
1021 | "node": ">= 0.6"
1022 | }
1023 | },
1024 | "node_modules/mime-types": {
1025 | "version": "2.1.35",
1026 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1027 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1028 | "dependencies": {
1029 | "mime-db": "1.52.0"
1030 | },
1031 | "engines": {
1032 | "node": ">= 0.6"
1033 | }
1034 | },
1035 | "node_modules/minimatch": {
1036 | "version": "3.1.2",
1037 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1038 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1039 | "dependencies": {
1040 | "brace-expansion": "^1.1.7"
1041 | },
1042 | "engines": {
1043 | "node": "*"
1044 | }
1045 | },
1046 | "node_modules/minipass": {
1047 | "version": "5.0.0",
1048 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
1049 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
1050 | "engines": {
1051 | "node": ">=8"
1052 | }
1053 | },
1054 | "node_modules/minizlib": {
1055 | "version": "2.1.2",
1056 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
1057 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
1058 | "dependencies": {
1059 | "minipass": "^3.0.0",
1060 | "yallist": "^4.0.0"
1061 | },
1062 | "engines": {
1063 | "node": ">= 8"
1064 | }
1065 | },
1066 | "node_modules/minizlib/node_modules/minipass": {
1067 | "version": "3.3.6",
1068 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
1069 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
1070 | "dependencies": {
1071 | "yallist": "^4.0.0"
1072 | },
1073 | "engines": {
1074 | "node": ">=8"
1075 | }
1076 | },
1077 | "node_modules/mkdirp": {
1078 | "version": "1.0.4",
1079 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1080 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
1081 | "bin": {
1082 | "mkdirp": "bin/cmd.js"
1083 | },
1084 | "engines": {
1085 | "node": ">=10"
1086 | }
1087 | },
1088 | "node_modules/mongodb": {
1089 | "version": "6.2.0",
1090 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
1091 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
1092 | "dependencies": {
1093 | "@mongodb-js/saslprep": "^1.1.0",
1094 | "bson": "^6.2.0",
1095 | "mongodb-connection-string-url": "^2.6.0"
1096 | },
1097 | "engines": {
1098 | "node": ">=16.20.1"
1099 | },
1100 | "peerDependencies": {
1101 | "@aws-sdk/credential-providers": "^3.188.0",
1102 | "@mongodb-js/zstd": "^1.1.0",
1103 | "gcp-metadata": "^5.2.0",
1104 | "kerberos": "^2.0.1",
1105 | "mongodb-client-encryption": ">=6.0.0 <7",
1106 | "snappy": "^7.2.2",
1107 | "socks": "^2.7.1"
1108 | },
1109 | "peerDependenciesMeta": {
1110 | "@aws-sdk/credential-providers": {
1111 | "optional": true
1112 | },
1113 | "@mongodb-js/zstd": {
1114 | "optional": true
1115 | },
1116 | "gcp-metadata": {
1117 | "optional": true
1118 | },
1119 | "kerberos": {
1120 | "optional": true
1121 | },
1122 | "mongodb-client-encryption": {
1123 | "optional": true
1124 | },
1125 | "snappy": {
1126 | "optional": true
1127 | },
1128 | "socks": {
1129 | "optional": true
1130 | }
1131 | }
1132 | },
1133 | "node_modules/mongodb-connection-string-url": {
1134 | "version": "2.6.0",
1135 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
1136 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
1137 | "dependencies": {
1138 | "@types/whatwg-url": "^8.2.1",
1139 | "whatwg-url": "^11.0.0"
1140 | }
1141 | },
1142 | "node_modules/mongodb-connection-string-url/node_modules/tr46": {
1143 | "version": "3.0.0",
1144 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1145 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1146 | "dependencies": {
1147 | "punycode": "^2.1.1"
1148 | },
1149 | "engines": {
1150 | "node": ">=12"
1151 | }
1152 | },
1153 | "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
1154 | "version": "7.0.0",
1155 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1156 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1157 | "engines": {
1158 | "node": ">=12"
1159 | }
1160 | },
1161 | "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
1162 | "version": "11.0.0",
1163 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1164 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1165 | "dependencies": {
1166 | "tr46": "^3.0.0",
1167 | "webidl-conversions": "^7.0.0"
1168 | },
1169 | "engines": {
1170 | "node": ">=12"
1171 | }
1172 | },
1173 | "node_modules/mongoose": {
1174 | "version": "8.0.0",
1175 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.0.tgz",
1176 | "integrity": "sha512-PzwkLgm1Jhj0NQdgGfnFsu0QP9V1sBFgbavEgh/IPAUzKAagzvEhuaBuAQOQGjczVWnpIU9tBqyd02cOTgsPlA==",
1177 | "dependencies": {
1178 | "bson": "^6.2.0",
1179 | "kareem": "2.5.1",
1180 | "mongodb": "6.2.0",
1181 | "mpath": "0.9.0",
1182 | "mquery": "5.0.0",
1183 | "ms": "2.1.3",
1184 | "sift": "16.0.1"
1185 | },
1186 | "engines": {
1187 | "node": ">=16.20.1"
1188 | },
1189 | "funding": {
1190 | "type": "opencollective",
1191 | "url": "https://opencollective.com/mongoose"
1192 | }
1193 | },
1194 | "node_modules/mongoose/node_modules/ms": {
1195 | "version": "2.1.3",
1196 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1197 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1198 | },
1199 | "node_modules/mpath": {
1200 | "version": "0.9.0",
1201 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1202 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
1203 | "engines": {
1204 | "node": ">=4.0.0"
1205 | }
1206 | },
1207 | "node_modules/mquery": {
1208 | "version": "5.0.0",
1209 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
1210 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
1211 | "dependencies": {
1212 | "debug": "4.x"
1213 | },
1214 | "engines": {
1215 | "node": ">=14.0.0"
1216 | }
1217 | },
1218 | "node_modules/ms": {
1219 | "version": "2.1.2",
1220 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1221 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1222 | },
1223 | "node_modules/negotiator": {
1224 | "version": "0.6.3",
1225 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1226 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1227 | "engines": {
1228 | "node": ">= 0.6"
1229 | }
1230 | },
1231 | "node_modules/node-addon-api": {
1232 | "version": "5.1.0",
1233 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
1234 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
1235 | },
1236 | "node_modules/node-fetch": {
1237 | "version": "2.7.0",
1238 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1239 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1240 | "dependencies": {
1241 | "whatwg-url": "^5.0.0"
1242 | },
1243 | "engines": {
1244 | "node": "4.x || >=6.0.0"
1245 | },
1246 | "peerDependencies": {
1247 | "encoding": "^0.1.0"
1248 | },
1249 | "peerDependenciesMeta": {
1250 | "encoding": {
1251 | "optional": true
1252 | }
1253 | }
1254 | },
1255 | "node_modules/nodemon": {
1256 | "version": "3.0.1",
1257 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
1258 | "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
1259 | "dependencies": {
1260 | "chokidar": "^3.5.2",
1261 | "debug": "^3.2.7",
1262 | "ignore-by-default": "^1.0.1",
1263 | "minimatch": "^3.1.2",
1264 | "pstree.remy": "^1.1.8",
1265 | "semver": "^7.5.3",
1266 | "simple-update-notifier": "^2.0.0",
1267 | "supports-color": "^5.5.0",
1268 | "touch": "^3.1.0",
1269 | "undefsafe": "^2.0.5"
1270 | },
1271 | "bin": {
1272 | "nodemon": "bin/nodemon.js"
1273 | },
1274 | "engines": {
1275 | "node": ">=10"
1276 | },
1277 | "funding": {
1278 | "type": "opencollective",
1279 | "url": "https://opencollective.com/nodemon"
1280 | }
1281 | },
1282 | "node_modules/nodemon/node_modules/debug": {
1283 | "version": "3.2.7",
1284 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1285 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1286 | "dependencies": {
1287 | "ms": "^2.1.1"
1288 | }
1289 | },
1290 | "node_modules/nopt": {
1291 | "version": "5.0.0",
1292 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
1293 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
1294 | "dependencies": {
1295 | "abbrev": "1"
1296 | },
1297 | "bin": {
1298 | "nopt": "bin/nopt.js"
1299 | },
1300 | "engines": {
1301 | "node": ">=6"
1302 | }
1303 | },
1304 | "node_modules/normalize-path": {
1305 | "version": "3.0.0",
1306 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1307 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1308 | "engines": {
1309 | "node": ">=0.10.0"
1310 | }
1311 | },
1312 | "node_modules/npmlog": {
1313 | "version": "5.0.1",
1314 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
1315 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
1316 | "dependencies": {
1317 | "are-we-there-yet": "^2.0.0",
1318 | "console-control-strings": "^1.1.0",
1319 | "gauge": "^3.0.0",
1320 | "set-blocking": "^2.0.0"
1321 | }
1322 | },
1323 | "node_modules/object-assign": {
1324 | "version": "4.1.1",
1325 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1326 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1327 | "engines": {
1328 | "node": ">=0.10.0"
1329 | }
1330 | },
1331 | "node_modules/object-inspect": {
1332 | "version": "1.13.1",
1333 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
1334 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
1335 | "funding": {
1336 | "url": "https://github.com/sponsors/ljharb"
1337 | }
1338 | },
1339 | "node_modules/on-finished": {
1340 | "version": "2.4.1",
1341 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1342 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1343 | "dependencies": {
1344 | "ee-first": "1.1.1"
1345 | },
1346 | "engines": {
1347 | "node": ">= 0.8"
1348 | }
1349 | },
1350 | "node_modules/once": {
1351 | "version": "1.4.0",
1352 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1353 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1354 | "dependencies": {
1355 | "wrappy": "1"
1356 | }
1357 | },
1358 | "node_modules/parseurl": {
1359 | "version": "1.3.3",
1360 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1361 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1362 | "engines": {
1363 | "node": ">= 0.8"
1364 | }
1365 | },
1366 | "node_modules/path-is-absolute": {
1367 | "version": "1.0.1",
1368 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1369 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1370 | "engines": {
1371 | "node": ">=0.10.0"
1372 | }
1373 | },
1374 | "node_modules/path-to-regexp": {
1375 | "version": "0.1.7",
1376 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1377 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1378 | },
1379 | "node_modules/picomatch": {
1380 | "version": "2.3.1",
1381 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1382 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1383 | "engines": {
1384 | "node": ">=8.6"
1385 | },
1386 | "funding": {
1387 | "url": "https://github.com/sponsors/jonschlinkert"
1388 | }
1389 | },
1390 | "node_modules/proxy-addr": {
1391 | "version": "2.0.7",
1392 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1393 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1394 | "dependencies": {
1395 | "forwarded": "0.2.0",
1396 | "ipaddr.js": "1.9.1"
1397 | },
1398 | "engines": {
1399 | "node": ">= 0.10"
1400 | }
1401 | },
1402 | "node_modules/pstree.remy": {
1403 | "version": "1.1.8",
1404 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1405 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
1406 | },
1407 | "node_modules/punycode": {
1408 | "version": "2.3.1",
1409 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1410 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1411 | "engines": {
1412 | "node": ">=6"
1413 | }
1414 | },
1415 | "node_modules/qs": {
1416 | "version": "6.11.0",
1417 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1418 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1419 | "dependencies": {
1420 | "side-channel": "^1.0.4"
1421 | },
1422 | "engines": {
1423 | "node": ">=0.6"
1424 | },
1425 | "funding": {
1426 | "url": "https://github.com/sponsors/ljharb"
1427 | }
1428 | },
1429 | "node_modules/range-parser": {
1430 | "version": "1.2.1",
1431 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1432 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1433 | "engines": {
1434 | "node": ">= 0.6"
1435 | }
1436 | },
1437 | "node_modules/raw-body": {
1438 | "version": "2.5.1",
1439 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1440 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1441 | "dependencies": {
1442 | "bytes": "3.1.2",
1443 | "http-errors": "2.0.0",
1444 | "iconv-lite": "0.4.24",
1445 | "unpipe": "1.0.0"
1446 | },
1447 | "engines": {
1448 | "node": ">= 0.8"
1449 | }
1450 | },
1451 | "node_modules/readable-stream": {
1452 | "version": "3.6.2",
1453 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1454 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1455 | "dependencies": {
1456 | "inherits": "^2.0.3",
1457 | "string_decoder": "^1.1.1",
1458 | "util-deprecate": "^1.0.1"
1459 | },
1460 | "engines": {
1461 | "node": ">= 6"
1462 | }
1463 | },
1464 | "node_modules/readdirp": {
1465 | "version": "3.6.0",
1466 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1467 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1468 | "dependencies": {
1469 | "picomatch": "^2.2.1"
1470 | },
1471 | "engines": {
1472 | "node": ">=8.10.0"
1473 | }
1474 | },
1475 | "node_modules/rimraf": {
1476 | "version": "3.0.2",
1477 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1478 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1479 | "dependencies": {
1480 | "glob": "^7.1.3"
1481 | },
1482 | "bin": {
1483 | "rimraf": "bin.js"
1484 | },
1485 | "funding": {
1486 | "url": "https://github.com/sponsors/isaacs"
1487 | }
1488 | },
1489 | "node_modules/safe-buffer": {
1490 | "version": "5.2.1",
1491 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1492 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1493 | "funding": [
1494 | {
1495 | "type": "github",
1496 | "url": "https://github.com/sponsors/feross"
1497 | },
1498 | {
1499 | "type": "patreon",
1500 | "url": "https://www.patreon.com/feross"
1501 | },
1502 | {
1503 | "type": "consulting",
1504 | "url": "https://feross.org/support"
1505 | }
1506 | ]
1507 | },
1508 | "node_modules/safer-buffer": {
1509 | "version": "2.1.2",
1510 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1511 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1512 | },
1513 | "node_modules/semver": {
1514 | "version": "7.5.4",
1515 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1516 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1517 | "dependencies": {
1518 | "lru-cache": "^6.0.0"
1519 | },
1520 | "bin": {
1521 | "semver": "bin/semver.js"
1522 | },
1523 | "engines": {
1524 | "node": ">=10"
1525 | }
1526 | },
1527 | "node_modules/send": {
1528 | "version": "0.18.0",
1529 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1530 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1531 | "dependencies": {
1532 | "debug": "2.6.9",
1533 | "depd": "2.0.0",
1534 | "destroy": "1.2.0",
1535 | "encodeurl": "~1.0.2",
1536 | "escape-html": "~1.0.3",
1537 | "etag": "~1.8.1",
1538 | "fresh": "0.5.2",
1539 | "http-errors": "2.0.0",
1540 | "mime": "1.6.0",
1541 | "ms": "2.1.3",
1542 | "on-finished": "2.4.1",
1543 | "range-parser": "~1.2.1",
1544 | "statuses": "2.0.1"
1545 | },
1546 | "engines": {
1547 | "node": ">= 0.8.0"
1548 | }
1549 | },
1550 | "node_modules/send/node_modules/debug": {
1551 | "version": "2.6.9",
1552 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1553 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1554 | "dependencies": {
1555 | "ms": "2.0.0"
1556 | }
1557 | },
1558 | "node_modules/send/node_modules/debug/node_modules/ms": {
1559 | "version": "2.0.0",
1560 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1561 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1562 | },
1563 | "node_modules/send/node_modules/ms": {
1564 | "version": "2.1.3",
1565 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1566 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1567 | },
1568 | "node_modules/serve-static": {
1569 | "version": "1.15.0",
1570 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1571 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1572 | "dependencies": {
1573 | "encodeurl": "~1.0.2",
1574 | "escape-html": "~1.0.3",
1575 | "parseurl": "~1.3.3",
1576 | "send": "0.18.0"
1577 | },
1578 | "engines": {
1579 | "node": ">= 0.8.0"
1580 | }
1581 | },
1582 | "node_modules/set-blocking": {
1583 | "version": "2.0.0",
1584 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1585 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
1586 | },
1587 | "node_modules/set-function-length": {
1588 | "version": "1.1.1",
1589 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
1590 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
1591 | "dependencies": {
1592 | "define-data-property": "^1.1.1",
1593 | "get-intrinsic": "^1.2.1",
1594 | "gopd": "^1.0.1",
1595 | "has-property-descriptors": "^1.0.0"
1596 | },
1597 | "engines": {
1598 | "node": ">= 0.4"
1599 | }
1600 | },
1601 | "node_modules/setprototypeof": {
1602 | "version": "1.2.0",
1603 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1604 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1605 | },
1606 | "node_modules/side-channel": {
1607 | "version": "1.0.4",
1608 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1609 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1610 | "dependencies": {
1611 | "call-bind": "^1.0.0",
1612 | "get-intrinsic": "^1.0.2",
1613 | "object-inspect": "^1.9.0"
1614 | },
1615 | "funding": {
1616 | "url": "https://github.com/sponsors/ljharb"
1617 | }
1618 | },
1619 | "node_modules/sift": {
1620 | "version": "16.0.1",
1621 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
1622 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
1623 | },
1624 | "node_modules/signal-exit": {
1625 | "version": "3.0.7",
1626 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1627 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
1628 | },
1629 | "node_modules/simple-update-notifier": {
1630 | "version": "2.0.0",
1631 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1632 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1633 | "dependencies": {
1634 | "semver": "^7.5.3"
1635 | },
1636 | "engines": {
1637 | "node": ">=10"
1638 | }
1639 | },
1640 | "node_modules/sparse-bitfield": {
1641 | "version": "3.0.3",
1642 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1643 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1644 | "dependencies": {
1645 | "memory-pager": "^1.0.2"
1646 | }
1647 | },
1648 | "node_modules/statuses": {
1649 | "version": "2.0.1",
1650 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1651 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1652 | "engines": {
1653 | "node": ">= 0.8"
1654 | }
1655 | },
1656 | "node_modules/string_decoder": {
1657 | "version": "1.3.0",
1658 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1659 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1660 | "dependencies": {
1661 | "safe-buffer": "~5.2.0"
1662 | }
1663 | },
1664 | "node_modules/string-width": {
1665 | "version": "4.2.3",
1666 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1667 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1668 | "dependencies": {
1669 | "emoji-regex": "^8.0.0",
1670 | "is-fullwidth-code-point": "^3.0.0",
1671 | "strip-ansi": "^6.0.1"
1672 | },
1673 | "engines": {
1674 | "node": ">=8"
1675 | }
1676 | },
1677 | "node_modules/strip-ansi": {
1678 | "version": "6.0.1",
1679 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1680 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1681 | "dependencies": {
1682 | "ansi-regex": "^5.0.1"
1683 | },
1684 | "engines": {
1685 | "node": ">=8"
1686 | }
1687 | },
1688 | "node_modules/supports-color": {
1689 | "version": "5.5.0",
1690 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1691 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1692 | "dependencies": {
1693 | "has-flag": "^3.0.0"
1694 | },
1695 | "engines": {
1696 | "node": ">=4"
1697 | }
1698 | },
1699 | "node_modules/tar": {
1700 | "version": "6.2.0",
1701 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
1702 | "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
1703 | "dependencies": {
1704 | "chownr": "^2.0.0",
1705 | "fs-minipass": "^2.0.0",
1706 | "minipass": "^5.0.0",
1707 | "minizlib": "^2.1.1",
1708 | "mkdirp": "^1.0.3",
1709 | "yallist": "^4.0.0"
1710 | },
1711 | "engines": {
1712 | "node": ">=10"
1713 | }
1714 | },
1715 | "node_modules/to-regex-range": {
1716 | "version": "5.0.1",
1717 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1718 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1719 | "dependencies": {
1720 | "is-number": "^7.0.0"
1721 | },
1722 | "engines": {
1723 | "node": ">=8.0"
1724 | }
1725 | },
1726 | "node_modules/toidentifier": {
1727 | "version": "1.0.1",
1728 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1729 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1730 | "engines": {
1731 | "node": ">=0.6"
1732 | }
1733 | },
1734 | "node_modules/touch": {
1735 | "version": "3.1.0",
1736 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1737 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1738 | "dependencies": {
1739 | "nopt": "~1.0.10"
1740 | },
1741 | "bin": {
1742 | "nodetouch": "bin/nodetouch.js"
1743 | }
1744 | },
1745 | "node_modules/touch/node_modules/nopt": {
1746 | "version": "1.0.10",
1747 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1748 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1749 | "dependencies": {
1750 | "abbrev": "1"
1751 | },
1752 | "bin": {
1753 | "nopt": "bin/nopt.js"
1754 | },
1755 | "engines": {
1756 | "node": "*"
1757 | }
1758 | },
1759 | "node_modules/tr46": {
1760 | "version": "0.0.3",
1761 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1762 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
1763 | },
1764 | "node_modules/type-is": {
1765 | "version": "1.6.18",
1766 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1767 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1768 | "dependencies": {
1769 | "media-typer": "0.3.0",
1770 | "mime-types": "~2.1.24"
1771 | },
1772 | "engines": {
1773 | "node": ">= 0.6"
1774 | }
1775 | },
1776 | "node_modules/undefsafe": {
1777 | "version": "2.0.5",
1778 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1779 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
1780 | },
1781 | "node_modules/undici-types": {
1782 | "version": "5.26.5",
1783 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
1784 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
1785 | },
1786 | "node_modules/unpipe": {
1787 | "version": "1.0.0",
1788 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1789 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1790 | "engines": {
1791 | "node": ">= 0.8"
1792 | }
1793 | },
1794 | "node_modules/util-deprecate": {
1795 | "version": "1.0.2",
1796 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1797 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
1798 | },
1799 | "node_modules/utils-merge": {
1800 | "version": "1.0.1",
1801 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1802 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1803 | "engines": {
1804 | "node": ">= 0.4.0"
1805 | }
1806 | },
1807 | "node_modules/uuid": {
1808 | "version": "9.0.1",
1809 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
1810 | "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
1811 | "funding": [
1812 | "https://github.com/sponsors/broofa",
1813 | "https://github.com/sponsors/ctavan"
1814 | ],
1815 | "bin": {
1816 | "uuid": "dist/bin/uuid"
1817 | }
1818 | },
1819 | "node_modules/vary": {
1820 | "version": "1.1.2",
1821 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1822 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1823 | "engines": {
1824 | "node": ">= 0.8"
1825 | }
1826 | },
1827 | "node_modules/webidl-conversions": {
1828 | "version": "3.0.1",
1829 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1830 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
1831 | },
1832 | "node_modules/whatwg-url": {
1833 | "version": "5.0.0",
1834 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1835 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1836 | "dependencies": {
1837 | "tr46": "~0.0.3",
1838 | "webidl-conversions": "^3.0.0"
1839 | }
1840 | },
1841 | "node_modules/wide-align": {
1842 | "version": "1.1.5",
1843 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
1844 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
1845 | "dependencies": {
1846 | "string-width": "^1.0.2 || 2 || 3 || 4"
1847 | }
1848 | },
1849 | "node_modules/wrappy": {
1850 | "version": "1.0.2",
1851 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1852 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
1853 | },
1854 | "node_modules/yallist": {
1855 | "version": "4.0.0",
1856 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1857 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1858 | }
1859 | }
1860 | }
1861 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "bcrypt": "^5.1.1",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.3.1",
16 | "express": "^4.18.2",
17 | "jsonwebtoken": "^9.0.2",
18 | "mongoose": "^8.0.0",
19 | "nodemon": "^3.0.1",
20 | "uuid": "^9.0.1"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/server/routes.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const router = express.Router();
3 | const bcrypt = require("bcrypt");
4 | const authenticate = require("./middleware/authenticate");
5 | const { v4: uuid } = require("uuid");
6 |
7 | require("./db/connect");
8 | const User = require("./model/userSchema");
9 | const Task = require("./model/taskSchema");
10 |
11 | // home route
12 | router.get("/", (req, res) => {
13 | res.send("Hello World from the router server");
14 | });
15 |
16 | // register route
17 | router.post("/register", async (req, res) => {
18 | try {
19 | const { name, email, password, cpassword } = req.body;
20 |
21 | if (!name || !email || !password || !cpassword) {
22 | return res.status(422).json({ error: "You're missing some fields" });
23 | }
24 |
25 | const userEmailExist = await User.findOne({ email: email });
26 |
27 | if (userEmailExist) {
28 | res.status(409).json({ error: "Email already Exists" });
29 | } else if (password != cpassword) {
30 | res.status(400).json({ error: "Passwords are not matching" });
31 | } else {
32 | const user = new User({ name, email, password });
33 | await user.save();
34 | res.status(200).json({ message: "User Registered Successfully" });
35 |
36 | const newTask = new Task({
37 | email,
38 | tasks: [],
39 | });
40 | await newTask.save();
41 | console.log("yayyy");
42 | }
43 | } catch (err) {
44 | console.log(err);
45 | }
46 | });
47 |
48 | // login route
49 | router.post("/login", async (req, res) => {
50 | try {
51 | let token;
52 | const { email, password } = req.body;
53 |
54 | if (!email || !password) {
55 | return res.status(422).json({ error: "You're missing some fields" });
56 | }
57 |
58 | const userLogin = await User.findOne({ email: email });
59 |
60 | if (userLogin) {
61 | const isMatch = await bcrypt.compare(password, userLogin.password);
62 |
63 | if (!isMatch) {
64 | res.status(400).json({ error: "Invalid Credentials" });
65 | } else {
66 | token = await userLogin.generateAuthToken();
67 |
68 | res
69 | .status(200)
70 | .json({ token: token, message: "User Logged in Successfully" });
71 | }
72 | } else {
73 | res.status(400).json({ error: "Invalid Credentials" });
74 | }
75 | } catch (err) {
76 | console.log(err);
77 | }
78 | });
79 |
80 | // userdata getter route
81 | router.get("/userdata", authenticate, async (req, res) => {
82 | try {
83 | res.send(req.userdata);
84 | } catch (err) {
85 | console.error(err);
86 | }
87 | });
88 |
89 | // add task route
90 | router.post("/addtask", authenticate, async (req, res) => {
91 | try {
92 | const { email } = req.query;
93 | const { title, description, duedate, priority, status } = req.body;
94 | if (!email || !title || !description || !duedate || !priority || !status) {
95 | return res.status(422).json({ error: "You're missing some fields" });
96 | }
97 |
98 | const taskid = uuid().replace(/-/g, "");
99 | const task = {
100 | taskid,
101 | title,
102 | description,
103 | duedate,
104 | priority,
105 | status,
106 | };
107 |
108 | const existingEmail = await Task.findOne({ email });
109 | if (existingEmail) {
110 | existingEmail.tasks.push(task);
111 | await existingEmail.save();
112 | } else {
113 | const newTask = new Task({
114 | email,
115 | tasks: [task],
116 | });
117 | await newTask.save();
118 | }
119 |
120 | res.status(200).json({ message: "Task Added Successfully" });
121 | } catch (err) {
122 | console.log(err);
123 | }
124 | });
125 |
126 | // edit task route
127 | router.patch("/edittask/:taskId", async (req, res) => {
128 | try {
129 | const { email } = req.query;
130 | const { title, description, duedate, priority, status } = req.body;
131 |
132 | const tid = req.params.taskId;
133 | const existingEmail = await Task.findOne({ email });
134 |
135 | const taskToEdit = existingEmail.tasks.find(
136 | (i) => i.taskid.toString() === tid
137 | );
138 |
139 | if (!taskToEdit) {
140 | return res.status(404).json({ error: "Task not found" });
141 | }
142 |
143 | const historyEntry = {
144 | title_prev: taskToEdit.title,
145 | description_prev: taskToEdit.description,
146 | duedate_prev: taskToEdit.duedate,
147 | priority_prev: taskToEdit.priority,
148 | status_prev: taskToEdit.status,
149 | title_now: title,
150 | description_now: description,
151 | duedate_now: duedate,
152 | priority_now: priority,
153 | status_now: status,
154 | };
155 |
156 | taskToEdit.title = title;
157 | taskToEdit.description = description;
158 | taskToEdit.duedate = duedate;
159 | taskToEdit.priority = priority;
160 | taskToEdit.status = status;
161 |
162 | taskToEdit.history.push(historyEntry);
163 | await existingEmail.save();
164 |
165 | res.status(200).json({ message: "Task updated successfully" });
166 | } catch (err) {
167 | console.log(err);
168 | }
169 | });
170 |
171 | // delete task route
172 | router.delete("/delete/:taskId", authenticate, async (req, res) => {
173 | try {
174 | const { email } = req.query;
175 |
176 | const tid = req.params.taskId;
177 | const existingEmail = await Task.findOne({ email });
178 | const taskToDel = existingEmail.tasks.find(
179 | (i) => i.taskid.toString() === tid
180 | );
181 |
182 | existingEmail.tasks.pull(taskToDel._id);
183 | await existingEmail.save();
184 |
185 | res.status(200).json({ message: "Task deleted successfully" });
186 | } catch (err) {
187 | console.log(err);
188 | res.status(500).json({ error: "Internal Server Error" });
189 | }
190 | });
191 |
192 | // my tasks list route
193 | router.get("/mytasks", authenticate, async (req, res) => {
194 | try {
195 | const { email } = req.query;
196 | const existingEmail = await Task.findOne({ email });
197 | res.send(existingEmail.tasks);
198 | } catch (err) {
199 | console.log(err);
200 | }
201 | });
202 |
203 | // view task details route
204 | router.get("/viewtask/:taskId", authenticate, async (req, res) => {
205 | try {
206 | const { email } = req.query;
207 |
208 | const tid = req.params.taskId;
209 | const existingEmail = await Task.findOne({ email });
210 |
211 | const taskToView = existingEmail.tasks.find(
212 | (i) => i.taskid.toString() === tid
213 | );
214 |
215 | res.send(taskToView);
216 | } catch (err) {
217 | console.log(err);
218 | }
219 | });
220 |
221 | // view history route
222 | router.get("/viewhistory/:taskId", authenticate, async (req, res) => {
223 | try {
224 | const { email } = req.query;
225 |
226 | const tid = req.params.taskId;
227 | const existingEmail = await Task.findOne({ email });
228 |
229 | const locatingTask = existingEmail.tasks.find(
230 | (i) => i.taskid.toString() === tid
231 | );
232 |
233 | res.send(locatingTask.history);
234 | } catch (err) {
235 | console.log(err);
236 | }
237 | });
238 |
239 | module.exports = router;
240 |
--------------------------------------------------------------------------------
/server/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "name": "tms-server",
4 | "builds": [{ "src": "index.js", "use": "@vercel/node" }],
5 | "routes": [
6 | {
7 | "src": "/(.*)",
8 | "dest": "/"
9 | }
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------