From 779aa82a12abb9a71b5a0768fe8a29fae5e1c130 Mon Sep 17 00:00:00 2001 From: Vidunram A R <64352864+Goose-Of-War@users.noreply.github.com> Date: Fri, 30 Jun 2023 22:30:22 +0530 Subject: [PATCH] Release 3.3.0 (#202) Co-authored-by: PartMan Co-authored-by: NP Co-authored-by: KarmaAkaB <121283566+KarmaAkaB@users.noreply.github.com> Co-authored-by: Symbiot01 Co-authored-by: Ankan Co-authored-by: Baron105 <76466796+Baron105@users.noreply.github.com> Co-authored-by: Chaitanya-Srinivas <111225128+Chaitanya-Srinivas@users.noreply.github.com> Co-authored-by: SachdevJai Co-authored-by: SachdevJai <118045698+SachdevJai@users.noreply.github.com> Co-authored-by: Ankan <93087057+ItsAnkan@users.noreply.github.com> Co-authored-by: _Horizon <124589544+DishantB0411@users.noreply.github.com> Co-authored-by: Symbiot01 <114978589+Symbiot01@users.noreply.github.com> --- .eslintrc.json | 4 + .github/workflows/test.yml | 2 + README.md | 166 +++- assets/icons/amv.svg | 2 + assets/icons/amv_2.svg | 3 + assets/icons/amv_3.svg | 12 + assets/icons/design.svg | 4 + assets/icons/design_2.svg | 33 + assets/icons/newsletter.svg | 36 + assets/icons/newsletter_2.svg | 3 + assets/icons/quiz.svg | 18 + assets/icons/webdev.svg | 2 + assets/icons/webdev_2.svg | 19 + assets/icons/webdev_3.svg | 3 + assets/members/21_anwesha.webp | Bin 11880 -> 21606 bytes assets/styles/icons.scss | 182 ++-- assets/styles/mask.scss | 2 + database/database.js | 3 +- database/handler.js | 90 +- database/schemas/Post.js | 2 +- database/schemas/Submission.js | 17 + TESTING.md => docs/TESTING.md | 6 +- docs/past_newsletters.md | 84 ++ npm-shrinkwrap.json | 806 ++++++++---------- package.json | 15 +- routes/checker.js | 8 +- routes/corsProxy.js | 8 +- routes/git-hook.js | 13 +- routes/govportal.js | 120 ++- routes/home.js | 8 +- routes/instaupload.js | 21 - routes/live.js | 10 +- routes/media.js | 10 +- routes/members.js | 10 +- routes/misc.js | 11 +- routes/newsletter.js | 10 +- routes/polls.js | 25 +- routes/prizes.js | 8 +- routes/profile.js | 14 +- routes/py-events.js | 20 +- routes/quizzes.js | 8 +- routes/submission.js | 25 + routes/user.js | 18 +- src/env.js | 7 +- src/mask.js | 8 +- src/middleware.js | 28 +- src/route.js | 78 +- src/samples/user.json | 7 + src/socket.js | 4 - src/teams.json | 24 +- templates/404.njk | 7 +- templates/_base.njk | 5 +- templates/_event.njk | 7 +- templates/_newsletter.njk | 260 ++++-- templates/about.njk | 7 +- templates/applications.njk | 4 +- templates/art.njk | 3 +- templates/event-articles/cosplay23.njk | 3 +- templates/event-articles/intrasoc.njk | 17 +- templates/event-articles/py_events.njk | 64 +- templates/event-articles/qatq.njk | 13 +- templates/event-articles/seekers-quest.njk | 7 +- templates/event-articles/suzumetrip.njk | 23 +- templates/events.njk | 3 +- templates/events/fandom_quiz.njk | 7 +- templates/events/live_master.njk | 2 +- templates/events/live_participant.njk | 8 +- templates/events/quiz_attempted.njk | 2 +- templates/events/quiz_countdown.njk | 2 +- templates/events/quiz_login.njk | 2 +- templates/events/quiz_success.njk | 4 +- templates/events/results.njk | 2 +- templates/events/static_quiz.njk | 24 +- templates/govportal/add-poll.njk | 5 +- templates/govportal/add-post.njk | 9 +- templates/govportal/edit-poll.njk | 277 ++++++ templates/govportal/edit-post.njk | 284 ++++++ templates/govportal/govportal.njk | 46 +- templates/govportal/image-upload.njk | 21 +- templates/govportal/member-management.njk | 46 +- templates/govportal/poll-management.njk | 213 +++++ templates/govportal/post-management.njk | 209 +++++ templates/home.njk | 8 +- templates/leaderboard.njk | 2 +- templates/login.njk | 7 +- templates/members.njk | 12 +- templates/newsletters.njk | 3 +- templates/newsletters/2021-08-1/2021-08-1.njk | 10 +- templates/newsletters/2021-09-1/2021-09-1.njk | 12 +- templates/newsletters/2021-09-2/2021-09-2.njk | 8 +- templates/newsletters/2021-10-1/2021-10-1.njk | 28 +- templates/newsletters/2021-10-2/2021-10-2.njk | 25 +- .../04#light-novel-review-mushoku-tensei.njk | 6 +- templates/newsletters/2022-12-1/2022-12-1.njk | 9 +- .../04#mangaka-review-naoko-takeuchi.njk | 4 +- templates/newsletters/2023-02-1/2023-02-1.njk | 11 +- ...a-ga-ore-tueee-kuse-ni-shinchou-sugiru.njk | 10 +- ...ew-in-another-world-with-my-smartphone.njk | 2 +- .../03#anime-review-eminence-in-shadow.njk | 2 +- .../2023-03-1/04#isekai-recommendations.njk | 38 +- templates/newsletters/2023-03-1/2023-03-1.njk | 11 +- ...#anime-review-my-clueless-first-friend.njk | 2 +- ...me-review-danshi-koukousei-no-nichijou.njk | 14 +- .../04#anime-review-school-babysitters.njk | 4 +- templates/newsletters/2023-04-1/2023-04-1.njk | 12 +- .../2023-05-1/01#anime-news-scan.njk | 2 +- .../02#upcoming-action-anime-review.njk | 4 +- .../03#anime-review-demon-slayer.njk | 14 +- ...r-action-meme-dialogues-over-the-years.njk | 6 +- templates/newsletters/2023-05-1/2023-05-1.njk | 11 +- templates/past_newsletters.md | 67 -- templates/poll_list.njk | 9 +- templates/poll_results.njk | 13 +- templates/poll_vote.njk | 27 +- templates/privacy.njk | 7 +- templates/profile.njk | 5 +- templates/rebuild.njk | 2 +- templates/submissions.njk | 253 +++--- templates/terms.njk | 3 +- templates/under_maintenance.njk | 5 +- templates/videos.njk | 3 +- test/site-mongoless.js | 2 +- 122 files changed, 2963 insertions(+), 1313 deletions(-) create mode 100644 assets/icons/amv.svg create mode 100644 assets/icons/amv_2.svg create mode 100644 assets/icons/amv_3.svg create mode 100644 assets/icons/design.svg create mode 100644 assets/icons/design_2.svg create mode 100644 assets/icons/newsletter.svg create mode 100644 assets/icons/newsletter_2.svg create mode 100644 assets/icons/quiz.svg create mode 100644 assets/icons/webdev.svg create mode 100644 assets/icons/webdev_2.svg create mode 100644 assets/icons/webdev_3.svg create mode 100644 database/schemas/Submission.js rename TESTING.md => docs/TESTING.md (93%) create mode 100644 docs/past_newsletters.md delete mode 100644 routes/instaupload.js create mode 100644 routes/submission.js create mode 100644 src/samples/user.json delete mode 100644 src/socket.js create mode 100644 templates/govportal/edit-poll.njk create mode 100644 templates/govportal/edit-post.njk create mode 100644 templates/govportal/poll-management.njk create mode 100644 templates/govportal/post-management.njk delete mode 100644 templates/past_newsletters.md diff --git a/.eslintrc.json b/.eslintrc.json index 9dee4f8c..b5c1647c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -40,6 +40,10 @@ "prefer-const": ["error", { "ignoreReadBeforeAssign": true }], + "quotes": ["error", "single", { + "allowTemplateLiterals": true, + "avoidEscape": true + }], "semi": ["error", "always"], "semi-spacing": ["error", { "before": false, diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8b2b5344..e7fa5f4b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,11 +6,13 @@ on: paths-ignore: - 'LICENSE' - 'README.md' + - 'docs' pull_request: branches: [ main, dev ] paths-ignore: - 'LICENSE' - 'README.md' + - 'docs' jobs: test: diff --git a/README.md b/README.md index 47e20ae3..115ef074 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,23 @@ # MASK -The website for the Manga & Anime Society Kharagpur -## Contributing +The website for the Manga and Anime Society Kharagpur (currently running in [kgpmask.club](https://kgpmask.club)) -The owner of this repository is @PartMan7, who also runs the server. He's also running the server cost (at the time of writing he's in his final year, but it'll carry on even after graduation). -All non-trivial changes are done through PULL REQUESTS ONLY. The WebDev Team Head (currently @Goose-Of-War) is responsible for testing and merging all PRs. Feel free to pester them to look at the changes you've prepared. - -To create a pull request, navigate to the `dev` branch (clicking on the GitHub client, or `git checkout dev` on the CLI) and create a new branch based on it (`New Branch` button (based on the `dev` branch, again!) on the GitHub client's branches page, or `git checkout -b [branch-name]` on the CLI). Pull requests will _never_ be merged directly to `main`; they will be first merged to `dev` and batches of changes and/or patches will be merged from `dev` to `main` alongside version increments. - -To work on templates which require access to credentials using `dev userless` (`du`) mode, check out [this page](/TESTING.md) for some info. +## Tech Stack -Changes to the `dev` server are automatically deployed to [https://test.kgpmask.club]. This does not extend to environment configuration changes (eg: docker changes). +- VPS provider: OVH +- Backend reverse proxy for port-forwarding: NGINX +- Containerized deployments: Docker (we aren't using dockerized containers right now) +- Application language: Node.js +- App routing: Express.js +- Page templates: Nunjucks +- Page styling: SASS +- Database: MongoDB +- Database ORM: mongoose +- Linting: ESLint +- Testing suite: Mocha -Ensure that pull requests pass tests (`npm test` for both lint and mocha tests). +--- ## Running the Server @@ -22,7 +26,7 @@ This server requires Node.js v16.0+ to run, and all tests are performed on v16. There are multiple ways to run the server. The vast majority of the time, you will be running it in dev mode - the command for this is `npm run dev`. If you wish to run in regular mode, the command is `npm start`. Note that the server run in both cases will be identical - the only difference is that dev mode will automatically refresh changes made to the server code and/or pages, while regular mode will not. In addition, you can add flags to customize the operation of the server. These are: - `dev` (d): An internal flag that does the same as `npm run dev`, except you lose access to nodemon. Just use `npm run dev` instead. -- `jsonuser` (t): Runs the server with the user details being defined in `/src/user.json`. **This is in progress.** +- ~~`jsonuser` (t): Runs the server with the user details being defined in `/src/user.json`.~~ **This is in progress.** - `local` (l): Uses a local database (mongodb://127.0.0.1/mask) instead of the designated test database. Overwrites all other DB flags. - `mongoless` (m): Runs the server without a database connection. All database-based pages cannot be loaded. This is a superset of the `userless` flag (ie; a `mongoless` server will also always be `userless`). - `prod` (p): Connects directly to the production database. Do NOT use this flag lightly; it can break many, many things if you mess up and the testing database should serve your purposes. Cannot be used in conjuction with dev mode, for security reasons. @@ -50,23 +54,7 @@ Furthermore, for those with access to multiple sets of credentials (the three ex Note (edited): You can now connect to the database even while on WiFi/LAN without a VPN. The domain name has been whitelisted. The IP address has NOT been whitelisted for direct http/https connections. -## Guidelines - -Tabs for indentation, basic JS style guidelines (check `./eslintrc.json` for the full list). If you have any questions, post 'em in the WebDev channel. If you aren't a member of the society but have queries/reports/suggestions, feel free to use the Issues / Discussions pages on the repository. - -## Tech Stack - -- VPS provider: OVH -- Backend reverse proxy for port-forwarding: NGINX -- Containerized deployments: Docker -- Application language: Node.js -- App routing: Express.js -- Page templates: Nunjucks -- Page styling: SASS -- Database: MongoDB -- Database ORM: mongoose -- Linting: ESLint -- Testing suite: Mocha +--- ## Templates @@ -86,7 +74,8 @@ Additionally, the following blocks may be set: The default page template is: -```nunjucks + +```jinja {% extends "_base.njk" %} {% set thispage = 'navref' %} @@ -100,7 +89,8 @@ The default page template is: The default newsletter template is: -```nunjucks + +```jinja {% extends "_newsletter.njk" %} {% set pagetitle = 'Month - Issue num' %} @@ -117,19 +107,103 @@ The default newsletter template is: Take a look at existing articles for the various classes and where they're used. -## Credits: - -- Parth Mane (Lead)
-- Vidunram A R (Contributor)
-- Nishkal Prakash (Contributor)
-- Venkatsai Mokshith (Contributor)
-- Jai Sachdev (Contributor)
-- Ankan Saha (Contributor)
-- Sahil Patel (Contributor)
-- Soumil Maiti (Contributor)
-- Anjani Kumar (Contributor)
-- Karthikeya Y M (Contributor)
-- Soham Sen (Contributor)
-- Ayush Parmar (Contributor)
-- Saumyadip Nandy (Contributor)
-- Vishesh Gupta (Contributor)
+--- + +## Routers + + +The Express app's router is set up by `/src/route.js`. The file route.js imports routers from the `/routes` folder. Each router file has the following format: + +```js +const router = require('express').Router(); +// This router is used to configure the app for a specific route + +// GET requests +app.get('/path', (req, res, next) => { + // some code + return res.renderFile(template, ctx); +}); + +// POST requests +app.post('/path', (req, res, next) => { + // some code + return res.status(statusCode).send; +}); + +/* +Notes: + The next argument is optional in most cases. + The functions in the requests can be asynchronous too. + You can use other routers as well if needed. +*/ + +module.exports = { + route: '/path' + router; +} +``` + +All routers are imported and used in `route.js` in the `src` folder. + +```js +const routerModules = (await fs.readdir(path.join(__dirname, '../routes'))).filter(file => file.endsWith('.js')); +routerModules.forEach(module => { + const { route, router } = require(`../routes/${module}`); + app.use(route, router); +}); +``` + +--- + +## Contributing + +The owner of this repository is @PartMan7, who also runs the server. He's also running the server cost (at the time of writing he's in his final year, but it'll carry on even after graduation). + +All non-trivial changes are done through PULL REQUESTS ONLY. The WebDev Team Head (currently @Goose-Of-War) is responsible for testing and merging all PRs. Feel free to pester them to look at the changes you've prepared. + +To create a pull request, navigate to the `dev` branch (clicking on the GitHub client, or `git checkout dev` on the CLI) and create a new branch based on it (`New Branch` button (based on the `dev` branch, again!) on the GitHub client's branches page, or `git checkout -b [branch-name]` on the CLI). Pull requests will _never_ be merged directly to `main`; they will be first merged to `dev` and batches of changes and/or patches will be merged from `dev` to `main` alongside version increments. + +To work on templates which require access to credentials using `dev userless` (`du`) mode, check out [this page](/docs/TESTING.md) for some info. + +Changes to the `dev` server are automatically deployed to [test.kgpmask.club](https://test.kgpmask.club). This does not extend to environment configuration changes (eg: docker changes). + +Ensure that pull requests pass tests (`npm test` for both lint and mocha tests). + +--- + +## Guidelines + +- For any new route, make sure to use a new router file instead of adding to `route.js` +- Make sure to extend your template from either `_base.njk` or another template (in case of similar pages, like events or newsletters). +- Make sure the code passes the lint and mocha tests. You can check that by running `npm run test`. The ESLint configuration can be seen in `.eslintrc.json` and tests can be seen in the `test` folder. +- If you have any questions, post 'em in the WebDev channel. +- If you aren't a member of the society but have queries/reports/suggestions, feel free to use the [Issues](https://github.com/kgpmask/MASK/issues)/[Discussions](https://github.com/kgpmask/MASK/discussions) pages. + +--- + +## Credits + +### Current Contributors + +- Vidunram A R (Lead) +- Nishkal Prakash +- Jai Sachdev +- Ankan Saha +- Sahil Patel +- Soumil Maiti +- Dishant Bothra + +### Former Contributors + +- Parth Mane +- Anjani Kumar +- Soham Sen +- Vishesh Gupta +- Saumyadip Nandy +- Venkatsai Mokshith +- Karthikeya Y M +- Ayush Parmar + +### Open Source Contributors + +- Barun Parua diff --git a/assets/icons/amv.svg b/assets/icons/amv.svg new file mode 100644 index 00000000..21682d36 --- /dev/null +++ b/assets/icons/amv.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/icons/amv_2.svg b/assets/icons/amv_2.svg new file mode 100644 index 00000000..3b521a71 --- /dev/null +++ b/assets/icons/amv_2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/amv_3.svg b/assets/icons/amv_3.svg new file mode 100644 index 00000000..5f63af62 --- /dev/null +++ b/assets/icons/amv_3.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/design.svg b/assets/icons/design.svg new file mode 100644 index 00000000..40128c35 --- /dev/null +++ b/assets/icons/design.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/assets/icons/design_2.svg b/assets/icons/design_2.svg new file mode 100644 index 00000000..c048ead9 --- /dev/null +++ b/assets/icons/design_2.svg @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/assets/icons/newsletter.svg b/assets/icons/newsletter.svg new file mode 100644 index 00000000..36364b5b --- /dev/null +++ b/assets/icons/newsletter.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/newsletter_2.svg b/assets/icons/newsletter_2.svg new file mode 100644 index 00000000..9a299392 --- /dev/null +++ b/assets/icons/newsletter_2.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/quiz.svg b/assets/icons/quiz.svg new file mode 100644 index 00000000..1164709a --- /dev/null +++ b/assets/icons/quiz.svg @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/assets/icons/webdev.svg b/assets/icons/webdev.svg new file mode 100644 index 00000000..0d61b92c --- /dev/null +++ b/assets/icons/webdev.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/icons/webdev_2.svg b/assets/icons/webdev_2.svg new file mode 100644 index 00000000..271efe53 --- /dev/null +++ b/assets/icons/webdev_2.svg @@ -0,0 +1,19 @@ + + + + + code [#1115] + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/webdev_3.svg b/assets/icons/webdev_3.svg new file mode 100644 index 00000000..11f8c5af --- /dev/null +++ b/assets/icons/webdev_3.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/members/21_anwesha.webp b/assets/members/21_anwesha.webp index 5e2cea5a0f30e6ae0851cef060828cabb431c836..4348e94d3e174010a863f6223cadd55fbcac6126 100644 GIT binary patch delta 21110 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%0A3dT7GKX{ip!O!>90*ea(9#1 z6pyY6Wha}p@R|AvzKp(|SsAhPFsfy#^I(SmbyJ(ldhh1vtP+#__*L>;L$8~n`#d43 ze}%m`fnXu*rW$JaOlfci8#=f15iLST~AXm3Q_kHE#Z|PeZ9-<~knC$JL9P za&zddBNm?*hH7B^6Mh&LpuXeZ0}g?yW$|z`cMx|3uUO=>q{t9~;pQU#+}$ccy*U@? zw~`TqoS7E1&lU3p%D9;Z@iGrw@|cNtI`)OrD>7H<$Qiq8WV#;1yl7z%ogprzL72En zqs+5s4=(_}&;0s}A?N??=|2BhJeL0PERo(Q3| N!TlXoP?TRd004xjNv;3@ delta 11307 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 diff --git a/assets/styles/icons.scss b/assets/styles/icons.scss index 3342c9d0..2d32807a 100644 --- a/assets/styles/icons.scss +++ b/assets/styles/icons.scss @@ -11,95 +11,133 @@ } [class^="icon-"], [class*=" icon-"] { - font-family: 'icomoon' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; + // font-family: 'icomoon' !important; + // // speak: never; + // font-style: normal; + // font-weight: normal; + // font-variant: normal; + // text-transform: none; + // line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} + // -webkit-font-smoothing: antialiased; + // -moz-osx-font-smoothing: grayscale; -.icon-design:before { - content: "\e900"; -} -.icon-newsletter:before { - content: "\e907"; -} -.icon-amv:before { - content: "\e913"; -} -.icon-webdev:before { - content: "\ea80"; -} -.icon-quiz:before { - content: "☑"; - font-size: 1.3em; -} -.icon-music:before { - content: "\e911"; + -webkit-mask-size: cover; + mask-size: cover; + display: inline-block; + width: 20px; + height: 20px; + mask-repeat: no-repeat; + -webkit-mask-repeat: no-repeat; } -.icon-design-head:before { - content: "\e900"; - color: #e8ce3d; -} -.icon-newsletter-head:before { - content: "\e907"; - color: #e8ce3d; -} -.icon-amv-head:before { - content: "\e913"; - color: #e8ce3d; -} -.icon-quiz-head:before { - content: "☑"; - font-size: 1.3em; - color: #e8ce3d; +.icon-design { + -webkit-mask:url('/assets/icons/design.svg'); + mask:url('/assets/icons/design.svg'); + // background-image: url('/assets/icons/DNA.svg'); + background: white; +} +.icon-newsletter { + -webkit-mask:url('/assets/icons/newsletter.svg'); + mask:url('/assets/icons/newsletter.svg'); + background: white; + } -.icon-webdev-head:before { - content: "\ea80"; - color: #e8ce3d; +.icon-amv { + -webkit-mask:url('/assets/icons/amv.svg'); + mask:url('/assets/icons/amv.svg'); + background: white; + } +.icon-webdev { + -webkit-mask:url('/assets/icons/webdev.svg'); + mask:url('/assets/icons/webdev.svg'); + background: white; -.icon-music-head:before { - content: "\e911"; - color: #e8ce3d; } +.icon-quiz { + -webkit-mask:url('/assets/icons/quiz.svg'); + mask:url('/assets/icons/quiz.svg'); + // font-size: 1.3em; + background: white; -.icon-design-sub:before { - content: "\e900"; - color: #30b868; } -.icon-newsletter-sub:before { - content: "\e907"; - color: #30b868; +.icon-music { + -webkit-mask:url('/assets/icons/music.svg'); + mask:url('/assets/icons/music.svg'); + background: white; + } -.icon-amv-sub:before { - content: "\e913"; - color: #30b868; + +.icon-design-head { + -webkit-mask:url('/assets/icons/design.svg'); + mask:url('/assets/icons/design.svg'); + background: #e8ce3d; +} +.icon-newsletter-head { + -webkit-mask:url('/assets/icons/newsletter.svg'); + mask:url('/assets/icons/newsletter.svg'); + background: #e8ce3d; +} +.icon-amv-head { + -webkit-mask:url('/assets/icons/amv.svg'); + mask:url('/assets/icons/amv.svg'); + background: #e8ce3d; +} +.icon-quiz-head { + -webkit-mask:url('/assets/icons/quiz.svg'); + mask:url('/assets/icons/quiz.svg'); + // font-size: 1.3em; + background: #e8ce3d; +} +.icon-webdev-head { + -webkit-mask:url('/assets/icons/webdev.svg'); + mask:url('/assets/icons/webdev.svg'); + background: #e8ce3d; } -.icon-quiz-sub:before { - content: "☑"; - font-size: 1.3em; - color: #30b868; + +.icon-music-head { + -webkit-mask:url('/assets/icons/music.svg'); + mask:url('/assets/icons/music.svg'); + background: #e8ce3d; } -.icon-webdev-sub:before { - content: "\ea80"; - color: #30b868; + +.icon-design-sub { + -webkit-mask:url('/assets/icons/design.svg'); + mask:url('/assets/icons/design.svg'); + background: #30b868; +} +.icon-newsletter-sub { + -webkit-mask:url('/assets/icons/newsletter.svg'); + mask:url('/assets/icons/newsletter.svg'); + background: #30b868; +} +.icon-amv-sub { + -webkit-mask:url('/assets/icons/amv.svg'); + mask:url('/assets/icons/amv.svg'); + background: #30b868; +} +.icon-quiz-sub { + -webkit-mask:url('/assets/icons/quiz.svg'); + mask:url('/assets/icons/quiz.svg'); + // font-size: 1.3em; + background: #30b868; +} +.icon-webdev-sub { + -webkit-mask:url('/assets/icons/webdev.svg'); + mask:url('/assets/icons/webdev.svg'); + background: #30b868; } -.icon-music-sub:before { - content: "\e911"; - color: #30b868; +.icon-music-sub { + -webkit-mask:url('/assets/icons/music.svg'); + mask:url('/assets/icons/music.svg'); + background: #30b868; } -.icon-download:before { +.icon-download { content: "\e933"; } -.icon-random:before { +.icon-random { content: "\ea30"; -} \ No newline at end of file +} diff --git a/assets/styles/mask.scss b/assets/styles/mask.scss index d4325d46..7c7eb482 100644 --- a/assets/styles/mask.scss +++ b/assets/styles/mask.scss @@ -27,6 +27,8 @@ body { background: linear-gradient(rgba(0, 0, 0, 0.85), rgba(0, 0, 0, 0.85)), url('/assets/background.jpg'); background-size: cover; background-position: center; + background-repeat: no-repeat; + background-attachment: fixed; text-align: center; color: var(--light-gray); font-family: Ubuntu, Roboto, Arial, Open Sans, sans-serif; diff --git a/database/database.js b/database/database.js index 22ecd0f7..f775dac3 100644 --- a/database/database.js +++ b/database/database.js @@ -1,12 +1,13 @@ const mongoose = require('mongoose'); exports.init = async () => { + const prodHosts = [...Array(3)].map((_, i) => `ac-5rrleks-shard-00-0${i}.muhi0zw.mongodb.net`); if (!process.env.MONGO_URL) return console.log('[!!!] Unable to connect to database: no URL supplied'); try { const db = await mongoose.connect(process.env.MONGO_URL, { connectTimeoutMS: 5000 }); const socket = db.connections[0]; if (!PARAMS.test) console.log(`Connected to the database at ${socket.host}:${socket.port}`); - if (socket.host === 'ac-5rrleks-shard-00-01.muhi0zw.mongodb.net' && socket.name === 'mask') { + if (prodHosts.includes(socket.host) && socket.name === 'mask') { if (PARAMS.test) { console.log('HOLY SHIT WHY ARE YOU CONNECTING TO PROD IN A TEST SUITE AAAAAA'); console.log('*defenestrates to prevent damage*'); diff --git a/database/handler.js b/database/handler.js index fe8657e3..5d1eb6a0 100644 --- a/database/handler.js +++ b/database/handler.js @@ -5,7 +5,7 @@ const Member = require('./schemas/Member'); const Newsletter = require('./schemas/Newsletter'); const Poll = require('./schemas/Poll'); const Post = require('./schemas/Post'); -const { findOne } = require('./schemas/User'); +const Submission = require('./schemas/Submission'); // Handle newly registered user or normal login async function createNewUser (profile) { @@ -106,6 +106,26 @@ function getPosts (postType) { // TODO: Make this accept a number of posts as a cap filter return Post.find(postType ? { type: postType } : {}).sort({ date: -1 }); } +async function getPost (id) { + return Post.findById(id); +} +async function deletePost (link) { + const postDeleted = Post.findOneAndDelete({ 'link': link }); + return postDeleted; +} +async function editPost (data) { + const updatedPost = Post.findOneAndUpdate({ '_id': data.id }, { + 'name': data.name, + 'link': data.link, + 'type': data.type, + 'attr': data.attr, + 'date': data.date + }, { + new: true + }); + // console.log(updatedPost); + return updatedPost; +} async function addPost (data) { if (data.page === '') delete data.page; @@ -114,12 +134,51 @@ async function addPost (data) { return post.toObject(); } +async function getPolls () { + return Poll.find().lean().sort({ _id: -1 }); +} + +async function getPoll (id) { + return Poll.findById(id); +} + async function addPoll (data) { const poll = new Poll(data); await poll.save(); return poll.toObject(); } +async function deletePoll (id) { + const postDeleted = Poll.findOneAndDelete({ '_id': id }); + return postDeleted; +} + +async function deletePollOption (data) { + const poll = await Poll.findById(data.pollId); + const indexToDelete = poll.records.findIndex(record => record._id.toString() === data.optionId); + if (indexToDelete !== -1) { + poll.records.splice(indexToDelete, 1); + } + const updatedPoll = await poll.save(); + return updatedPoll; +} + +async function editPoll (data) { + const poll = await Poll.findById(data.id); + console.log('hehe', poll); + poll.title = data.title; + poll.endTime = data.endTime; + for (let i = 0; i < poll.records.length; i++) { + poll.records[i].value = data.records[i].value; + } + for (let i = poll.records.length; i < data.records.length; i++) { + poll.records.push(data.records[i]); + } + const updatedPoll = await poll.save(); + return updatedPoll; +} + + async function getActivePolls () { const polls = await Poll.find({ endTime: { '$gt': new Date() } }); // console.log(polls); @@ -131,8 +190,8 @@ async function getMonthlyPolls (month) { const polls = await Poll.find( { '_id': { - "$regex": `${date.getFullYear() + "-" + ("0" + (month ? month : date.getMonth() + 1)).slice(-2) + "-"}`, - "$options": "i" + '$regex': `${date.getFullYear() + '-' + ('0' + (month ? month : date.getMonth() + 1)).slice(-2) + '-'}`, + '$options': 'i' } } ).lean(); @@ -156,7 +215,7 @@ async function updatePoll (ctx) { } async function getMembersbyYear (year) { - const data = await Member.find({ 'records.year': year }).sort('name').lean(); + const data = await Member.find({ 'records.year': ~~year }).sort('name').lean(); const yearData = []; const teamsData = require('../src/teams.json'); data.forEach(member => { @@ -277,7 +336,15 @@ async function exportToNextYear () { } } - +async function addSubmission (ctx) { + const idPrefix = `${new Date().toISOString().slice(0, 8)}`; + const _id = `${idPrefix}${(await Submission.find({ _id: { '$regex': '^' + idPrefix } })).length + 1}`; + const submission = new Submission({ + ...ctx, + _id + }); + return submission.save(); +} module.exports = { @@ -293,14 +360,23 @@ module.exports = { addLiveResult, getNewsletter, getPosts, + getPost, + deletePost, + editPost, addPost, - getMembersbyYear, + getPoll, + getPolls, addPoll, + deletePoll, + deletePollOption, + editPoll, + getMembersbyYear, getActivePolls, getMonthlyPolls, updatePoll, removeTeam, getCurrentMembers, exportToNextYear, - addTeam + addTeam, + addSubmission }; diff --git a/database/schemas/Post.js b/database/schemas/Post.js index bfcfc5ad..e2e0e82f 100644 --- a/database/schemas/Post.js +++ b/database/schemas/Post.js @@ -17,6 +17,6 @@ const postSchema = new mongoose.Schema({ postSchema.set('collection', 'posts'); -postModel = mongoose.model('posts', postSchema); +postModel = mongoose.model('Post', postSchema); module.exports = postModel; diff --git a/database/schemas/Submission.js b/database/schemas/Submission.js new file mode 100644 index 00000000..2573d909 --- /dev/null +++ b/database/schemas/Submission.js @@ -0,0 +1,17 @@ +const mongoose = require('mongoose'); + +const submissionSchema = new mongoose.Schema({ + _id: { type: String, required: true }, + name: { type: String, required: true }, + email: { type: String, required: true }, + member: Boolean, + type: { type: String, required: true }, + link: { type: String, required: true }, + proof: String, + social: String, + date: { type: Date, default: new Date(), required: true } +}); + +submissionSchema.set('collection', 'submissions'); + +module.exports = mongoose.model('Submission', submissionSchema); diff --git a/TESTING.md b/docs/TESTING.md similarity index 93% rename from TESTING.md rename to docs/TESTING.md index 2ad0b356..6c208fa6 100644 --- a/TESTING.md +++ b/docs/TESTING.md @@ -1,6 +1,6 @@ -# Tips for working on templates using credentials in `dev userless` mode +# Tips for working on templates using credentials in `dev userless and mongoless` mode -As you check `handler.js`, you might come across a few cases which checks for `loggedIn` or `PARAMS`. Generally, the templates which are supposed to be rendered by this cannot be accessed by this in `dev userless` (`du`) mode. Some instances include: +As you check `handler.js`, you might come across a few cases which checks for `loggedIn` or `PARAMS`. Generally, the templates which are supposed to be rendered by this cannot be accessed by this in `dev userless` or `dev mongoless` (`du` or `dm` respectively) mode. Some instances include: - Quiz templates (quiz list, quiz login, the actual quiz, quiz attempted, etc) - Live Quiz templates (participant's interface, quiz master's interface, results page) - User profile page @@ -18,4 +18,4 @@ _Alternatively, for some cases, if you go on a treasure hunt through the commits Hope this helps you out in contributing to the interface of the website. If you have any queries, as mentioned in [README](/README.md), feel free to pester the WebDev team. - \ No newline at end of file + diff --git a/docs/past_newsletters.md b/docs/past_newsletters.md new file mode 100644 index 00000000..8ec89a3a --- /dev/null +++ b/docs/past_newsletters.md @@ -0,0 +1,84 @@ +# Past Newsletter Archive (Akashic Records of Articles) + +## __**2023-05-1**__ +- Anime News Scan [Gargi Raj] +- Upcoming Action Anime Review [Mayank Rana] +- Anime Review: Demon Slayer [Nishkal Prakash] +- Anime Review: I'm Standing on a Million Lives [Aman Tater] +- Popular Meme Dialogues over the years: Action Anime [Vidunram A R] + +## __**2023-04-1**__ +- Anime Review: My Clueless First Friend [Nikhith Manoj] +- Anime Review: Daily Life of High School Boys [Nishkal Prakash] +- Anime Review: The Misfit of the Demon King Academy [Maitra Das] +- Anime Review: School Babysitters [Aman Tater] + +## __**2023-03-1**__ +- Anime Review: Cautious Hero [Nishkal Prakash] +- Manga Review: In Another World with my Smartphone [Nikhith Manoj] +- Anime Review: Eminence in Shadow [Abhibhu Prakash] +- Isekai Recommendations [Divyansh Tripathi] +- Isekai-Themed Crossword + +## __**2023-02-1**__ +- Manga Review: Otonari ni Ginga [Ayush Parmar] +- Webtoon Review: Yumi's Cells [Gargi Raj] +- Anime and Manga Review: Shigatsu wa Kimi no Uso [Dillip Dibyajyoti Dash] +- Mangaka Review: Naoko Takeuchi [Rashmi Patil] +- Top 10 Romance Anime [Abhibhu Prakash & Vidhu Vikas Singh] +- Romance-Themed Crossword + +## __**2022-12-1**__ +- Anime Review: AO ASHI [Nikhith Manoj] +- Manhwa Review: SECOND LIFE RANKER [Chiranjeet Mishra] +- Anime Review: HAJIME NO IPPO [Dillip Dibyajyoti Dash] +- Light Novel Review: MUSHOKU TENSEI [Nishkal Prakash] +- Top 10 Popular Action Manhwas [Vidunram A R] +- Partner-Themed Crossword + +## __**2021-10-2**__ +- Manga Review - UZUMAKI [Abhishek Kumar] +- Horror/Thriller Anime Reviews [Abhibhu Prakash] +- Review: Tokyo Ghoul [Ankit Chowdhury] +- Review: Boku Dake ga Inai Machi/Erased (Review) [Vidhu Vikas Singh] +- Ajin : Demi-human Wordsearch [Arjit Lohia] +- The Promised Neverland Crossword [Aditya Das] + +## __**2021-10-1**__ +- Monster Review [Anmol Kumar] +- Made in Abyss - Anime/Manga Review [Parth Mane] +- Parasyte: The Maxim - Review [Anshul Bankar] +- Psycho Pass - Review [Aditya Sarode] +- Darwin's Game - Review [Srijan Srivastava] +- Re:Zero Wordsearch [Sarthak Vijaywat] +- Death Note Crossword [Parth Mane] + +## __**2021-09-2**__ +- Review - Mairimashita! Iruma-Kun (Manga) [Abhishek Kumar] +- Seasonal Anime Review - Summer 2021 [Abhibhu Prakash] +- Review: Akagami no Shirayuki-hime [Ankit Chowdhury] +- Review: No Game No Life [Vidhu Vikas Singh] +- Recommendation/Review - Black Clover [Aditya Das] +- Isekai/Fantasy Wordsearch [Anshul Bankar] +- Shadows Quiz [Anshul Bankar] +- Isekai Quiz [Arjit Lohia] + +## __**2021-09-1**__ +- Review - The Saga of Tanya the Evil [Parth Mane] +- Review: That Time I Got Reincarnated as a Slime [Sarthak Vijaywat] +- Review / Recommendation: Kekkai Sensen Blood Blockade Battlefront [Aditya Sarode] +- Review: KonoSuba: God’s Blessing on This Wonderful World [Bishal Kumar Behera] +- Review - Kumo Desu Ga, Nani Ka? [Parth Mane] +- Serial Experiments Lain - An Overview [Anmol Kumar] +- Tensura Wordsearch [Sarthak Vijaywat] +- Overlord Crossword [Parth Mane] + +## __**2021-08-1**__ +- Review / Recommendation: Berserk (1997) [Ankit Chowdhury] +- Recommendation: Tower of God [Sarthak Vijaywat] +- Review: Demon Slayer [Abhishek Kumar] +- Review / Recommendation: Chivalry of a Failed Knight [Abhibhu Prakash] +- Review: Dororo [Vidhu Vikas Singh] +- The Philosophy of Attack on Titan [Anmol Kumar] +- BnHA Wordsearch [Aditya Das] +- KnY Crossword [Arjit Lohia] diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 10ee7963..470b70d3 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -9,19 +9,18 @@ "version": "3.2.8", "license": "MPL-2.0", "dependencies": { - "axios": "^0.21.1", - "connect-mongo": "^4.6.0", + "axios": "^1.4.0", + "connect-mongo": "^5.0.0", "cookie-parser": "^1.4.6", "csurf": "^1.11.0", "express": "^5.0.0-beta.1", - "express-session": "^1.17.2", - "mongodb": "^4.8.0", - "mongoose": "^6.2.4", - "nunjucks": "^3.2.3", + "express-session": "^1.17.3", + "mongodb": "^5.6.0", + "mongoose": "^7.3.1", + "nunjucks": "^3.2.4", "passport": "^0.6.0", "passport-google-oauth20": "^2.0.0", - "sass": "^1.38.1", - "socket.io": "^4.5.3" + "sass": "^1.63.6" }, "devDependencies": { "cross-env": "^7.0.3", @@ -36,6 +35,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", "optional": true, + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -44,13 +44,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/sha256-browser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/ie11-detection": "^2.0.0", "@aws-crypto/sha256-js": "^2.0.0", @@ -66,13 +68,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/sha256-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/util": "^2.0.0", "@aws-sdk/types": "^3.1.0", @@ -83,13 +87,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/supports-web-crypto": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^1.11.1" } @@ -98,13 +104,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-crypto/util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "^3.110.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -115,13 +123,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true }, "node_modules/@aws-sdk/abort-controller": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.201.0.tgz", "integrity": "sha512-xJ984k+CKlGjBmvNarzM8Y+b6X4L1Zt0TycQmVBJq7fAr/ju9l13pQIoXR5WlDIW1FkGeVczF5Nu6fN46SCORQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -135,6 +145,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.204.0.tgz", "integrity": "sha512-uftJkNKYcZ8bXVwcpOn5ZUjUX0IRto0ZrTO8DBdS9b7PJu2Y84eSy46LsAYuRDC0PZreQxy8nOH5HmI86/W8xQ==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -183,6 +194,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.204.0.tgz", "integrity": "sha512-AECcNrcAQxV/Jlu8ogshRaYwt2jayx0omQJs/SXj70mWxmbk4MQnb+DqJIpPpOKBHaza/xlC2TKS1RzkiuZxyw==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -228,6 +240,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.204.0.tgz", "integrity": "sha512-Tp6FqENRw31XK5r5hul1JXnQgHBhbbXhoMebyFih6/zjpATaqg0bnV6tpww4yPi3uc+yDGXKw2/tDroSsyTsRA==", "optional": true, + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -277,6 +290,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.201.0.tgz", "integrity": "sha512-6YLIel7OGMGi+r8XC1A54cQJRIpx/NJ4fBALy44zFpQ+fdJUEmw4daUf1LECmAQiPA2Pr/hD0nBtX+wiiTf5/g==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/signature-v4": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -293,6 +307,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.204.0.tgz", "integrity": "sha512-DmiGXe7pXWuJiAGphzY5cRaphRiU5DJ6Tcg/88Td3wnj22As5DCELetb7E2YC9DfwmKiWcGAKQaYQqWe5AzSqw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.204.0", "@aws-sdk/property-provider": "3.201.0", @@ -308,6 +323,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.201.0.tgz", "integrity": "sha512-g2MJsowzFhSsIOITUjYp7EzWFeHINjEP526Uf+5z2/p2kxQVwYYWZQK7j+tPE2Bk3MEjGOCmVHbbE7IFj0rNHw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -322,6 +338,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.201.0.tgz", "integrity": "sha512-i8U2k3/L3iUWJJ1GSlwVBMfLQ2OTUT97E8yJi/xz5GavYuPOsUQWQe4fp7WGQivxh+AqybXAGFUCYub6zfUqag==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/node-config-provider": "3.201.0", "@aws-sdk/property-provider": "3.201.0", @@ -338,6 +355,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.204.0.tgz", "integrity": "sha512-ddtaS0ya5lgZZwfuJ/FuniroreLJ6yDgPAasol/rla9U5EU0qUEK1+6PX463exghUGjYfTqxdrKXhGYZfuEoIw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -357,6 +375,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.204.0.tgz", "integrity": "sha512-kGbR5JE90zBGDS4cIz7tlUklMMeOm5oc5ES74YStLUacpQKwzVcHmDG8aT2DCONS/wEYysOIs5LygHurOJ/+Ww==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -378,6 +397,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.201.0.tgz", "integrity": "sha512-jTK3HSZgNj/hVrWb0wuF/cPUWSJYoRI/80fnN55o6QLS8WWIgOI8o2PNeVTAT5OrKioSoN4fgKTeUm3DZy3npQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/shared-ini-file-loader": "3.201.0", @@ -393,6 +413,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.204.0.tgz", "integrity": "sha512-iS884Gda99x4zmdCK3XxFcceve4wB+wudpeTUm2wwX9AGrSzoUnLWqNXv/R8UAMAsKANaWMBkqv/bsHpsEitZw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.204.0", "@aws-sdk/property-provider": "3.201.0", @@ -409,6 +430,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.201.0.tgz", "integrity": "sha512-U54bqhYaClPVZfswgknhlICp3BAtKXpOgHQCUF8cko5xUgbL4lVgd1rC3lWviGFMQAaTIF3QOXyEouemxr3VXw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -423,6 +445,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.204.0.tgz", "integrity": "sha512-XlVfSWoXAiuQb5Q053McnmqSvllojKAc8ecQiLgLXstXXcHrI36E4XH7VkMaNV8JPPdLQhmLxrj01vzUyoT47Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/client-cognito-identity": "3.204.0", "@aws-sdk/client-sso": "3.204.0", @@ -449,6 +472,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.204.0.tgz", "integrity": "sha512-TfIhWYQ4CTjrD+FSuBcKMSVrqq8GCwqCfUyalWmSKo4JIFhN5OxUnOFb1/ecE/TJX+YgZ65w4qhVJVHHmh229Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/querystring-builder": "3.201.0", @@ -462,6 +486,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.201.0.tgz", "integrity": "sha512-WJsMZg5/TMoWnLM+0NuwLwFzHsi89Bi9J1Dt7JdJHXFLoEZV54FEz1PK/Sq5NOldhVljpXQwWOB2dHA2wxFztg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "@aws-sdk/util-buffer-from": "3.201.0", @@ -476,6 +501,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.201.0.tgz", "integrity": "sha512-f/zgntOfIozNyKSaG9dvHjjBaR3y20kYNswMYkSuCM2NIT5LpyHiiq5I11TwaocatUFcDztWpcsv7vHpIgI5Ig==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -486,6 +512,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -498,6 +525,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.201.0.tgz", "integrity": "sha512-p4G9AtdrKO8A3Z4RyZiy0isEYwuge7bQRBS7UzcGkcIOhJONq2pcM+gRZYz+NWvfYYNWUg5uODsFQfU8342yKg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -512,6 +540,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.201.0.tgz", "integrity": "sha512-F3JlXo5GusbeZR956hA9VxmDxUeg77Xh6o8fveAE2+G4Bjcb1iq9jPNlw6A14vDj3oTKenv2LLnjL2OIfl6hRA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-serde": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -531,6 +560,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.201.0.tgz", "integrity": "sha512-7KNzdV7nFcKAoahvgGAlzsOq9FFDsU5h3w2iPtVdJhz6ZRDH/2v6WFeUCji+UNZip36gFfMPivoO8Y5smb5r/A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -545,6 +575,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.201.0.tgz", "integrity": "sha512-kYLsa9x3oUJxYU7V5KOO50Kl7b0kk+I4ltkrdarLvvXcVI7ZXmWHzHLT2dkUhj8S0ceVdi0FYHVPJ3GoE8re4A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -558,6 +589,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.201.0.tgz", "integrity": "sha512-NGOr+n559ZcJLdFoJR8LNGdrOJFIp2BTuWEDYeicNdNb0bETTXrkzcfT1BRhV9CWqCDmjFvjdrzbhS0cw/UUGA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -572,6 +604,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.201.0.tgz", "integrity": "sha512-4jQjSKCpSc4oB1X9nNq4FbIAwQrr+mvmUSmg/oe2Llf42Ak1G9gg3rNTtQdfzA/wNMlL4ZFfF5Br+uz06e1hnQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/service-error-classification": "3.201.0", @@ -589,6 +622,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.201.0.tgz", "integrity": "sha512-clZuXcoN0mAP4JH5C6pW5+0tdF25+fpFJqE7GNRjjH/NYNk6ImVI0Kq2espEWwVBuaS0/chTDK3b+pK8YOWdhw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-signing": "3.201.0", "@aws-sdk/property-provider": "3.201.0", @@ -606,6 +640,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.201.0.tgz", "integrity": "sha512-Z7AzIuqEDvsZmp80zeT1oYxsoB8uQZby20Z8kF6/vNoq3sIzaGf/wHeNn0p+Vgo2auGSbZcVUZKoDptQLSLwIQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -619,6 +654,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.201.0.tgz", "integrity": "sha512-08ri5+mB28tva9RjVIXFcUP5lRTx+Pj8C2HYqF2GL5H3uAo+h3RQ++fEG1uwUMLf7tCEFivcw6SHA1KmCnB7+w==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -636,6 +672,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.201.0.tgz", "integrity": "sha512-lqHYSBP5FBxzA5w5XiYYYpfXabFzleXonqRkqZts1tapNJ4sOd+itiKG8JoNP7LDOwJ8qxNW/a33/gQeh3wkwQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -648,6 +685,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.201.0.tgz", "integrity": "sha512-/rYZ93WN1gDJudXis/0382CEoTqRa4qZJA608u2EPWs5aiMocUrm7pjH5XvKm2OYX8K/lyaMSBvL2OTIMzXGaQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -662,6 +700,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.201.0.tgz", "integrity": "sha512-JO0K2qPTYn+pPC7g8rWr1oueg9CqGCkYbINuAuz79vjToOLUQnZT9GiFm7QADe6J6RT1oGEKRQabNaJnp8cFpQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/shared-ini-file-loader": "3.201.0", @@ -677,6 +716,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.201.0.tgz", "integrity": "sha512-bWjXBd4WCiQcV4PwY+eFnlz9tZ4UiqfiJteav4MDt8YWkVlsVnR8RutmVSm3KZZjO2tJNSrla0ZWBebkNnI/Xg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/abort-controller": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -693,6 +733,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.201.0.tgz", "integrity": "sha512-lVMP75VsYHIW04uYbkjA0I8Bb7b+aEj6PBBLdFoA22S0uCeJOD42OSr2Gtg2fToDGO7LQJw/K2D+LMCYKfZ3vQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -706,6 +747,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.201.0.tgz", "integrity": "sha512-RdOc1elWFpj8MogxG87nkhtylw0a+OD7W8WFM+Gw4yJMkl7cwW42VIBFfb0+KCGZfIQltIeSLRvfe3WvVPyo7Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -719,6 +761,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.201.0.tgz", "integrity": "sha512-FgQnVHpYR19w/HmHEgWpykCn9tdogW0n45Ins6LBCo2aImDf9kBATD4xgN/F2rtogGuLGgu5LIIMHIOj1Tzs/w==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "@aws-sdk/util-uri-escape": "3.201.0", @@ -733,6 +776,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.201.0.tgz", "integrity": "sha512-vS9Ljbqrwi0sIKYxgyZYJUN1AcE291hvuqwty9etgD2w/26SbWiMhjIW/fXJUOZjUvGKkYCpbivJYSzAGAuWfQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -746,6 +790,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.201.0.tgz", "integrity": "sha512-Pfcfmurgq8UpM0rXco6FVblcruqN4Mo3TW8/yaXrbctWpmdNT/8v19fffQIIgk94TU8Vf/nPJ7E5DXL7MZr4Fw==", "optional": true, + "peer": true, "engines": { "node": ">=14.0.0" } @@ -755,6 +800,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.201.0.tgz", "integrity": "sha512-Pbxk0TXep0yI8MnK7Prly6JuBm5Me9AITav8/zPEgTZ3fMhXhQhhiuQcuTCI9GeosSzoiu8VvK53oPtBZZFnXQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -768,6 +814,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.201.0.tgz", "integrity": "sha512-zEHoG1/hzJq169slggkPy1SN9YPWI78Bbe/MvHGYmCmQDspblu60JSBIbAatNqAxAmcWKc2HqpyGKjCkMG94ZA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -785,6 +832,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.201.0.tgz", "integrity": "sha512-cL87Jgxczee8YFkWGWKQ2Ze0vjn4+eCa1kDvEYMCOQvNujTuFgatXLgije5a7nVkSnL9WLoIP7Y7fsBGrKfMnQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/middleware-stack": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -799,6 +847,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.201.0.tgz", "integrity": "sha512-RCQj2pQyHD330Jd4c5CHJ87k2ZqC3Mmtl6nhwH1dy3vbnGUpc3q+3yinOKoTAY934kIa7ia32Y/2EjuyHxaj1A==", "optional": true, + "peer": true, "engines": { "node": ">=14.0.0" } @@ -808,6 +857,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.201.0.tgz", "integrity": "sha512-V15aqj0tj4Y79VpuIdHUvX4Nvn4hYPB0RAn/qg5CCComIl0doLOirAQtW1MOBOyctdRlD9Uv7d1QdPLzJZMHjQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/querystring-parser": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -819,6 +869,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.202.0.tgz", "integrity": "sha512-0QlvxCSU2CITeR/x87zls9ma+CkN3EXRGM3M5XnHWaneDI9K+O2uPpAbDfLh0SBJyO0AfIMn7Vh/BvnNNPEDpg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -832,6 +883,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" } @@ -841,6 +893,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.201.0.tgz", "integrity": "sha512-ydZqNpB3l5kiicInpPDExPb5xHI7uyVIa1vMupnuIrJ412iNb0F2+K8LlFynzw6fSJShVKnqFcWOYRA96z1iIw==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -854,6 +907,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" } @@ -863,6 +917,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.201.0.tgz", "integrity": "sha512-q+gwQoLn/DOwirb2hgZJeEwo1D3vLhoD6FfSV42Ecfvtb4jHnWReWMHguujfCubuDgZCrMEvYQzuocS75HHsbA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -875,6 +930,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.201.0.tgz", "integrity": "sha512-s6Wjltd9vU+vR3n0pqSPmNDcrrkrVTdV4t7x2zz3nDsFKTI77iVNafDmuaUlOA/bIlpjCJqaWecoVrZmEKeR7A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/is-array-buffer": "3.201.0", "tslib": "^2.3.1" @@ -888,6 +944,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.201.0.tgz", "integrity": "sha512-cCRJlnRRP8vrLJomzJRBIyiyohsjJKmnIaQ9t0tAhGCywZbyjx6TlpYRZYfVWo+MwdF1Pi8ZScTrFPW0JuBOIQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -900,6 +957,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.201.0.tgz", "integrity": "sha512-skRMAM+xrV/sDvvtHC81ExEKQEiZFaRrRdUT39fBX1SpGnFTo2wpv7XK+rAW2XopGgnLPytXLQD97Kub79o4zA==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -915,6 +973,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.201.0.tgz", "integrity": "sha512-9N5LXRhxigbkbEcjQ4nNXHuQxp0VFlbc2/5wbcuPjIKX/OROiQI4mYQ6nuSKk7eku5sNFb9FtEHeD/RZo8od6Q==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/config-resolver": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -932,6 +991,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.202.0.tgz", "integrity": "sha512-sNees5uDp7nfEbvzaA1DAHqoEvEb9ZOkdNH5gcj/FMBETbr00YtsuXsTZogTHQsX/otRTiudZBE3iH7R4SLSAQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -945,6 +1005,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -957,6 +1018,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.201.0.tgz", "integrity": "sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -969,6 +1031,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.201.0.tgz", "integrity": "sha512-iAitcEZo17IyKn4ku1IBgtomr25esu5OuSRjw5Or4bNOeqXB0w50cItf/9qft8LIhbvBEAUtNAYXvqNzvhTZdQ==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -981,6 +1044,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" }, @@ -993,6 +1057,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.201.0.tgz", "integrity": "sha512-iL2gyz7GuUVtZcMZpqvfxdFrl9hc28qpagymmJ/w2yhN86YNPHdK8Sx1Yo6VxNGVDCCWGb7tHXf7VP+U4Yv/Lg==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/types": "3.201.0", "bowser": "^2.11.0", @@ -1004,6 +1069,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.201.0.tgz", "integrity": "sha512-6lhhvwB3AZSISnYQpDGdlyTrzfYK2P9QYjy7vZEBRd9TSOaggiFICXe03ZvZfVOSeg0EInlMKn1fIHzPUHRuHQ==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/node-config-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -1026,6 +1092,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.3.1" } @@ -1035,6 +1102,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.201.0.tgz", "integrity": "sha512-A+bJFR/1rHYOJg137E69L1sX0I+LH+xf9ZjMXG9BVO0hSo7yDPoJVpHrzTJyOc3tuRITjIGBv9Qi4TKcoOSi1A==", "optional": true, + "peer": true, "dependencies": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -1134,24 +1202,6 @@ "node": ">= 8" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "17.0.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", @@ -1288,12 +1338,19 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/balanced-match": { @@ -1302,33 +1359,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -1387,7 +1417,8 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true + "optional": true, + "peer": true }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -1417,37 +1448,11 @@ "dev": true }, "node_modules/bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "dependencies": { - "buffer": "^5.6.0" - }, + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.3.0.tgz", + "integrity": "sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag==", "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "node": ">=14.20.1" } }, "node_modules/bytes": { @@ -1586,6 +1591,17 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -1601,18 +1617,19 @@ "dev": true }, "node_modules/connect-mongo": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-4.6.0.tgz", - "integrity": "sha512-8new4Z7NLP3CGP65Aw6ls3xDBeKVvHRSh39CXuDZTQsvpeeU9oNMzfFgvqmHqZ6gWpxIl663RyoVEmCAGf1yOg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-5.0.0.tgz", + "integrity": "sha512-s93jiP6GkRApn5duComx6RLwtP23YrulPxShz+8peX7svd6Q+MS8nKLhKCCazbP92C13eTVaIOxgeLt0ezIiCg==", "dependencies": { "debug": "^4.3.1", "kruptein": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=12.9.0" }, "peerDependencies": { - "mongodb": "^4.1.0" + "express-session": "^1.17.1", + "mongodb": "^5.1.0" } }, "node_modules/content-disposition": { @@ -1667,18 +1684,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -1788,6 +1793,14 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1841,42 +1854,6 @@ "node": ">= 0.8" } }, - "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2130,11 +2107,11 @@ } }, "node_modules/express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", "dependencies": { - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~2.0.0", @@ -2148,9 +2125,9 @@ } }, "node_modules/express-session/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } @@ -2225,6 +2202,7 @@ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", "optional": true, + "peer": true, "dependencies": { "strnum": "^1.0.5" }, @@ -2361,6 +2339,19 @@ } } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2516,25 +2507,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -2550,6 +2522,11 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2944,20 +2921,35 @@ } }, "node_modules/mongodb": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", - "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.6.0.tgz", + "integrity": "sha512-z8qVs9NfobHJm6uzK56XBZF8XwM9H294iRnB7wNjF0SnY93si5HPziIJn+qqvUR5QOff/4L0gCD6SShdR/GtVQ==", "dependencies": { - "bson": "^4.7.2", - "mongodb-connection-string-url": "^2.5.4", + "bson": "^5.3.0", + "mongodb-connection-string-url": "^2.6.0", "socks": "^2.7.1" }, "engines": { - "node": ">=12.9.0" + "node": ">=14.20.1" }, "optionalDependencies": { - "@aws-sdk/credential-providers": "^3.186.0", "saslprep": "^1.0.3" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.201.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + } } }, "node_modules/mongodb-connection-string-url": { @@ -2970,20 +2962,20 @@ } }, "node_modules/mongoose": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.11.2.tgz", - "integrity": "sha512-BJHQerozE+qIVdH8Hn9niMVMUzRNcjmwU7hFEzER1+aYtGmVJgGsXBd9wJ9GnrHrbCsYmKlRy8aTuxEdlEtfow==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.3.1.tgz", + "integrity": "sha512-6289bmSIhvR8xMHsYe2/CuzN7wHK+2RHcK7idDdzniCPC5zix5JH0Hc4k3CmXlr/9zQ2250gUQiUWtvDB0vF1Q==", "dependencies": { - "bson": "^4.7.2", + "bson": "^5.3.0", "kareem": "2.5.1", - "mongodb": "4.16.0", + "mongodb": "5.6.0", "mpath": "0.9.0", - "mquery": "4.0.3", + "mquery": "5.0.0", "ms": "2.1.3", "sift": "16.0.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.20.1" }, "funding": { "type": "opencollective", @@ -3004,14 +2996,14 @@ } }, "node_modules/mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", "dependencies": { "debug": "4.x" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/ms": { @@ -3144,14 +3136,6 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3370,6 +3354,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -3606,17 +3595,19 @@ } }, "node_modules/sass": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", - "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=14.0.0" } }, "node_modules/send": { @@ -3743,42 +3734,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -3792,6 +3747,14 @@ "npm": ">= 3.0.0" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -3851,7 +3814,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true + "optional": true, + "peer": true }, "node_modules/supports-color": { "version": "5.5.0", @@ -3917,7 +3881,8 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "optional": true + "optional": true, + "peer": true }, "node_modules/tsscmp": { "version": "1.0.6", @@ -4015,6 +3980,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -4133,26 +4099,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4223,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", "optional": true, + "peer": true, "requires": { "tslib": "^1.11.1" }, @@ -4231,7 +4178,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true } } }, @@ -4240,6 +4188,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", "optional": true, + "peer": true, "requires": { "@aws-crypto/ie11-detection": "^2.0.0", "@aws-crypto/sha256-js": "^2.0.0", @@ -4255,7 +4204,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true } } }, @@ -4264,6 +4214,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", "optional": true, + "peer": true, "requires": { "@aws-crypto/util": "^2.0.0", "@aws-sdk/types": "^3.1.0", @@ -4274,7 +4225,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true } } }, @@ -4283,6 +4235,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", "optional": true, + "peer": true, "requires": { "tslib": "^1.11.1" }, @@ -4291,7 +4244,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true } } }, @@ -4300,6 +4254,7 @@ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "^3.110.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -4310,7 +4265,8 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true + "optional": true, + "peer": true } } }, @@ -4319,6 +4275,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.201.0.tgz", "integrity": "sha512-xJ984k+CKlGjBmvNarzM8Y+b6X4L1Zt0TycQmVBJq7fAr/ju9l13pQIoXR5WlDIW1FkGeVczF5Nu6fN46SCORQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4329,6 +4286,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.204.0.tgz", "integrity": "sha512-uftJkNKYcZ8bXVwcpOn5ZUjUX0IRto0ZrTO8DBdS9b7PJu2Y84eSy46LsAYuRDC0PZreQxy8nOH5HmI86/W8xQ==", "optional": true, + "peer": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -4374,6 +4332,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.204.0.tgz", "integrity": "sha512-AECcNrcAQxV/Jlu8ogshRaYwt2jayx0omQJs/SXj70mWxmbk4MQnb+DqJIpPpOKBHaza/xlC2TKS1RzkiuZxyw==", "optional": true, + "peer": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -4416,6 +4375,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.204.0.tgz", "integrity": "sha512-Tp6FqENRw31XK5r5hul1JXnQgHBhbbXhoMebyFih6/zjpATaqg0bnV6tpww4yPi3uc+yDGXKw2/tDroSsyTsRA==", "optional": true, + "peer": true, "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", @@ -4462,6 +4422,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.201.0.tgz", "integrity": "sha512-6YLIel7OGMGi+r8XC1A54cQJRIpx/NJ4fBALy44zFpQ+fdJUEmw4daUf1LECmAQiPA2Pr/hD0nBtX+wiiTf5/g==", "optional": true, + "peer": true, "requires": { "@aws-sdk/signature-v4": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4475,6 +4436,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.204.0.tgz", "integrity": "sha512-DmiGXe7pXWuJiAGphzY5cRaphRiU5DJ6Tcg/88Td3wnj22As5DCELetb7E2YC9DfwmKiWcGAKQaYQqWe5AzSqw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/client-cognito-identity": "3.204.0", "@aws-sdk/property-provider": "3.201.0", @@ -4487,6 +4449,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.201.0.tgz", "integrity": "sha512-g2MJsowzFhSsIOITUjYp7EzWFeHINjEP526Uf+5z2/p2kxQVwYYWZQK7j+tPE2Bk3MEjGOCmVHbbE7IFj0rNHw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4498,6 +4461,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.201.0.tgz", "integrity": "sha512-i8U2k3/L3iUWJJ1GSlwVBMfLQ2OTUT97E8yJi/xz5GavYuPOsUQWQe4fp7WGQivxh+AqybXAGFUCYub6zfUqag==", "optional": true, + "peer": true, "requires": { "@aws-sdk/node-config-provider": "3.201.0", "@aws-sdk/property-provider": "3.201.0", @@ -4511,6 +4475,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.204.0.tgz", "integrity": "sha512-ddtaS0ya5lgZZwfuJ/FuniroreLJ6yDgPAasol/rla9U5EU0qUEK1+6PX463exghUGjYfTqxdrKXhGYZfuEoIw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/credential-provider-env": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -4527,6 +4492,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.204.0.tgz", "integrity": "sha512-kGbR5JE90zBGDS4cIz7tlUklMMeOm5oc5ES74YStLUacpQKwzVcHmDG8aT2DCONS/wEYysOIs5LygHurOJ/+Ww==", "optional": true, + "peer": true, "requires": { "@aws-sdk/credential-provider-env": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -4545,6 +4511,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.201.0.tgz", "integrity": "sha512-jTK3HSZgNj/hVrWb0wuF/cPUWSJYoRI/80fnN55o6QLS8WWIgOI8o2PNeVTAT5OrKioSoN4fgKTeUm3DZy3npQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/shared-ini-file-loader": "3.201.0", @@ -4557,6 +4524,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.204.0.tgz", "integrity": "sha512-iS884Gda99x4zmdCK3XxFcceve4wB+wudpeTUm2wwX9AGrSzoUnLWqNXv/R8UAMAsKANaWMBkqv/bsHpsEitZw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/client-sso": "3.204.0", "@aws-sdk/property-provider": "3.201.0", @@ -4570,6 +4538,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.201.0.tgz", "integrity": "sha512-U54bqhYaClPVZfswgknhlICp3BAtKXpOgHQCUF8cko5xUgbL4lVgd1rC3lWviGFMQAaTIF3QOXyEouemxr3VXw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4581,6 +4550,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.204.0.tgz", "integrity": "sha512-XlVfSWoXAiuQb5Q053McnmqSvllojKAc8ecQiLgLXstXXcHrI36E4XH7VkMaNV8JPPdLQhmLxrj01vzUyoT47Q==", "optional": true, + "peer": true, "requires": { "@aws-sdk/client-cognito-identity": "3.204.0", "@aws-sdk/client-sso": "3.204.0", @@ -4604,6 +4574,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.204.0.tgz", "integrity": "sha512-TfIhWYQ4CTjrD+FSuBcKMSVrqq8GCwqCfUyalWmSKo4JIFhN5OxUnOFb1/ecE/TJX+YgZ65w4qhVJVHHmh229Q==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/querystring-builder": "3.201.0", @@ -4617,6 +4588,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.201.0.tgz", "integrity": "sha512-WJsMZg5/TMoWnLM+0NuwLwFzHsi89Bi9J1Dt7JdJHXFLoEZV54FEz1PK/Sq5NOldhVljpXQwWOB2dHA2wxFztg==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "@aws-sdk/util-buffer-from": "3.201.0", @@ -4628,6 +4600,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.201.0.tgz", "integrity": "sha512-f/zgntOfIozNyKSaG9dvHjjBaR3y20kYNswMYkSuCM2NIT5LpyHiiq5I11TwaocatUFcDztWpcsv7vHpIgI5Ig==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4638,6 +4611,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4647,6 +4621,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.201.0.tgz", "integrity": "sha512-p4G9AtdrKO8A3Z4RyZiy0isEYwuge7bQRBS7UzcGkcIOhJONq2pcM+gRZYz+NWvfYYNWUg5uODsFQfU8342yKg==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4658,6 +4633,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.201.0.tgz", "integrity": "sha512-F3JlXo5GusbeZR956hA9VxmDxUeg77Xh6o8fveAE2+G4Bjcb1iq9jPNlw6A14vDj3oTKenv2LLnjL2OIfl6hRA==", "optional": true, + "peer": true, "requires": { "@aws-sdk/middleware-serde": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -4674,6 +4650,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.201.0.tgz", "integrity": "sha512-7KNzdV7nFcKAoahvgGAlzsOq9FFDsU5h3w2iPtVdJhz6ZRDH/2v6WFeUCji+UNZip36gFfMPivoO8Y5smb5r/A==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4685,6 +4662,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.201.0.tgz", "integrity": "sha512-kYLsa9x3oUJxYU7V5KOO50Kl7b0kk+I4ltkrdarLvvXcVI7ZXmWHzHLT2dkUhj8S0ceVdi0FYHVPJ3GoE8re4A==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4695,6 +4673,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.201.0.tgz", "integrity": "sha512-NGOr+n559ZcJLdFoJR8LNGdrOJFIp2BTuWEDYeicNdNb0bETTXrkzcfT1BRhV9CWqCDmjFvjdrzbhS0cw/UUGA==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4706,6 +4685,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.201.0.tgz", "integrity": "sha512-4jQjSKCpSc4oB1X9nNq4FbIAwQrr+mvmUSmg/oe2Llf42Ak1G9gg3rNTtQdfzA/wNMlL4ZFfF5Br+uz06e1hnQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/service-error-classification": "3.201.0", @@ -4720,6 +4700,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.201.0.tgz", "integrity": "sha512-clZuXcoN0mAP4JH5C6pW5+0tdF25+fpFJqE7GNRjjH/NYNk6ImVI0Kq2espEWwVBuaS0/chTDK3b+pK8YOWdhw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/middleware-signing": "3.201.0", "@aws-sdk/property-provider": "3.201.0", @@ -4734,6 +4715,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.201.0.tgz", "integrity": "sha512-Z7AzIuqEDvsZmp80zeT1oYxsoB8uQZby20Z8kF6/vNoq3sIzaGf/wHeNn0p+Vgo2auGSbZcVUZKoDptQLSLwIQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4744,6 +4726,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.201.0.tgz", "integrity": "sha512-08ri5+mB28tva9RjVIXFcUP5lRTx+Pj8C2HYqF2GL5H3uAo+h3RQ++fEG1uwUMLf7tCEFivcw6SHA1KmCnB7+w==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -4758,6 +4741,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.201.0.tgz", "integrity": "sha512-lqHYSBP5FBxzA5w5XiYYYpfXabFzleXonqRkqZts1tapNJ4sOd+itiKG8JoNP7LDOwJ8qxNW/a33/gQeh3wkwQ==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4767,6 +4751,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.201.0.tgz", "integrity": "sha512-/rYZ93WN1gDJudXis/0382CEoTqRa4qZJA608u2EPWs5aiMocUrm7pjH5XvKm2OYX8K/lyaMSBvL2OTIMzXGaQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/protocol-http": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4778,6 +4763,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.201.0.tgz", "integrity": "sha512-JO0K2qPTYn+pPC7g8rWr1oueg9CqGCkYbINuAuz79vjToOLUQnZT9GiFm7QADe6J6RT1oGEKRQabNaJnp8cFpQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/shared-ini-file-loader": "3.201.0", @@ -4790,6 +4776,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.201.0.tgz", "integrity": "sha512-bWjXBd4WCiQcV4PwY+eFnlz9tZ4UiqfiJteav4MDt8YWkVlsVnR8RutmVSm3KZZjO2tJNSrla0ZWBebkNnI/Xg==", "optional": true, + "peer": true, "requires": { "@aws-sdk/abort-controller": "3.201.0", "@aws-sdk/protocol-http": "3.201.0", @@ -4803,6 +4790,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.201.0.tgz", "integrity": "sha512-lVMP75VsYHIW04uYbkjA0I8Bb7b+aEj6PBBLdFoA22S0uCeJOD42OSr2Gtg2fToDGO7LQJw/K2D+LMCYKfZ3vQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4813,6 +4801,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.201.0.tgz", "integrity": "sha512-RdOc1elWFpj8MogxG87nkhtylw0a+OD7W8WFM+Gw4yJMkl7cwW42VIBFfb0+KCGZfIQltIeSLRvfe3WvVPyo7Q==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4823,6 +4812,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.201.0.tgz", "integrity": "sha512-FgQnVHpYR19w/HmHEgWpykCn9tdogW0n45Ins6LBCo2aImDf9kBATD4xgN/F2rtogGuLGgu5LIIMHIOj1Tzs/w==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "@aws-sdk/util-uri-escape": "3.201.0", @@ -4834,6 +4824,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.201.0.tgz", "integrity": "sha512-vS9Ljbqrwi0sIKYxgyZYJUN1AcE291hvuqwty9etgD2w/26SbWiMhjIW/fXJUOZjUvGKkYCpbivJYSzAGAuWfQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4843,13 +4834,15 @@ "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.201.0.tgz", "integrity": "sha512-Pfcfmurgq8UpM0rXco6FVblcruqN4Mo3TW8/yaXrbctWpmdNT/8v19fffQIIgk94TU8Vf/nPJ7E5DXL7MZr4Fw==", - "optional": true + "optional": true, + "peer": true }, "@aws-sdk/shared-ini-file-loader": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.201.0.tgz", "integrity": "sha512-Pbxk0TXep0yI8MnK7Prly6JuBm5Me9AITav8/zPEgTZ3fMhXhQhhiuQcuTCI9GeosSzoiu8VvK53oPtBZZFnXQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -4860,6 +4853,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.201.0.tgz", "integrity": "sha512-zEHoG1/hzJq169slggkPy1SN9YPWI78Bbe/MvHGYmCmQDspblu60JSBIbAatNqAxAmcWKc2HqpyGKjCkMG94ZA==", "optional": true, + "peer": true, "requires": { "@aws-sdk/is-array-buffer": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4874,6 +4868,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.201.0.tgz", "integrity": "sha512-cL87Jgxczee8YFkWGWKQ2Ze0vjn4+eCa1kDvEYMCOQvNujTuFgatXLgije5a7nVkSnL9WLoIP7Y7fsBGrKfMnQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/middleware-stack": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4884,13 +4879,15 @@ "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.201.0.tgz", "integrity": "sha512-RCQj2pQyHD330Jd4c5CHJ87k2ZqC3Mmtl6nhwH1dy3vbnGUpc3q+3yinOKoTAY934kIa7ia32Y/2EjuyHxaj1A==", - "optional": true + "optional": true, + "peer": true }, "@aws-sdk/url-parser": { "version": "3.201.0", "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.201.0.tgz", "integrity": "sha512-V15aqj0tj4Y79VpuIdHUvX4Nvn4hYPB0RAn/qg5CCComIl0doLOirAQtW1MOBOyctdRlD9Uv7d1QdPLzJZMHjQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/querystring-parser": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4902,6 +4899,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.202.0.tgz", "integrity": "sha512-0QlvxCSU2CITeR/x87zls9ma+CkN3EXRGM3M5XnHWaneDI9K+O2uPpAbDfLh0SBJyO0AfIMn7Vh/BvnNNPEDpg==", "optional": true, + "peer": true, "requires": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -4912,6 +4910,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.188.0.tgz", "integrity": "sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4921,6 +4920,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.201.0.tgz", "integrity": "sha512-ydZqNpB3l5kiicInpPDExPb5xHI7uyVIa1vMupnuIrJ412iNb0F2+K8LlFynzw6fSJShVKnqFcWOYRA96z1iIw==", "optional": true, + "peer": true, "requires": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -4931,6 +4931,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4940,6 +4941,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.201.0.tgz", "integrity": "sha512-q+gwQoLn/DOwirb2hgZJeEwo1D3vLhoD6FfSV42Ecfvtb4jHnWReWMHguujfCubuDgZCrMEvYQzuocS75HHsbA==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4949,6 +4951,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.201.0.tgz", "integrity": "sha512-s6Wjltd9vU+vR3n0pqSPmNDcrrkrVTdV4t7x2zz3nDsFKTI77iVNafDmuaUlOA/bIlpjCJqaWecoVrZmEKeR7A==", "optional": true, + "peer": true, "requires": { "@aws-sdk/is-array-buffer": "3.201.0", "tslib": "^2.3.1" @@ -4959,6 +4962,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.201.0.tgz", "integrity": "sha512-cCRJlnRRP8vrLJomzJRBIyiyohsjJKmnIaQ9t0tAhGCywZbyjx6TlpYRZYfVWo+MwdF1Pi8ZScTrFPW0JuBOIQ==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -4968,6 +4972,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.201.0.tgz", "integrity": "sha512-skRMAM+xrV/sDvvtHC81ExEKQEiZFaRrRdUT39fBX1SpGnFTo2wpv7XK+rAW2XopGgnLPytXLQD97Kub79o4zA==", "optional": true, + "peer": true, "requires": { "@aws-sdk/property-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -4980,6 +4985,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.201.0.tgz", "integrity": "sha512-9N5LXRhxigbkbEcjQ4nNXHuQxp0VFlbc2/5wbcuPjIKX/OROiQI4mYQ6nuSKk7eku5sNFb9FtEHeD/RZo8od6Q==", "optional": true, + "peer": true, "requires": { "@aws-sdk/config-resolver": "3.201.0", "@aws-sdk/credential-provider-imds": "3.201.0", @@ -4994,6 +5000,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.202.0.tgz", "integrity": "sha512-sNees5uDp7nfEbvzaA1DAHqoEvEb9ZOkdNH5gcj/FMBETbr00YtsuXsTZogTHQsX/otRTiudZBE3iH7R4SLSAQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "tslib": "^2.3.1" @@ -5004,6 +5011,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -5013,6 +5021,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.201.0.tgz", "integrity": "sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -5022,6 +5031,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.201.0.tgz", "integrity": "sha512-iAitcEZo17IyKn4ku1IBgtomr25esu5OuSRjw5Or4bNOeqXB0w50cItf/9qft8LIhbvBEAUtNAYXvqNzvhTZdQ==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -5031,6 +5041,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -5040,6 +5051,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.201.0.tgz", "integrity": "sha512-iL2gyz7GuUVtZcMZpqvfxdFrl9hc28qpagymmJ/w2yhN86YNPHdK8Sx1Yo6VxNGVDCCWGb7tHXf7VP+U4Yv/Lg==", "optional": true, + "peer": true, "requires": { "@aws-sdk/types": "3.201.0", "bowser": "^2.11.0", @@ -5051,6 +5063,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.201.0.tgz", "integrity": "sha512-6lhhvwB3AZSISnYQpDGdlyTrzfYK2P9QYjy7vZEBRd9TSOaggiFICXe03ZvZfVOSeg0EInlMKn1fIHzPUHRuHQ==", "optional": true, + "peer": true, "requires": { "@aws-sdk/node-config-provider": "3.201.0", "@aws-sdk/types": "3.201.0", @@ -5062,6 +5075,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", "optional": true, + "peer": true, "requires": { "tslib": "^2.3.1" } @@ -5071,6 +5085,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.201.0.tgz", "integrity": "sha512-A+bJFR/1rHYOJg137E69L1sX0I+LH+xf9ZjMXG9BVO0hSo7yDPoJVpHrzTJyOc3tuRITjIGBv9Qi4TKcoOSi1A==", "optional": true, + "peer": true, "requires": { "@aws-sdk/util-buffer-from": "3.201.0", "tslib": "^2.3.1" @@ -5142,24 +5157,6 @@ "fastq": "^1.6.0" } }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "requires": { - "@types/node": "*" - } - }, "@types/node": { "version": "17.0.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", @@ -5272,12 +5269,19 @@ "safer-buffer": "^2.1.0" } }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "balanced-match": { @@ -5286,16 +5290,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, "base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -5347,7 +5341,8 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true + "optional": true, + "peer": true }, "brace-expansion": { "version": "1.1.11", @@ -5374,21 +5369,9 @@ "dev": true }, "bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.3.0.tgz", + "integrity": "sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag==" }, "bytes": { "version": "3.1.1", @@ -5484,6 +5467,14 @@ "wrap-ansi": "^7.0.0" } }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -5496,9 +5487,9 @@ "dev": true }, "connect-mongo": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-4.6.0.tgz", - "integrity": "sha512-8new4Z7NLP3CGP65Aw6ls3xDBeKVvHRSh39CXuDZTQsvpeeU9oNMzfFgvqmHqZ6gWpxIl663RyoVEmCAGf1yOg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-5.0.0.tgz", + "integrity": "sha512-s93jiP6GkRApn5duComx6RLwtP23YrulPxShz+8peX7svd6Q+MS8nKLhKCCazbP92C13eTVaIOxgeLt0ezIiCg==", "requires": { "debug": "^4.3.1", "kruptein": "^3.0.0" @@ -5543,15 +5534,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, "cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -5627,6 +5609,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -5668,35 +5655,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, - "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" - }, - "dependencies": { - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - } - } - }, - "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5916,11 +5874,11 @@ } }, "express-session": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.2.tgz", - "integrity": "sha512-mPcYcLA0lvh7D4Oqr5aNJFMtBMKPLl++OKKxkHzZ0U0oDq1rpKBnkR5f5vCHR26VeArlTOEF9td4x5IjICksRQ==", + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", "requires": { - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~2.0.0", @@ -5931,9 +5889,9 @@ }, "dependencies": { "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "debug": { "version": "2.6.9", @@ -5978,6 +5936,7 @@ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", "optional": true, + "peer": true, "requires": { "strnum": "^1.0.5" } @@ -6074,6 +6033,16 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6183,11 +6152,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -6200,6 +6164,11 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6491,13 +6460,12 @@ } }, "mongodb": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.16.0.tgz", - "integrity": "sha512-0EB113Fsucaq1wsY0dOhi1fmZOwFtLOtteQkiqOXGklvWMnSH3g2QS53f0KTP+/6qOkuoXE2JksubSZNmxeI+g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.6.0.tgz", + "integrity": "sha512-z8qVs9NfobHJm6uzK56XBZF8XwM9H294iRnB7wNjF0SnY93si5HPziIJn+qqvUR5QOff/4L0gCD6SShdR/GtVQ==", "requires": { - "@aws-sdk/credential-providers": "^3.186.0", - "bson": "^4.7.2", - "mongodb-connection-string-url": "^2.5.4", + "bson": "^5.3.0", + "mongodb-connection-string-url": "^2.6.0", "saslprep": "^1.0.3", "socks": "^2.7.1" } @@ -6512,15 +6480,15 @@ } }, "mongoose": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.11.2.tgz", - "integrity": "sha512-BJHQerozE+qIVdH8Hn9niMVMUzRNcjmwU7hFEzER1+aYtGmVJgGsXBd9wJ9GnrHrbCsYmKlRy8aTuxEdlEtfow==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.3.1.tgz", + "integrity": "sha512-6289bmSIhvR8xMHsYe2/CuzN7wHK+2RHcK7idDdzniCPC5zix5JH0Hc4k3CmXlr/9zQ2250gUQiUWtvDB0vF1Q==", "requires": { - "bson": "^4.7.2", + "bson": "^5.3.0", "kareem": "2.5.1", - "mongodb": "4.16.0", + "mongodb": "5.6.0", "mpath": "0.9.0", - "mquery": "4.0.3", + "mquery": "5.0.0", "ms": "2.1.3", "sift": "16.0.1" }, @@ -6538,9 +6506,9 @@ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" }, "mquery": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", - "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", "requires": { "debug": "4.x" } @@ -6631,11 +6599,6 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -6786,6 +6749,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -6933,11 +6901,13 @@ } }, "sass": { - "version": "1.38.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.1.tgz", - "integrity": "sha512-Lj8nPaSYOuRhgqdyShV50fY5jKnvaRmikUNalMPmbH+tKMGgEKVkltI/lP30PEfO2T1t6R9yc2QIBLgOc3uaFw==", + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "send": { @@ -7048,36 +7018,6 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, - "socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.4.1", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" - } - }, - "socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "requires": { - "ws": "~8.11.0" - } - }, - "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, "socks": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", @@ -7087,6 +7027,11 @@ "smart-buffer": "^4.2.0" } }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -7131,7 +7076,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true + "optional": true, + "peer": true }, "supports-color": { "version": "5.5.0", @@ -7182,7 +7128,8 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "optional": true + "optional": true, + "peer": true }, "tsscmp": { "version": "1.0.6", @@ -7255,7 +7202,8 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true + "optional": true, + "peer": true }, "vary": { "version": "1.1.2", @@ -7340,12 +7288,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 81710e95..a500998d 100644 --- a/package.json +++ b/package.json @@ -30,19 +30,18 @@ }, "homepage": "https://github.com/kgpmask/MASK#readme", "dependencies": { - "axios": "^0.21.1", - "connect-mongo": "^4.6.0", + "axios": "^1.4.0", + "connect-mongo": "^5.0.0", "cookie-parser": "^1.4.6", "csurf": "^1.11.0", "express": "^5.0.0-beta.1", - "express-session": "^1.17.2", - "mongodb": "^4.8.0", - "mongoose": "^6.2.4", - "nunjucks": "^3.2.3", + "express-session": "^1.17.3", + "mongodb": "^5.6.0", + "mongoose": "^7.3.1", + "nunjucks": "^3.2.4", "passport": "^0.6.0", "passport-google-oauth20": "^2.0.0", - "sass": "^1.38.1", - "socket.io": "^4.5.3" + "sass": "^1.63.6" }, "devDependencies": { "cross-env": "^7.0.3", diff --git a/routes/checker.js b/routes/checker.js index 03a62e60..56c37dff 100644 --- a/routes/checker.js +++ b/routes/checker.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const checker = require('../src/checker.js'); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); @@ -14,4 +13,7 @@ router.post('/:newsletter/:puzzleType', async (req, res) => { } }); -module.exports = router; +module.exports = { + route: '/checker', + router +}; diff --git a/routes/corsProxy.js b/routes/corsProxy.js index 39adfdf6..f32ac41a 100644 --- a/routes/corsProxy.js +++ b/routes/corsProxy.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const axios = require('axios'); router.get('/', (req, res) => { @@ -10,4 +9,7 @@ router.get('/', (req, res) => { }); }); -module.exports = router; +module.exports = { + route: '/corsProxy', + router +}; diff --git a/routes/git-hook.js b/routes/git-hook.js index 12949c80..3908a363 100644 --- a/routes/git-hook.js +++ b/routes/git-hook.js @@ -1,11 +1,9 @@ -const express = require('express'); -const router = express.Router(); const crypto = require('crypto'); +const router = require('express').Router(); -const Tools = require("../src/tools"); +const Tools = require('../src/tools'); router.post('/', async (req, res) => { - // Console log git hook requests console.log(`git-hook request sent at: ${new Date()}`); const pushBranch = req.body.ref.split('/')[2]; @@ -36,7 +34,7 @@ router.post('/', async (req, res) => { try { await new Promise(async (resolve, reject) => { // Keeping timeout this small because I know it won't work - setTimeout(() => reject(new Error('60 seconds time out')), 60_000); + setTimeout(() => reject(new Error('60 seconds time out')), 75_000); await Tools.updateCode(); return resolve('Successfully updated'); }); @@ -48,4 +46,7 @@ router.post('/', async (req, res) => { } }); -module.exports = router; +module.exports = { + route: '/git-hook', + router +}; diff --git a/routes/govportal.js b/routes/govportal.js index c28be923..72257280 100644 --- a/routes/govportal.js +++ b/routes/govportal.js @@ -1,14 +1,13 @@ -const express = require("express"); -const router = express.Router(); +const router = require('express').Router(); -const dbh = PARAMS.mongoless ? {} : require("../database/handler"); +const dbh = PARAMS.mongoless ? {} : require('../database/handler'); router.use((req, res, next) => { - if (PARAMS.userless) return res.notFound('404.njk', { + if (PARAMS.userless && !PARAMS.jsonuser) return res.notFound('404.njk', { message: 'Sorry. This is currently not available in mongoless and userless mode.' }); - if (!req.loggedIn) return res.redirect('/login'); + if (!req.loggedIn) return res.loginRedirect(req, res); if (!req.user.permissions.find(perm => perm === 'governor')) return res.status(403).renderFile('404.njk', { message: 'Access denied. You do not have the required permission.' }); @@ -23,6 +22,20 @@ router.get('/', (req, res) => { router.get('/add-post', (req, res) => { return res.renderFile(`govportal/add-post.njk`); }); +router.get('/post-management', async (req, res) => { + const posts = (await dbh.getPosts().limit(20)).map(post => post.toObject()); + return res.renderFile(`govportal/post-management.njk`, { posts }); +}); +router.get('/edit-post', async (req, res) => { + const id = req.query.id; + const data = (await dbh.getPost(id)).toObject(); + return res.renderFile(`govportal/edit-post.njk`, { ...data, date: data.date.toISOString().slice(0, 10) }); +}); + +router.get('/poll-management', async (req, res) => { + const polls = await dbh.getPolls(); + return res.renderFile(`govportal/poll-management.njk`, { polls }); +}); router.get('/add-poll', (req, res) => { const date = new Date(); @@ -30,6 +43,12 @@ router.get('/add-poll', (req, res) => { return res.renderFile(`govportal/add-poll.njk`, { date: date.toISOString().slice(0, 10) }); }); +router.get('/edit-poll', async (req, res) => { + const id = req.query.id; + const poll = (await dbh.getPoll(id)).toObject(); + return res.renderFile(`govportal/edit-poll.njk`, { ...poll, endTime: poll.endTime.toISOString().slice(0, 10) }); +}); + router.get('/member-management', async (req, res) => { const hierarchy = [ 'Governor', @@ -57,32 +76,33 @@ router.get('/member-management', async (req, res) => { router.post('/add-post', async (req, res) => { const data = req.body.data; if (!data.name || !data.link || !data.attr[0] && ['youtube', 'instagram'].includes(data.type)) { - return res.send({ success: false, message: "Empty Data Provided" }); + return res.send({ success: false, message: 'Empty Data Provided' }); } data.date = new Date().toISOString(); try { response = await dbh.addPost(data); - return res.send({ success: true, message: "Successfully Added Post", response: response }); + // console.log(response); + return res.send({ success: true, message: 'Successfully Added Post', response: response }); } catch (e) { console.log(e); - return res.send({ success: false, message: "Something Went Wrong" }); + return res.send({ success: false, message: 'Something Went Wrong' }); } }); router.post('/add-poll', async (req, res) => { const data = req.body.data; - if (!data.title || !data.records.length) return res.send({ success: false, message: "Empty Data Provided" }); + if (!data.title || !data.records.length) return res.send({ success: false, message: 'Empty Data Provided' }); data.endTime = new Date(data.endTime).toISOString(); const now = new Date(); - if (!(now < new Date(data.endTime))) return res.send({ success: false, message: "Invalid End Date" }); + if (!(now < new Date(data.endTime))) return res.send({ success: false, message: 'Invalid End Date' }); try { - data._id = now.getFullYear() + "-" + ("0" + (now.getMonth() + 1)).slice(-2) + "-" + ((await dbh.getMonthlyPolls()).length + 1); - console.log(data); + data._id = now.getFullYear() + '-' + ('0' + (now.getMonth() + 1)).slice(-2) + '-' + ((await dbh.getMonthlyPolls()).length + 1); + // console.log(data); response = await dbh.addPoll(data); - return res.send({ success: true, message: "Successfully Added Poll", response: response }); + return res.send({ success: true, message: 'Successfully Added Poll', response: response }); } catch (e) { console.log(e); - return res.send({ success: false, message: "Something Went Wrong" }); + return res.send({ success: false, message: 'Something Went Wrong' }); } }); @@ -104,4 +124,74 @@ router.post('/member-management', async (req, res) => { return res.send(response); }); -module.exports = router; +router.get('/add-member', (req, res) => { + return res.renderFile('govportal/govportal.njk', { message: 'Try again (once we actually get new members)' }); +}); + +router.post('/post-management', async (req, res) => { + const data = req.body.data; + let response; + try { + response = await dbh.deletePost(data); + // console.log(response) + return res.send({ success: true, message: 'Successfully deleted post', response: response }); + } catch (e) { + return res.send({ success: false, message: 'Something Went Wrong' }); + } +}); + +router.patch('/edit-post', async (req, res) => { + const data = req.body.data; + // console.log("update",data) + try { + response = await dbh.editPost(data); + // console.log(response); + return res.send({ success: true, message: 'Successfully Edited Post', response: response }); + } catch (e) { + console.log(e); + return res.send({ success: false, message: 'Something Went Wrong' }); + } +}); + +router.post('/poll-management', async (req, res) => { + const data = req.body.data; + let response; + try { + response = await dbh.deletePoll(data); + // console.log(response) + return res.send({ success: true, message: 'Successfully deleted post', response: response }); + } catch (e) { + return res.send({ success: false, message: 'Something Went Wrong' }); + } +}); + +router.patch('/edit-poll', async (req, res) => { + const data = req.body.data; + if (!data.title || !data.records.length) return res.send({ success: false, message: 'Empty Data Provided' }); + data.endTime = new Date(data.endTime).toISOString(); + const now = new Date(); + if (!(now < new Date(data.endTime))) return res.send({ success: false, message: 'Invalid End Date' }); + try { + response = await dbh.editPoll(data); + console.log(response); + return res.send({ success: true, message: 'Successfully Updated Poll', response: response }); + } catch (e) { + console.log(e); + return res.send({ success: false, message: 'Something Went Wrong' }); + } +}); + +router.patch('/delete-option', async (req, res) => { + const data = req.body.data; + try { + response = await dbh.deletePollOption(data); + console.log(response); + } catch (e) { + console.log(e); + } +}); + +module.exports = { + route: '/gov-portal', + router +}; diff --git a/routes/home.js b/routes/home.js index 0cb70008..be7ed515 100644 --- a/routes/home.js +++ b/routes/home.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); const sample = require('../src/samples/posts'); @@ -18,4 +17,7 @@ router.get('/', async (req, res) => { return res.renderFile('home.njk', { posts, vids, art }); }); -module.exports = router; +module.exports = { + route: ['/home', '/'], + router +}; diff --git a/routes/instaupload.js b/routes/instaupload.js deleted file mode 100644 index 890a8b9a..00000000 --- a/routes/instaupload.js +++ /dev/null @@ -1,21 +0,0 @@ -const { IgApiClient } = require("instagram-private-api"); -const { readFile } = require("fs"); -const { promisify } = require("util"); -const readFileAsync = promisify(readFile); -require("dotenv").config(); -const ig = new IgApiClient(); -const postToInsta = async (files) => { - try { - ig.state.generateDevice(process.env.IG_USERNAME); - await ig.account.login(process.env.IG_USERNAME, process.env.IG_PASSWORD); - - await ig.publish.photo({ - file: files.data, - caption: "Really nice photo from the internet!" - }); - } catch (err) { - console.log(err); - } -}; - -module.exports = postToInsta; diff --git a/routes/live.js b/routes/live.js index d3266a5b..e490ec50 100644 --- a/routes/live.js +++ b/routes/live.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const checker = require('../src/checker.js'); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); @@ -33,7 +32,7 @@ router.get('/master', async (req, res) => { if (PARAMS.dev) { // TODO: In the future, set a 'daily' script to run at midnight and update a process.env.LIVE_QUIZ parameter const quiz = await dbh.getLiveQuiz('2022-11-12'); - console.log("Hello"); + console.log('Hello'); // if (!quiz) return res.renderFile('events/quizzes_404.njk', { message: `The quiz hasn't started, yet!` }); const QUIZ = quiz.questions; @@ -163,4 +162,7 @@ router.post('/end', async (req, res) => { return res.send('Ended!'); }); -module.exports = router; +module.exports = { + route: '/live', + router +}; diff --git a/routes/media.js b/routes/media.js index 15227fd2..c1770a31 100644 --- a/routes/media.js +++ b/routes/media.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); const sample = require('../src/samples/posts'); @@ -10,7 +9,7 @@ router.get('/art', async (req, res) => { }); router.get('/videos', async (req, res) => { - const vids = PARAMS.mongoless ? sample.filter(post => post.type === 'youtube') : await dbh.getPosts("youtube"); + const vids = PARAMS.mongoless ? sample.filter(post => post.type === 'youtube') : await dbh.getPosts('youtube'); vids.forEach((vid) => { vid.embed = `https://www.youtube.com/embed/${vid.link.split('?v=')[1]}?playsinline=1`; }); @@ -18,4 +17,7 @@ router.get('/videos', async (req, res) => { }); -module.exports = router; +module.exports = { + route: '/', + router +}; diff --git a/routes/members.js b/routes/members.js index c7200c6e..c98913a3 100644 --- a/routes/members.js +++ b/routes/members.js @@ -1,11 +1,10 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); const sample = require('../src/samples/members'); router.get('/:yearName?', async (req, res) => { - const yearName = parseInt(req.params.yearName) || 2022; + const yearName = ~~Object.keys(require('../src/teams.json')).sort().pop(); const membersData = PARAMS.mongoless ? sample : await dbh.getMembersbyYear(yearName); const status = { 'Governors': [], @@ -35,4 +34,7 @@ router.get('/:yearName?', async (req, res) => { }); }); -module.exports = router; +module.exports = { + route: '/members', + router +}; diff --git a/routes/misc.js b/routes/misc.js index 9443317f..bf50ecd2 100644 --- a/routes/misc.js +++ b/routes/misc.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); router.get('/about', (req, res) => { return res.renderFile('about.njk'); @@ -20,9 +19,6 @@ router.get('/prizes', (req, res) => { return res.renderFile('events/prizes.njk', { prizes }); }); -router.get('/submissions', (req, res) => { - return res.renderFile('submissions.njk'); -}); router.get('/success', (req, res) => { // TODO: Rename this to /quiz/success @@ -37,4 +33,7 @@ router.get('/terms', (req, res) => { res.renderFile('terms.njk'); }); -module.exports = router; +module.exports = { + route: '/', + router +}; diff --git a/routes/newsletter.js b/routes/newsletter.js index 0dd9f466..f2338b54 100644 --- a/routes/newsletter.js +++ b/routes/newsletter.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const fs = require('fs').promises; const path = require('path'); @@ -49,7 +48,7 @@ router.get('/:target?', (req, res) => { const adjs = [letters[index - 1], letters[index + 1], letters[index]]; fs.readdir(path.join(__dirname, '../templates/newsletters', target)).then(files => { const pages = files.filter(file => file.includes('#')); - return res.renderFile(filepath, { adjs, pages, target }); + return res.renderFile(filepath, { adjs, pages, target, targetpage: req.query.page }); }); }).catch(err => { @@ -58,4 +57,7 @@ router.get('/:target?', (req, res) => { }); }); -module.exports = router; +module.exports = { + route: '/newsletters', + router +}; diff --git a/routes/polls.js b/routes/polls.js index 6ffa4cf3..6dd695cf 100644 --- a/routes/polls.js +++ b/routes/polls.js @@ -1,11 +1,11 @@ -const dbh = require('../database/handler'); - const router = require('express').Router(); +const dbh = require('../database/handler'); + // Route for opening poll or poll list -router.get('/:pollId?', async (req, res) => { - if (!req.loggedIn) return res.redirect('/login'); - const pollId = req.params.pollId; +router.get('/', async (req, res) => { + if (!req.loggedIn) return res.loginRedirect(req, res); + const pollId = req.query.id; const activePolls = await dbh.getActivePolls(); if (!pollId) return res.renderFile('poll_list.njk', { activePolls, @@ -31,16 +31,16 @@ router.post('/', async (req, res) => { userId: req.user._id, userChoice: req.body.userChoice }); - return res.send({ success: true, message: "Successfully Voted" }); + return res.send({ success: true, message: 'Successfully Voted' }); } catch (e) { - return res.send({ success: false, message: "Something Went Wrong" }); + return res.send({ success: false, message: 'Something Went Wrong' }); } }); // Route for displaying poll results -router.get('/results/:id?', async (req, res) => { - if (!req.loggedIn) return res.redirect('/login'); - const pollId = req.params.id; +router.get('/results', async (req, res) => { + if (!req.loggedIn) return res.loginRedirect(req, res); + const pollId = req.query.id; if (!pollId) return res.notFound('No ID given.'); const activePolls = await dbh.getActivePolls(); const poll = activePolls.find(poll => poll._id === pollId); @@ -59,4 +59,7 @@ router.get('/results/:id?', async (req, res) => { }); }); -module.exports = router; +module.exports = { + route: '/polls', + router +}; diff --git a/routes/prizes.js b/routes/prizes.js index 683a5973..38de4297 100644 --- a/routes/prizes.js +++ b/routes/prizes.js @@ -1,9 +1,11 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); router.get('/', (req, res) => { const prizes = require('../src/rewards.json'); return res.renderFile('events/prizes.njk', { prizes }); }); -module.exports = router; +module.exports = { + route: '/prizes', + router +}; diff --git a/routes/profile.js b/routes/profile.js index 7cb165ab..c52087ee 100644 --- a/routes/profile.js +++ b/routes/profile.js @@ -1,16 +1,15 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); router.get('/', async (req, res) => { if (!req.loggedIn) return res.redirect('/'); - const user = await dbh.getUserStats(req.user._id); + const user = !PARAMS.jsonuser ? await dbh.getUserStats(req.user._id) : {}; return res.renderFile('profile.njk', { name: req.user.name, picture: req.user.picture, - points: user.points, - quizzes: user.quizData.map(stamp => { + points: user?.points, + quizzes: user?.quizData?.map(stamp => { const months = [ '-', 'January', @@ -33,4 +32,7 @@ router.get('/', async (req, res) => { }); -module.exports = router; +module.exports = { + route: '/profile', + router +}; diff --git a/routes/py-events.js b/routes/py-events.js index 867123ac..7b473f45 100644 --- a/routes/py-events.js +++ b/routes/py-events.js @@ -1,28 +1,30 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); router.get('/', (req, res) => { - return res.renderFile("event-articles/py_events.njk"); + return res.renderFile('event-articles/py_events.njk'); }); router.get('/qatq', (req, res) => { - return res.renderFile("event-articles/qatq.njk"); + return res.renderFile('event-articles/qatq.njk'); }); router.get('/seekers-quest', (req, res) => { - return res.renderFile("event-articles/seekers-quest.njk"); + return res.renderFile('event-articles/seekers-quest.njk'); }); router.get('/cosplay23', (req, res) => { - return res.renderFile("event-articles/cosplay23.njk"); + return res.renderFile('event-articles/cosplay23.njk'); }); router.get('/intrasoc', (req, res) => { - return res.renderFile("event-articles/intrasoc.njk"); + return res.renderFile('event-articles/intrasoc.njk'); }); router.get('/suzume', (req, res) => { - return res.renderFile("event-articles/suzumetrip.njk"); + return res.renderFile('event-articles/suzumetrip.njk'); }); -module.exports = router; +module.exports = { + route: '/events', + router +}; diff --git a/routes/quizzes.js b/routes/quizzes.js index 09618176..c75cd2a4 100644 --- a/routes/quizzes.js +++ b/routes/quizzes.js @@ -1,5 +1,4 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); const dbh = PARAMS.mongoless ? {} : require('../database/handler'); @@ -168,4 +167,7 @@ router.post('/', async (req, res) => { return res.renderFile('events/quiz_success.njk', { score: points[0], totalScore: points[1] }); }); -module.exports = router; +module.exports = { + route: ['/quizzes', '/events'], + router +}; diff --git a/routes/submission.js b/routes/submission.js new file mode 100644 index 00000000..d8463c68 --- /dev/null +++ b/routes/submission.js @@ -0,0 +1,25 @@ +const router = require('express').Router(); + +const dbh = require('../database/handler'); + +router.get('/', (req, res) => { + if (PARAMS.mongoless) return res.status(403).renderFile('404.njk', { + pagetitle: 'Method not allowed', + message: 'This method is not permitted in mongoless mode.' + }); + return res.renderFile('submissions.njk'); +}); + +router.post('/', async (req, res) => { + if (PARAMS.mongoless) return res.status(403).send('Not allowed in mongoless'); + // req.body = { email, name, member, link, proof, social } + const data = req.body; + const submission = await dbh.addSubmission(data); + // Add a Discord hook to send a message in case of new submission + return res.status(200).send('Success'); +}); + +module.exports = { + route: '/submissions', + router +}; diff --git a/routes/user.js b/routes/user.js index ea8c4598..5b12bb29 100644 --- a/routes/user.js +++ b/routes/user.js @@ -1,14 +1,22 @@ -const express = require('express'); -const router = express.Router(); +const router = require('express').Router(); router.get('/login', (req, res) => { if (req.loggedIn) return res.redirect('/'); - res.renderFile('login.njk'); + return res.renderFile('login.njk'); }); router.get('/logout', (req, res) => { - if (!req.loggedIn) return res.redirect('/login'); + if (!req.loggedIn) return res.loginRedirect(req, res); return req.logout(() => res.redirect('/')); }); -module.exports = router; +router.get('/logged-in', (req, res) => { + const redirectRoute = req.cookies.redirect.path ?? '/'; + if (req.cookies.redirect) res.clearCookie('redirect'); + return res.redirect(redirectRoute); +}); + +module.exports = { + route: '/', + router +}; diff --git a/src/env.js b/src/env.js index 30cfb09e..c1698928 100644 --- a/src/env.js +++ b/src/env.js @@ -8,9 +8,10 @@ const aliases = { p: 'prod', q: 'quiz', u: 'userless', - t: 'test' + t: 'test', + j: 'jsonuser' }; -const validParams = ['dev', 'local', 'prod', 'mongoless', 'userless', 'quiz', 'test', 'maintenance']; +const validParams = ['dev', 'local', 'prod', 'mongoless', 'userless', 'quiz', 'test', 'maintenance', 'jsonuser']; if (!global.PARAMS) { if (process.env['NODE_ENV'] === 'production') process.env.prod = true; const shorts = new Set(); @@ -26,6 +27,7 @@ if (!global.PARAMS) { } exports.init = () => { + if (PARAMS.dev && PARAMS.prod) { console.log('Production access is disabled with dev mode. Please use the testing DB instead.'); process.exit(1); @@ -54,6 +56,7 @@ exports.init = () => { PARAMS.userless = true; console.log('Operating in userless mode.'); } + if (PARAMS.jsonuser) PARAMS.userless = true; if (!PARAMS.prod) process.env.MONGO_URL = process.env.MONGO_TEST_URL; if (PARAMS.local) process.env.MONGO_URL = 'mongodb://127.0.0.1/mask'; if (PARAMS.maintenance) PARAMS.mongoless = PARAMS.userless = true; diff --git a/src/mask.js b/src/mask.js index d856f331..cf1aecb9 100644 --- a/src/mask.js +++ b/src/mask.js @@ -10,8 +10,7 @@ const path = require('path'); global.Tools = require('./tools.js'); const DB = require('../database/database.js'); const PORT = process.env.PORT ?? 6969; -const route = require("./route.js"); -const socketio = require('socket.io')(); +const route = require('./route.js'); const initMiddleware = require('./middleware.js'); global.app = express(); @@ -28,15 +27,12 @@ if (PARAMS.maintenance) app.use((req, res) => res.renderFile('under_maintenance. else route(app, nunjEnv); const server = http.createServer(app); -global.io = socketio.listen(server); - -require('./socket.js'); server.listen(PORT, () => { if (!PARAMS.test) console.log(`The MASK server's up at http://localhost:${PORT}/`); }); -const sass = childProcess.exec(`npx sass assets${PARAMS.dev ? ' --watch' : ''} --no-source-map --style compressed`); +const sass = childProcess.exec(`npx sass assets${PARAMS.dev ? ' --watch' : ''} --no-source-map --style=compressed`); exports.ready = () => waitForDB; diff --git a/src/middleware.js b/src/middleware.js index 196e4452..806d3582 100644 --- a/src/middleware.js +++ b/src/middleware.js @@ -6,6 +6,7 @@ const session = require('express-session'); const fs = require('fs').promises; const passport = require('passport'); const path = require('path'); +const sampleJsonUser = require('./samples/user.json'); const login = require('./login.js'); @@ -13,7 +14,13 @@ module.exports = function setMiddleware (app) { app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cookieParser()); - + if (PARAMS.jsonuser) { + app.use((req, res, next) => { + req.user = sampleJsonUser; + req.loggedIn = true; + next(); + }); + } if (!PARAMS.userless) { app.use(session({ secret: process.env.SESSION_SECRET, @@ -38,15 +45,22 @@ module.exports = function setMiddleware (app) { // Pre-routing if (!PARAMS.userless) { app.get('/login/federated/google', passport.authenticate('google')); - app.get('/oauth2/redirect/google', passport.authenticate('google', { - successReturnToOrRedirect: '/', - failureRedirect: '/login' - })); + + app.get('/oauth2/redirect/google', (req, res, next) => { + passport.authenticate('google', { + successReturnToOrRedirect: '/logged-in', + failureRedirect: '/login' + })(req, res, next); + }); } app.use('/assets', express.static(path.join(__dirname, '..', 'assets'))); app.use((req, res, next) => { + res.loginRedirect = (req, res) => { + res.cookie('redirect', { path: req.originalUrl, setPath: false }); + return res.redirect('/login'); + }; res.renderFile = (files, ctx) => { if (!Array.isArray(files)) files = [files]; return res.render(path.join(__dirname, '../templates', ...files), ctx); @@ -73,7 +87,11 @@ module.exports = function setMiddleware (app) { res.locals.userless = PARAMS.userless; res.locals.mongoless = PARAMS.mongoless; res.locals.quizFlag = PARAMS.quiz; + res.locals.jsonuser = PARAMS.jsonuser; req.loggedIn = res.locals.loggedIn = Boolean(req.user); next(); }); + }; + + diff --git a/src/route.js b/src/route.js index cb7727c5..fcd7593a 100644 --- a/src/route.js +++ b/src/route.js @@ -1,68 +1,19 @@ -const checkerRouter = require("../routes/checker"); -const corsProxyRouter = require("../routes/corsProxy"); -const govPortalRouter = require("../routes/govportal"); -const gitHookRouter = require("../routes/git-hook"); -const homeRouter = require("../routes/home"); -const liveRouter = require("../routes/live"); -const mediaRouter = require("../routes/media"); -const membersRouter = require("../routes/members"); -const miscRouter = require("../routes/misc"); -const newsletterRouter = require("../routes/newsletter"); -const pollRouter = require("../routes/polls"); +const fs = require('fs').promises; +const path = require('path'); -const profileRouter = require("../routes/profile"); -const quizzesRouter = require("../routes/quizzes"); -const userRouter = require("../routes/user"); -const eventsRouter = require("../routes/py-events"); - -function link (app, nunjEnv) { - const smallerRoutes = ["/about", "/apply", "/blog", "/prizes", "/submissions", "/success", "/privacy", "/terms"]; - const userRoutes = ["/login", "/logout"]; - const mediaRoutes = ["/art", "/videos"]; - - app.use(async (_, __, next) => { +async function link (app, nunjEnv) { + app.use(async (req, res, next) => { await new Promise(r => r()); next(); }); - app.use('/', (req, res, next) => { - if (req.url in smallerRoutes) { - next(); - } else { - next('route'); - } - }, miscRouter); - - app.use('/', (req, res, next) => { - if (req.url in userRoutes) { - next(); - } else { - next('route'); - } - }, userRouter); - - app.use('/', (req, res, next) => { - if (req.url in mediaRoutes) { - next(); - } else { - next('route'); - } - }, mediaRouter); - + // readdir and use routers like a madman + const routerModules = (await fs.readdir(path.join(__dirname, '../routes'))).filter(file => file.endsWith('.js')); + routerModules.forEach(module => { + const { route, router } = require(`../routes/${module}`); + app.use(route, router); + }); - app.use('/checker', checkerRouter); - app.use('/corsProxy', corsProxyRouter); - app.use('/gov-portal', govPortalRouter); - app.use('/git-hook', gitHookRouter); - app.use('/', homeRouter); - app.use('/home', homeRouter); - app.use('/live', liveRouter); - app.use('/members', membersRouter); - app.use('/newsletters', newsletterRouter); - app.use('/polls', pollRouter); - app.use('/profile', profileRouter); - app.use('/events', eventsRouter); - app.use(['/quizzes', '/events'], quizzesRouter); app.use('/rebuild', (req, res) => { nunjEnv.loaders.forEach(loader => loader.cache = {}); ['./rewards.json'].forEach(cache => delete require.cache[require.resolve(cache)]); @@ -76,7 +27,7 @@ function link (app, nunjEnv) { app.use((req, res, next) => { // If propagation hasn't stopped, switch to GET! - if (req.method === "POST") { + if (req.method === 'POST') { return res.redirect(req.url); } next(); @@ -90,9 +41,10 @@ function link (app, nunjEnv) { if (PARAMS.dev) console.error(err.stack); // Make POST errors show only the data, and GET errors show the page with the error message res.status(500); - if (req.method === "GET") - res.renderFile("404.njk", { - message: "Server error! This may or may not be due to invalid input." + if (req.method === 'GET') + res.renderFile('404.njk', { + message: 'Server error! This may or may not be due to invalid input.', + pagetitle: 'Error' }); else res.send(err.toString()); }); diff --git a/src/samples/user.json b/src/samples/user.json new file mode 100644 index 00000000..25038760 --- /dev/null +++ b/src/samples/user.json @@ -0,0 +1,7 @@ +{ + "_id": "696969696969696969420", + "name": "MASK user", + "picture": "https://lh3.googleusercontent.com/a/ALm5wu2RSxfT5t7kiQhkIGaUw9WvknvNP-1ZEqAlcEgTSg=s96-c", + "__v": 0, + "permissions": [] +} diff --git a/src/socket.js b/src/socket.js deleted file mode 100644 index 817bd31b..00000000 --- a/src/socket.js +++ /dev/null @@ -1,4 +0,0 @@ -io.on('connection', socket => { - if (socket.handshake.query.userId) socket.userId = socket.handshake.query.userId; - socket.join('waiting-for-live-quiz'); -}); diff --git a/src/teams.json b/src/teams.json index ebd0a2c4..9806ec1f 100644 --- a/src/teams.json +++ b/src/teams.json @@ -60,5 +60,27 @@ "name": "WebDev", "icon": "webdev" } + }, + "2023" : { + "a": { + "name": "AMV & Music", + "icon": "amv" + }, + "d": { + "name": "Design & Arts", + "icon": "design" + }, + "n": { + "name": "Media & Newsletter", + "icon": "newsletter" + }, + "q": { + "name": "Quiz", + "icon": "quiz" + }, + "w": { + "name": "WebDev", + "icon": "webdev" + } } -} \ No newline at end of file +} diff --git a/templates/404.njk b/templates/404.njk index 8d97319e..376f9878 100644 --- a/templates/404.njk +++ b/templates/404.njk @@ -1,10 +1,11 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} {% set thispage = '404' %} -{% set pagetitle = '404' %} +{% set pagetitle = pagetitle if pagetitle else '404' %} +{% set pagedesc = 'Error: Resource not found' %} {% block pagecontent %}

{% if message %} {{message}} {% else %} It doesn't look like this page exists! {% endif %}

-

If you think this is an error, please contact us at +

If you think this is an error, please contact us at kgpmask@gmail.com.

{% endblock %} diff --git a/templates/_base.njk b/templates/_base.njk index 00a6402d..7cc45023 100644 --- a/templates/_base.njk +++ b/templates/_base.njk @@ -55,7 +55,7 @@ Our Society Our Members {% if loggedIn %} - Profile + Profile {% else %} Login {% endif %} @@ -92,14 +92,13 @@ {% endblock %}
{% block pagecontent %} - Huh, this is an empty page. {% endblock %}
-

Manga & Anime
Society Kharagpur

+

Manga and Anime
Society Kharagpur

Find us!
diff --git a/templates/_event.njk b/templates/_event.njk index 61db3554..534d1341 100644 --- a/templates/_event.njk +++ b/templates/_event.njk @@ -1,6 +1,7 @@ {% extends '_base.njk' %} {% set thispage = 'events' %} +{% set pagedesc = pagedesc if pagedesc else 'Events in MASK' %} {% macro slide(folder, img) %}
@@ -85,7 +86,7 @@ .transparent-box > p { margin-bottom: 12px; } - + .transparent-box > img { display: block; max-width: 100%; @@ -93,7 +94,7 @@ margin: 5px auto; border-radius: 5px; } - + .image-container { max-width: 70vw; width: calc(min(700px, 70vw)); @@ -161,4 +162,4 @@ {% block eventCSS %} {% endblock %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/_newsletter.njk b/templates/_newsletter.njk index f4d59110..c0f6c7fb 100644 --- a/templates/_newsletter.njk +++ b/templates/_newsletter.njk @@ -1,18 +1,31 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} {% set thispage = 'newsletters' %} -{% macro nextprev() %} +{% set pagedesc = pagedesc if pagedesc else 'Newsletter: Manga and Anime Society Kharagpur' %} + +{% set pagecount = pages.length %} + + + +{% macro nextprevnewsletter() %}
- + - +
{% endmacro %} -{% set pagecount = pages.length %} +{% macro nextprevpage() %} +
+ + + {# #} + +
+{% endmacro %} {% block pagecontent %} - {{ nextprev() }} + {{ nextprevnewsletter() }}

{% if pdf %}
--> -
- {# {% block coverpage %} -
- -
Manga & Anime
Society, Kharagpur
-
-
{{ pagetitle }}
+
+ {{ nextprevpage() }} +
+ {# {% block coverpage %} +
+ +
Manga and Anime
Society, Kharagpur
+
+
{{ pagetitle }}
+
+ {% endblock %} #} + {% block coverpage %} +
+ {% endblock %} + {# {% block article %} +
This article hasn't been published yet - stay tuned!
+ {% endblock %} #} + {% block article %} + {% for page in pages %} + {% include thispage+'/'+target+'/'+page%} + {% endfor %} + {% endblock %}
- {% endblock %} #} - {% block coverpage %} -
- {% endblock %} - {# {% block article %} -
This article hasn't been published yet - stay tuned!
- {% endblock %} #} - {% block article %} - - {% for page in pages %} - {% include thispage+'/'+target+'/'+page%} - {% endfor %} - {% endblock %} -
+ {{ nextprevpage() }} +

Swipe left/right or click and use arrow keys to scroll
Best viewed on PC


- {{ nextprev() }} + {{ nextprevnewsletter() }} {% endblock %} {% block customcss %} @@ -131,6 +147,28 @@ color: var(--off-white); } + .page-change-container { + margin: 10px auto; + } + + .page-change-container > input[type="number"] { + width: 80px; + height: 25px; + margin: 0 5px; + border: solid 2px var(--light-gray); + border-radius: 3px; + background-color: var(--gray); + color: var(--off-white); + text-align: center; + -moz-appearance: textfield; + } + + .page-change-container > input[type="number"]::-webkit-outer-spin-button, + .page-change-container > input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0px; + } + #pages-container { overflow: hidden; width: 80%; @@ -150,13 +188,16 @@ -ms-overflow-style: none; scrollbar-width: none; } + #pages:active, #pages:focus { + outline: 0; + } #pages::-webkit-scrollbar { display: none; } .ref{ color: inherit; text-decoration: none; - + } .page { scroll-snap-align: start; @@ -362,6 +403,61 @@ {% endblock %} {% block customjs %} + +{% endblock %} + +{% block customcss %} + {{ super() }} + +{% endblock %} diff --git a/templates/govportal/edit-post.njk b/templates/govportal/edit-post.njk new file mode 100644 index 00000000..65197924 --- /dev/null +++ b/templates/govportal/edit-post.njk @@ -0,0 +1,284 @@ +{% extends "govportal/govportal.njk" %} + +{% set thispage = 'govportal' %} +{% set pagetitle = 'Governor Portal | Edit Post' %} +{% set actionname = 'Edit Post' %} + +{% set scripts = ['https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'] %} + +{% block actioncontent %} + +
+
+
+ +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+{% endblock %} + +{% block customjs %} + +{% endblock %} + +{% block customcss %} + {{ super() }} + +{% endblock %} diff --git a/templates/govportal/govportal.njk b/templates/govportal/govportal.njk index b6450aea..0fb0ec4d 100644 --- a/templates/govportal/govportal.njk +++ b/templates/govportal/govportal.njk @@ -1,17 +1,16 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} -{% set thispage = 'govportal' %} {% set pagetitle = pagetitle if pagetitle else 'Governor Portal' %} {% set navlink=[{ - href: 'gov-portal/add-post', - name: 'Add Post' + href: 'post', + name: 'Post' },{ - href: 'gov-portal/add-poll', - name: 'Add Poll' + href: 'poll', + name: 'Poll' },{ - href: 'gov-portal/member-management', - name: 'Member Management' + href: 'member', + name: 'Member' }] %} {% block navbar %} @@ -21,7 +20,7 @@  
@@ -57,8 +56,35 @@ {% block pagecontent %} {% block extrainfo %}{% endblock %}

Governor Portal{% if actionname %} - {{ actionname }} {% endif %}

+ {{ message if message }} {# This looks kinda empty, maybe we can have stuff here #}
- {% block actioncontent %}{% endblock %} + {% block actioncontent %} +

Quick Actions

+ + {% endblock %}
{% endblock %} + +{% block customcss %} + +{% endblock %} diff --git a/templates/govportal/image-upload.njk b/templates/govportal/image-upload.njk index b4a37dba..4b54a981 100644 --- a/templates/govportal/image-upload.njk +++ b/templates/govportal/image-upload.njk @@ -1,4 +1,4 @@ -{% extends "govportal/govportal.njk" %} +{% extends 'govportal/govportal.njk' %} {% set thispage = 'govportal' %} {% set pagetitle = 'Governor Portal | Image Upload' %} @@ -22,6 +22,7 @@ {% endblock %} {% block customcss %} + {{ super() }} +{% endblock %} + +{% block customjs %} + +{% endblock %} diff --git a/templates/govportal/post-management.njk b/templates/govportal/post-management.njk new file mode 100644 index 00000000..01b669aa --- /dev/null +++ b/templates/govportal/post-management.njk @@ -0,0 +1,209 @@ +{% extends "govportal/govportal.njk" %} + +{% set thispage = 'post' %} +{% set pagetitle = 'Governor Portal | Post Management' %} +{% set actionname = 'Post Management' %} + +{% set scripts = ['https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'] %} + +{% block actioncontent %} + + {#

Post Management Page

#} + +

Showing the last 20 posts only...

+ {% for post in posts %} +
+
+ {% for key, value in post %} + {% if key != '_id' and key != '__v' and key != 'metadata' %} + {{ key | capitalize }}: {% if key != 'date' %} {{ value }} {% else %} {{ value | string | truncate(15, true, "") }} {% endif %}
+ {% endif %} + {% endfor %} +
+ +
+ + +
+
+ {% endfor %} + +{% endblock %} + +{% block customcss %} + {{ super() }} + +{% endblock %} + +{% block customjs %} + +{% endblock %} diff --git a/templates/home.njk b/templates/home.njk index f107bbf9..f9398f6f 100644 --- a/templates/home.njk +++ b/templates/home.njk @@ -1,12 +1,14 @@ +{% extends '_base.njk' %} + {% set thispage = 'home' %} -{% extends "_base.njk" %} +{% set pagedesc = 'The website of Manga and Anime Society Kharagpur. Stay tuned for more updates.' %} {% set scripts = ['https://www.youtube.com/iframe_api'] %} {% block pagecontent %}
MASK - Manga & Anime Society Kharagpur + Manga and Anime Society Kharagpur  
@@ -21,7 +23,7 @@

Welcome to the MASK website!

- Welcome to the official website of the Manga & Anime Society Kharagpur. We are a community that is dedicated to anime and related content. We aim to spread our passion and love for anime, manga, and related media. We create content ranging from AMVs and reels to artwork and sketches, and hold crowd events like anime quizzes. We wish to reach to the skies and beyond, as we aim to diversify and increase the scope of our interaction and indulgence in the coming years. + Welcome to the official website of the Manga and Anime Society Kharagpur. We are a community that is dedicated to anime and related content. We aim to spread our passion and love for anime, manga, and related media. We create content ranging from AMVs and reels to artwork and sketches, and hold crowd events like anime quizzes. We wish to reach to the skies and beyond, as we aim to diversify and increase the scope of our interaction and indulgence in the coming years.
diff --git a/templates/leaderboard.njk b/templates/leaderboard.njk index 78ded5b0..ae269334 100644 --- a/templates/leaderboard.njk +++ b/templates/leaderboard.njk @@ -1,4 +1,4 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} {% set thispage = 'leaderboard' %} {% set pagetitle = 'Leaderboard' %} diff --git a/templates/login.njk b/templates/login.njk index b8b75dd7..34c3599c 100644 --- a/templates/login.njk +++ b/templates/login.njk @@ -1,8 +1,11 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} {% set thispage = 'login' %} {% set pagetitle = 'Login' %} +{% set pagedesc = 'Login to Manga and Anime Society Kharagpur’s site to explore more.' %} + +{% set scripts = ['https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'] %} {% block pagecontent %} - + {% endblock %} diff --git a/templates/members.njk b/templates/members.njk index 95fd9427..c9a30e5b 100644 --- a/templates/members.njk +++ b/templates/members.njk @@ -1,8 +1,10 @@ -{% extends "_base.njk" %} +{% extends '_base.njk' %} {% set thispage = 'members' %} {% set pagetitle = 'Our Members' %} +{% set pagedesc = 'Our members, who have worked hard and made this place what it is now.' %} + {% block pagecontent %}