Together is a community-driven open source project backed by
- members of 100devs. Together is not only designed to be a
- valuable tool to the 100devs community but also provides an
+ members of 100Devs. Together is not only designed to be a
+ valuable tool to the 100Devs community but also provides an
additional opportunity for students to learn in a group
environment. Together is open to all varying skill sets and
encourages peer programming.
diff --git a/client/src/pages/NotFoundPage.jsx b/client/src/pages/NotFoundPage.jsx
index 65040063..17f2cf41 100644
--- a/client/src/pages/NotFoundPage.jsx
+++ b/client/src/pages/NotFoundPage.jsx
@@ -21,9 +21,9 @@ export default function NotFoundPage() {
className="bg-white border-2 border-black rounded-2xl flex flex-row gap-2 justify-center items-center p-3 focus:ring-4 focus:ring-black"
>
+
Home
diff --git a/client/src/setupProxy.js b/client/src/setupProxy.js
deleted file mode 100644
index eb174162..00000000
--- a/client/src/setupProxy.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const { createProxyMiddleware } = require("http-proxy-middleware");
-
-module.exports = function (app) {
- app.use(
- "/auth/discord",
- createProxyMiddleware({
- target: "http://localhost:2121",
- changeOrigin: true,
- })
- );
-};
diff --git a/client/tailwind.config.cjs b/client/tailwind.config.cjs
deleted file mode 100644
index 503722ae..00000000
--- a/client/tailwind.config.cjs
+++ /dev/null
@@ -1,45 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- content: ["./src/**/*.{js,jsx,ts,tsx}"],
- theme: {
- screens: {
- //think of each breakpoint as starting with "X pixels"
- //so using md: means we want to apply styles to screen widths of 768px or greater
- sm: "640px",
- // => @media (min-width: 640px) { ... }
- md: "768px",
- // => @media (min-width: 768px) { ... }
-
- lg: "1024px",
- // => @media (min-width: 1024px) { ... }
-
- xl: "1280px",
- // => @media (min-width: 1280px) { ... }
-
- "2xl": "1536px",
- // => @media (min-width: 1536px) { ... }
- },
- fontFamily: {
- inconsolata: ["Inconsolata", "monospace"],
- },
- extend: {
- colors: {
- primary: "#F4F1F1",
- secondary: "#E1E9ED",
- mainOrange: "rgb(var(--color-mainOrange) / 0.85)",
- mainGreen: "rgb(var(--color-mainGreen) / 0.85)",
- mainBlue: "rgb(var(--color-mainBlue) / 0.85)",
- discordBtn: "rgb(var(--color-discordBtn) / 0.7)",
- navBtn: "#009BA0",
- navBtnLight: "#66C3C6",
- teal: {
- DEFAULT: "#009BA0",
- light: "#BFD0D8",
- lightest: "#E0E8EC",
- },
- accent: "rgb(var(--color-accent) / 0.6)",
- },
- },
- },
- plugins: [],
-};
diff --git a/client/vite.config.js b/client/vite.config.js
index 5cb574b8..160b6116 100644
--- a/client/vite.config.js
+++ b/client/vite.config.js
@@ -1,6 +1,7 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import IstanbulPlugin from "vite-plugin-istanbul";
+import tailwindcss from "@tailwindcss/vite";
// https://vite.dev/config/
export default defineConfig({
@@ -10,6 +11,7 @@ export default defineConfig({
cypress: true,
requireEnv: false,
}),
+ tailwindcss(),
],
build: {
outDir: "build",
diff --git a/cypress/e2e/create-event-form.cy.js b/cypress/e2e/create-event-form.cy.js
index 0b5a116d..8a4f5c6e 100644
--- a/cypress/e2e/create-event-form.cy.js
+++ b/cypress/e2e/create-event-form.cy.js
@@ -178,10 +178,10 @@ describe("Event Creation Form", () => {
tgt.createForm.input
.endDate()
- .type(dateToYYYYMMDD(createOffsetDate(now, "Date", 100)));
+ .type(dateToYYYYMMDD(createOffsetDate(now, "Date", 800)));
tgt.createForm.button.next().click();
expectFormErrors(
- "Start date and End date cannot be more than 90 days apart",
+ "Start date and End date cannot be more than two years apart",
"If event is not reoccuring start date and end date must be the same day"
);
diff --git a/cypress/e2e/event-permissions-cy.js b/cypress/e2e/event-permissions-cy.js
new file mode 100644
index 00000000..40feafdd
--- /dev/null
+++ b/cypress/e2e/event-permissions-cy.js
@@ -0,0 +1,44 @@
+///
+
+import {
+ createOffsetDate,
+ ensureInMiddleOfMonthAndDay,
+} from "../support/functions";
+import tgt from "../support/tgt";
+
+describe("Event Permissions", () => {
+ beforeEach(() => {
+ cy.task("clearDb");
+
+ const now = ensureInMiddleOfMonthAndDay();
+ const tomorrow = createOffsetDate(now, "Date", 1);
+ const tomorrowAndAnHour = createOffsetDate(tomorrow, "Hours", 1);
+
+ // create test event
+ cy.login("100_DEVER");
+ cy.createOwnEvents("100_DEVER", {
+ title: "Test Event",
+ description: "Test Description",
+ location: "Test Location",
+ startAt: tomorrow,
+ endAt: tomorrowAndAnHour,
+ groupId: null,
+ });
+ });
+
+ it("allows moderators to delete any event", () => {
+ cy.login("MODERATOR_USER");
+ tgt.landing.button.calendar().click();
+ cy.contains("button", "Test Event").click();
+ cy.contains("button", "Delete Specific Event").click();
+
+ cy.contains("Test Event").should("not.exist");
+ });
+
+ it("prevents regular users from deleting other users' events", () => {
+ cy.login("SECOND_100_DEVER");
+ tgt.landing.button.calendar().click();
+ cy.contains("button", "Test Event").click();
+ cy.contains("button", "Delete Specific Event").should("not.exist");
+ });
+});
diff --git a/docs/01-Team-Organization.md b/docs/01-Team-Organization.md
new file mode 100644
index 00000000..4f48eee4
--- /dev/null
+++ b/docs/01-Team-Organization.md
@@ -0,0 +1,67 @@
+# Together Team Structure
+
+Listed below is the current team of Together. Discussion happens in [Together's Discord Thread](https://discord.com/channels/735923219315425401/1038482732633825442). Here are some people involved in the project that you can chat with in the Discord thread.
+
+| Role | Name | Discord | Subject Matter Expert (Related to Together) |
+| ----------------------------------------- | ------ | ------- | ---------------------------------------------------------------- |
+| Team Lead, Maintainer, Developer | Devin |
+| Maintainer, Developer, Software Architect | Rask |
+| Maintainer | Eric |
+| Maintainer, Developer | Emme |
+| Design Lead | NEEDED | | Please reach out if you'd like to be design lead on this project |
+| Designer | NEEDED | | Please reach out if you'd like to be a designer on this project |
+| Scrum Master | Evelyn |
+
+## Responsibilities
+
+### Team Lead
+
+- Responsible for the project vision
+- Owns end-to-end delivery of the project
+- Owns project delivery plan
+
+### Maintainer
+
+- Reviewing and merging pull requests from contributors
+- Ensuring that the code in the repository adheres to any established coding standards or conventions
+- Communicating with users and contributors to provide support and guidance
+
+### Software Architect
+
+- Owns technical quality of the delivery
+- Maintains software architecture
+- New developer onboarding
+- Sets code review process
+
+### Designer
+
+- Collaborating with product management and engineer to define and implement innovative solutions for product directions, visuals, and experience
+- Executing all visual design stages from concept to final hand-off
+- Conceptualizing original ideas that bring simplicity and user friendliness to complex design
+
+### Developer
+
+- Engineers and stabilizes the product
+- Solves any technical problems emerging during the development lifecycle
+
+### Scrum Master
+
+- Facilitate scrum meetings
+- Manages meeting minutes for Standups
+
+#### Past Contributors
+
+| Role | Name | Discord | Subject Matter Expert (Related to Together) |
+| -------------------------- | ------- | ----------------- | ---------------------------------------------------------- |
+| Team Lead | Caleb | Caleb#9822 | Git |
+| Maintainer | Chanel | InstincDev#9789 | React, Onboarding |
+| Maintainer | Matt | Saker Tarsos#7223 | React, Onboarding |
+| Software Architect | TBD | TBD |
+| Full-Stack System Engineer | Eric | intelagense#1958 |
+| Design Lead | Natalie | Natashka#3565 | Design & Figma |
+| Designer | Ana | coast#5240 |
+| Developer | Joe | KaKo#3766 | React, Onboading, Git |
+| Developer | Isaac | egglitty#9573 | JavaScript, React, Onboarding, System Architecture, Github |
+| Developer | Rick | constantRic#2670 | JavaScript, React, Backend |
+| TBD | Lucious | brotahman#7165 | React, Github, Onboarding |
+| Scrum Master | Trizz | TrizzIzBizy2#7686 |
diff --git a/docs/02-Onboarding.md b/docs/02-Onboarding.md
new file mode 100644
index 00000000..175a0824
--- /dev/null
+++ b/docs/02-Onboarding.md
@@ -0,0 +1,112 @@
+# New Developer Onboarding
+
+Welcome to Together! We're excited to have you and hope you'll find these resources helpful. If at any point there is some confusion, feel free to reach out in the thread in the [100Devs Discord](https://discord.com/channels/735923219315425401/1038482732633825442)
+
+## Onboarding resources:
+
+## Engineer Team Introduction
+
+Together is designed not only to create a product that provides value but to be an opportunity for learning and group experience. Together is open to all varying skill sets and encourages peer programming. Get started by following the instructions below and finding an issue that interests you!
+
+Once you've completed all the tasks below, please join us in Discord. We collaborate from the 100Devs discord and have a [group thread.](https://discord.com/channels/735923219315425401/1038482732633825442)
+
+## Tools, Accounts & Downloads
+
+-
GitHub account
+- Git installed and setup. Guide for [Mac](https://www.youtube.com/watch?v=hMEyBtsuAJE) & [Windows](https://www.youtube.com/watch?v=2j7fD92g-gE)
+- [Visual Studio Code](https://code.visualstudio.com/)
+- [Discord](https://discord.com/) & Joined [100 Devs](https://discord.gg/100devs)
+- [Compass **(Recommended)**](https://www.mongodb.com/products/compass) or similar MongoDB GUI if using `mongodb://127.0.0.1:27017/` as your DB_STRING
+- [MongoDB Account: **(Optional)**](https://www.mongodb.com/) Only required if not using Compass. You will need to change your DB_STRING `mongodb://127.0.0.1:27017/` as your DB_STRING (see [below](#env-template-setup))
+- [NodeJS](https://nodejs.org/en/download/)
+ - Together utilizes version 22.14.0. [fnm](https://github.com/Schniz/fnm) is a nice package for switching between versions.
+
+## Prerequisites
+
+Anyone is welcome to join Together. If you're a beginner, we ask that you review the documents below before joining an issue. The React Scrimba Course does not need to be completed, but having a basic understanding of React is heavily recommended.
+
+- [Git & GitHub Crash Course](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
+- [Completed Microsoft Introduction to Github](https://learn.microsoft.com/en-us/training/modules/introduction-to-github/?eventId=LearnwithLeonstream_ggNxpTZxIzb_&ocid=aid3038567)
+- [Read the Contributing Documents](https://github.com/Together-100Devs/Together/blob/main/.github/CONTRIBUTING.md)
+- [React Scrimba Course](https://scrimba.com/learn/learnreact)
+
+## Development Machine Setup
+
+- Fork the Together repo [(See contributing instructions.)](https://github.com/Together-100Devs/Together/tree/main/docs/04-Contributing.md)
+- Clone the forked repository to your local computer. [(See contributing instructions.)](https://github.com/Together-100Devs/Together/tree/main/docs/04-Contributing.md)
+- Complete and store `.env` file in the `server/` folder
+- Execute `node -v` and ensure you're on version 22.14.0. You can utilize [fnm](https://github.com/Schniz/fnm) to utilize 22.14.0.
+- Execute `npm install` in the root folder.
+- `npm run dev` in the root folder. This starts the front-end and back-end in one terminal.
+
+### .env template setup
+
+_Please copy and paste this template into a new .env file instead of removing .example from the `server/` folder_
+
+Keeping `DB_STRING` as `mongodb://127.0.0.1:27017/` will generate an instanced MongoDB in your local. To view your database, you can use
compass . You can also create a [MongoDB database](https://www.mongodb.com/basics/create-database#:~:text=In%20MongoDB%20Compass%2C%20you%20create,Click%20%22Create%20Database%22) on [MongoDB.com](https://www.mongodb.com/), but would need to update the `DB_String` to [connect to MongoDB.](https://www.mongodb.com/docs/compass/current/connect/)
+
+
+
+```
+# Please copy and paste this template into a new .env file instead of removing .example from the file name
+# Do not change PORT or OAUTH_REDIRECT_URL
+# DB_STRING will create a MongoDB instance on your computer but can be changed to a mongodb.com cluster
+PORT=2121
+DEV_DB_STRING=mongodb://127.0.0.1:27017/
+DB_STRING=mongodb://127.0.0.1:27017/
+DISCORD_CLIENT_ID=1039303417199345684
+DISCORD_CLIENT_SECRET=DISCORD_CLIENT_SECRET
+OAUTH_REDIRECT_URL=http://localhost:3000/
+MOCK_USER=true
+NODE_ENV=development
+ESLINT_NO_DEV_ERRORS=true
+```
+
+_`DISCORD_CLIENT_SECRET` is not required unless you need to test the discord login. `MOCK_USER=true` and `NODE_ENV=development` allow Together to generate a fake user `testuser#1234` for development purposes. If you need `DISCORD_CLIENT_SECRET` see below to set up one for yourself in the Discord Developer Portal_
+
+## Discord OAuth2 Setup
+
+You can create your own `DISCORD_CLIENT_ID` and `DISCORD_CLIENT_SECRET` by going to [Discord Developer Portal](https://discord.com/developers/docs/intro).
+
+Under **[OAuth2](https://discord.com/developers/docs/topics/oauth2)**
+
+- Set up Client Id and Client Secret [here](https://discord.com/developers/applications).
+- Click on New Application in the top-right corner.
+
+
+
+- After naming your app ("Together local", for example) navigate to 0Auth2 in the menu on the left.
+- Click "Add Redirect" and set to `http://localhost:2121/api/auth/discord/callback`.
+
+
+
+- Locate Client ID right above. Click "Reset Secret" button and enter your discord password to get secret. Make sure to copy both the `client id` and the `client secret`.
+
+
+
+- Update .env to:
+
+ ```
+ PORT=2121
+ DB_STRING=mongodb://127.0.0.1:27017/
+ DISCORD_CLIENT_ID=YOUR ID
+ DISCORD_CLIENT_SECRET=YOUR SECRET
+ OAUTH_REDIRECT_URL=http://localhost:3000/
+ MOCK_USER=false
+ NODE_ENV=development
+ ```
+
+To start the Test Event API, execute this command:
+
+- `npm run dev`
+
+Then open [localhost:3000](http://localhost:3000) and try to log in through Discord!
+
+
diff --git a/docs/03-Development-Process.md b/docs/03-Development-Process.md
new file mode 100644
index 00000000..657ee737
--- /dev/null
+++ b/docs/03-Development-Process.md
@@ -0,0 +1,123 @@
+# Development Process
+
+The application is developed using a modified GitHub-flow model. Changes are pulled into **main** branch which is also production. All features are developed in feature branches or directly into main branch.
+
+All branches must be named using the following conventions :
+
+- `feature/issue-{issue number}` : use for application new features
+- `bugfix/issue-{issue number}` : use for fixing application bugs / issues
+
+examples :
+
+- feature/issue-15469
+- bugfix/issue-15469
+
+Origin vs Upstream in a Forked GitHub Workflow:
+
+| Term | What it means | Typical URL example | Used for |
+| ------------ | ----------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------ |
+| **origin** | Your fork of the repository (remote on your GitHub account) | `https://github.com/your-username/together.git` | Pushing your rebased changes, creating PRs |
+| **upstream** | The original repository you forked from | `https://github.com/Together-100Devs/together.git` | Pulling the latest changes from the main project |
+
+Developers should follow the following steps :
+
+- Create a feature branch : `git checkout -b feature/issue-15469`
+- Develop the specified requirements
+- Commit locally:
+
+ - stage your chages: `git add .`
+ - commit your changes: `git commit -m "your commit message"`
+
+- It is generally advised to keep your branch consistently up to date with `main`.
+
+ - Grab the latest upstream version of main, in case main had changes: `git fetch upstream`
+
+ - upstream = grabbing all upstream branches (upstream/main, upstream/add-dependabot, ect)
+
+- Rebase your feature branch on top of the latest upstream/main. We're telling git to use the "main" branch from upstream as the new "base" for your feature branch `git rebase upstream/main`
+
+- To keep the commit history clean, we require that you squash your commits into a single commit using interactive rebase:
+
+ - This shows the list of commits since you branched off main, from oldest to newest `git log upstream/main..HEAD --reverse --oneline`
+ - grab the commit SHA of the very first commit you made on this branch ex: 5c42738
+ - interactive rebase just before that commit, ^ says start from the parent of that commit. This means it will start when you began your branch.
+
+ `git rebase -i ${your-commit-SHA}^`
+
+ ex: `git rebase -i 5c42738^`
+
+ - Your editor will open up with a list of commits (oldest first). New to using the vim editor? Look below for a cheatsheet. If you'd rather not use vim, you can set your Git editor to Visual Studio Code with the following command: `git config --global core.editor "code --wait"`
+
+ > pick c32423434 first commit
+ > pick af243df second commit
+ > pick 234asf45 third commit
+
+ - Keep the first commit as pick, change the rest of your commits to squash (or s):
+
+ > pick c32423434 first commit
+ > squash af243df second commit
+ > squash 234asf45 third commit
+
+ - Save and close the editor, you'll be prompted to edit the final commit message (which starts off as all of the previous messages combined)
+ - optional: `git log --oneline`: if you want to double check that it merged into one commit. Or go to the upper left side of VSCode and click source control to see the history.
+
+
+
+- Push the rebased branch for the first time to your fork: `git push -u origin feature/issue-15469`
+
+ - -u is just shorthand for --set-upstream
+ - Special note: If you've previously rebased and pushed this branch you'll need: `git push --force-with-lease`.
+ - Why? Because rebasing rewrites commit history so a regular push will be rejected.
+ - If this is your first push after rebasing (even if you've rebased multiple times locally), then a regular push is fine because there's no remote branch to conflict with.
+
+ - your souce control at this point will look like this:
+ 
+ - this is normal, when you do --force-with-lease it will turn into a straight line.
+
+ - When pushing for the 2nd+ time: Why use --force-with-lease instead of --force?
+
+| Command | What it does | Risk |
+| ----------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------- |
+| `git push --force` | Overwrites the remote branch with your local branch **no matter what** | Can erase other people’s commits if they pushed while you were working |
+| `git push --force-with-lease` | Overwrites the remote branch **only if** it still matches what you last pulled | Prevents overwriting new commits from others |
+
+- Raise a Pull request when the code meets **[Checklist](https://github.com/Together-100Devs/Together/blob/main/docs/pull_request_template.md)**
+- Ask one of the peers for the review
+- Address the required review comments
+- Merge will then be approved by a team member
+
+### PR Checklist
+
+- [ ] This PR is up to date with the main branch, and merge conflicts have been resolved
+- [ ] I have executed `npm run test-frontend` and all tests have passed successfully or I have included details within my PR on the failure
+- [ ] I have executed `npm run lint` and resolved any outstanding errors. Most issues can be solved by executing `npm run format`
+- [ ] My code follows the style guidelines of this project
+- [ ] I have performed a self-review of my own code
+- [ ] I have commented my code, particularly in hard-to-understand areas
+- [ ] My changes generate no new warnings
+
+### Merge Versus Rebase
+
+- If you're coming from a merge method background, this is the difference between the merge method flow versus rebase method flow
+ | **Merge Method** | **Rebase Method** |
+ | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | **1. Update branch**
`git fetch upstream`
`git merge upstream/main` | **1. Update branch**
`git fetch upstream`
`git rebase upstream/main` |
+ | | **2. Look at your commits & start interactive rebase**
`git log upstream/main..HEAD --reverse --oneline`
`git rebase -i ${your-commit-SHA}^` |
+ | **2. Push to your fork**
_First push:_
`git push -u origin feature/branch-name`
_Updates:_
`git push` | **3. Push to your fork**
_First push:_
`git push -u origin feature/branch-name`
_Updates after rebase:_
`git push --force-with-lease` |
+ | **3. Open a PR** against `upstream/main`
Merge commits are preserved in history. | **4. Open a PR** against `upstream/main`
Commit history is rewritten to be linear (no merge commits). |
+
+### Navigating In Vim
+
+1. Press i → enter insert mode (type/edit).
+
+2. Press Esc.
+
+3. Press shift then any of the following:
+
+- :wq → write/save and quit
+
+- :q! → quit without saving
+
+- dd → delete current line
+
+- :u → undo last change
diff --git a/docs/04-Contributing.md b/docs/04-Contributing.md
new file mode 100644
index 00000000..49398e19
--- /dev/null
+++ b/docs/04-Contributing.md
@@ -0,0 +1,255 @@
+# How to contribute
+
+Welcome to this Beginner-friendly instructional guide for individual contributors and team members working on the Together project!
+
+## Table of contents
+
+1. [How to get involved](#how-to-get-involved)
+2. [Prequisites](#prerequisites)
+3. [Together GitFlow structure](#together-gitflow-structure)
+4. [Finding issues to work on](#issues)
+5. [Editing code and submitting a pull request](#editing-code-and-submitting-a-pull-request)
+
+## How to get involved
+
+> Guess what! If you are already a member of 100Devs, one of us can personally walk you through all the steps you will need to contribute code to this project. Please send a message on Discord in the [Together discussion thread (external link)](https://discord.com/channels/735923219315425401/1038482732633825442). We will help you no matter what stage of learning you are on with whatever we can. We can assist you in looking for an issue to address, and if no issue exists that fits, we will create one. 🤠
+
+## Prerequisites
+
+Anyone is welcome to join Together. If you're a beginner, we ask that you review the documents below before joining an issue. The React Scribma Course does not need to be completed, but having a basic understanding of React is heavily recommended.
+
+- [Git & GitHub Crash Course](https://www.youtube.com/watch?v=SWYqp7iY_Tc)
+- [Completed Microsoft Introduction to Github](https://www.microsoft.com/en-us/dev-community/Event/Register?eventId=LearnwithLeonstream_ggNxpTZxIzb_&ocid=aid3038567)
+- [Read the Contributing Documents](https://github.com/Together-100Devs/Together/blob/main/.github/CONTRIBUTING.md)
+- [React Scrimba Course](https://scrimba.com/learn/learnreact)
+
+## Together GitFlow Structure
+
+This graph approximates the structure of the official repository and some example feature branches.
+
+```mermaid
+%% The graph doesn't render in the GitHub mobile app or in code editors.
+%% Enjoy this ASCII art instead.
+%%
+%% MVP v1.0
+%% main o--o------------o---o
+%% \ / /
+%% |\ / /
+%% a_new_feature | o--o--o /
+%% \ /
+%% another_feature o--o--o--o
+%%
+%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
+ 'commitLabelColor': '#ff0000',
+ 'commitLabelBackground': '#00ff00',
+ 'tagLabelFontSize': '16px'
+ } } }%%
+gitGraph
+ commit tag: "MVP"
+ commit
+ branch a_new_feature
+ branch another_feature
+ commit
+ checkout a_new_feature
+ commit
+ commit
+ checkout another_feature
+ checkout main
+ merge a_new_feature
+ checkout another_feature
+ commit
+ checkout main
+ merge another_feature
+ commit tag: "v1.0"
+```
+
+> 💡 (Don't be intimidated by this graph. It also confuses most of us.)
+
+We are currently using a GitHub-flow. GitHub-flow allows the production server to remain online and stable as contributors work on adding features and fixing bugs.
+
+The `main` branch is for stable production code. This branch is the working version and the main branch of the Together app.
+
+Multiple `feature` branches can be checked out from the `main` branch. These `feature` branches are tied to various issues and are used to add new code. When ready, The `feature` branches are tested and merged into the `main` branch.
+
+## Issues
+
+Together's progress and milestones are split into separate, distinct issues. You are encouraged to request issues you feel will present you with a moderate challenge or that you have a strong interest in. Contributors can request assignments for each issue they wish to work on, and multiple contributors may be assigned to single issues.
+
+> 💡 Issues tagged with `Good 100Devs First Try` are beginner-level issues that are great for fellow 100Devs.
+
+There are two ways to discover issues.
+
+### Issues Tab
+
+
+The [Issues tab](https://github.com/Together-100Devs/Together/issues) contains all of the issues that are currently in progress, planned to be worked on, or need further review.
+
+### Projects Tab
+
+## 
+
+
+A [project management board](https://github.com/users/Caleb-Cohen/projects/1) also exists for this project on GitHub. The project management board contains relevant issues to advance the project to the next milestone or release.
+
+> Issues will also be created for any bugs discovered in the project. (Minor fixes and typos do not typically require an issue and can be corrected directly in a pull request with a detailed description.)
+
+## Editing code and submitting a pull request
+
+Use the following process to make changes after an issue has been assigned to you.
+
+### Forking, cloning, editing, pushing.
+
+#### Forking
+
+1. Navigate to the [Together Project](https://github.com/Together-100Devs/Together).
+2. Click Fork. [Difference between forking and cloning a repo](https://www.youtube.com/watch?v=6YQxkxw8nhE)
+ 
+3. Click Create fork.
+ 
+
+> 💡 Your new fork will include the `main` branch as the default branch.
+
+#### Cloning your fork
+
+Now that you have a personal fork of the project on GitHub, you will be able to clone the fork to your computer. These instructions will cover cloning using the HTTPS Personal access token method.
+
+1. On GitHub, navigate to your fork of the Together repository.
+
+2. Above the list of files, click Code.
+ 
+
+3. Click the clipboard icon to copy the URL for the repository.
+ 
+
+4. Open a terminal on your system.
+
+5. Navigate to the directory where you want to clone the files.
+
+6. Type `git clone`, and then paste the URL you copied earlier. It will look like this, with your GitHub username instead of YOUR-USERNAME:
+
+`$ git clone https://github.com/YOUR-USERNAME/Together`
+
+7. Press Enter. A clone will be created on your local computer.
+
+#### Branching
+
+Now that you have the copy, you will need access to the feature branch related to your issue to create a local working branch to write your code.
+
+1. Set upstream to track the remote repository containing the original repo. (Not just your fork.)
+ `git remote add upstream https://github.com/Together-100Devs/Together.git`
+
+2. Use this command to fetch the list of remote branches.
+ `git fetch upstream`
+
+3. Checkout the feature branch appropriate for the issue you are working on.
+ `git checkout
`
+
+> 💡 The error `error: pathspec '<branchname>' did not match any file(s) known to git` usually means you mistyped the branch name. Try again using auto tab completion to fill out the correct branch name.
+
+You now have the code and are in the correct feature branch, but before making changes to the project, you should create a new unique branch and check it out. This branch will exist on your local machine and be pushed to your fork on GitHub. Later you will be able to create a Pull Request with this branch.
+
+4. Create and checkout a branch for the task you are working on.
+
+ `git checkout -b branch-name`
+
+ Name your branch using the following conventions based on the type of issue you're working on :
+
+ `feature/issue-{issue number}` : for issues with the 'enhancement' label
+ `bugfix/issue-{issue number}` : for issues with the 'bug' label
+
+5. Make any changes, save your work, and make necessary commits.
+
+ `git status` verify what has changed.
+
+ `git add .` stage your files.
+
+ `git commit -m "fixed a thingy"` perform the commit.
+
+6. Execute testing to ensure your code fits code standards and compliance
+
+ `npm run lint`
+
+ `npm run test-frontend` or `npm dev-frontend-tests`\*
+
+ - Review [Testing Docs Page](https://github.com/Together-100Devs/Together/tree/main/docs/06-Testing) for more information on how testing works.
+
+7. Rebase your work before pushing.
+
+ `git fetch upstream main` : get the latest updates from the original repo's main branch.
+
+ `git rebase upstream/main` : rebase your feature branch on top of the latest upstream/main changes. Upstream is now the new "base" for your feature branch to sit on top of,
+
+8. Squash your commits into a single commit with interactive rebase:
+
+ `git log upstream/main..HEAD --reverse --oneline`: view all the commits in your current branch, since you branched off of upstream/main (oldest first).
+
+ - grab the commit of the very first commit you made
+
+ `git rebase -i ${your-commit-SHA}^`: interactive rebase just before that commit, ^ says start from the parent of that commit (your branch's creation).
+
+You want to change all but the first from pick to squash:
+
+> pick c32423434 first commit
+> squash af243df second commit
+
+Save and close the editor, you'll be prompted to edit the final commit message (which starts off as all of the previous messages combined).
+
+optional: `git log --oneline`: if you want to double check that it merged into one commit. Or on upper left side of VSCode click on source control to see the history (the icon with 3 circles, connected by 2 lines)
+
+9. Push the changes to your fork on GitHub.
+
+ Typing `git push` will not work by itself but will show you what command you need to enter. An example shorthand of that command is:
+ `git push -u origin a-descriptive-branch-name`
+ `-u` is just shorthand for `--set-upstream`
+ Which will push the code from your local device to the correct branch origin (your GitHub fork.)
+
+ `git push --force-with-lease`: if you already pushed before, you'll need this command. This updates the branch on your fork to match your rebased history.
+
+10. You must head back to GitHub.com to create a pull request.
+
+#### Pull requests
+
+1. Visit your fork on GitHub, and a new button should appear, allowing you to create the pull request
+
+ 
+
+2. Write a description describing the changes you made, then click "Create pull request"
+
+ 
+
+> 💡 You can link your PR back to the issue it addresses by mentioning the issue ID number in the description box. Include a "closing" keyword if your PR completely resolves the issue mentioned GitHub will automatically close the issue upon merging the PR.
+
+3. A maintainer will review and test your changes and suggest edits if neccesary.
+
+> 💡 If you make your edits in your branch and commit/push, your pull request in github will automatically update to include that commit.
+
+4. Once everything is good your code will be merged. 👍
+
+
+
+#### Syncing your fork on GitHub
+
+
+
+Keep your fork up to date after any pull requests are merged by clicking on "Sync fork" on your forked repository. This will help avoid merge conflicts the next time you submit a pull request.
diff --git a/docs/05-Architecture.md b/docs/05-Architecture.md
new file mode 100644
index 00000000..c3c37fca
--- /dev/null
+++ b/docs/05-Architecture.md
@@ -0,0 +1,31 @@
+# Together Software Architecture
+
+We plan to build the application using MERN.
+
+## Architecture Diagram
+
+
+
+## File Layout
+
+We are loosely based of the [Bullet Proof React Project Structure](https://github.com/alan2207/bulletproof-react/blob/master/docs/project-structure.md)
+
+## Extra Resources!
+
+- [Clean Code Javascript](https://github.com/ryanmcdermott/clean-code-javascript)
+- [Naming Cheatsheet](https://github.com/kettanaito/naming-cheatsheet)
+
+## Technologies
+
+The list of technologies we will use to build the application is as follows:
+
+| Technology | Purpose | Version |
+| ---------- | ------------------- | --------- |
+| [MongoDB] | [Database] | [3.6.5] |
+| [Express] | [Node.js Framework] | [4.17.1] |
+| [React] | [Frontend] | [18.2.0] |
+| [Node.js] | [Backend Framework] | [16.16.0] |
+
+## Non-functional Requirements
+
+WIP
diff --git a/docs/06-Testing.md b/docs/06-Testing.md
new file mode 100644
index 00000000..39038213
--- /dev/null
+++ b/docs/06-Testing.md
@@ -0,0 +1,160 @@
+# Testing
+
+### Summary
+
+We utilize testing to aid in the review process. Cypress is used for the code coverage, and Nock for intercepting Discord OAuth2 requests.
+
+### Setup and Configuration
+
+After forking Together and pulling it into your local dev environment, testing is ready right after `npm install` is executed. To run a test you have two options `npm run test-frontend` or `npm run dev-frontend-tests` the main difference being `dev-frontend-tests` allows you to view Together as the test is running to debug any issues.
+
+executing `test-frontend` will start the tests immediately. `dev-frontend-test` require some simple but additional setup. To utilize `dev-frontend-test`
+
+- Execute `npm run dev-frontend-test`
+- Select E2E testing
+- Select a preferred browser
+- Run specs
+
+
+
+
+
+### How Mocking Works
+
+Mocking is necessary for testing because we need a way to send and receive data to mimic OAuth2. Here is a diagram of how Together uses Discord's OAuth2 login in production:
+
+```mermaid
+sequenceDiagram
+ participant C as Client
+ participant S as Server
+ participant D as Discord
+ autonumber
+ note right of C: Click Login
+ C ->> S: /auth/discord
+ activate S
+ S ->> D: /oauth2/authorize
+ activate D
+ deactivate S
+ note right of S: Redirect
+ D -->> S: /auth/discord/callback?code=CODE
+ deactivate D
+ activate S
+ note left of D: Click Authorize
+ S ->> D: /api/oauth2/token
+ activate D
+ deactivate S
+ D -->> S: Access & Refresh tokens
+ activate S
+ deactivate D
+ S ->> D: /api/users/@me
+ deactivate S
+ activate D
+ D -->> S: Profile Info
+ activate S
+ deactivate D
+ S ->> D: /api/users/@me/guilds
+ deactivate S
+ activate D
+ D -->> S: Joined Guilds array
+ activate S
+ deactivate D
+ note over S: DiscordStrategy
+ note left of S: Session Created
+ S ->> C: Homepage
+ deactivate S
+```
+
+The most crucial difference is that running the server in `test` mode is request made to the real Disord API will be intercepted by `nock` and mocked with appropriate responses. Testing environment diagram is shown below. For more information on mocking please checkout [@RascalTwo's PR for testing](https://github.com/Caleb-Cohen/Together/pull/319)
+
+```mermaid
+sequenceDiagram
+ participant C as Client
+ participant S as Server
+ participant N as nock
+ participant CY as Cypress
+ autonumber
+ note right of C: Click Login
+ C ->> S: /auth/discord
+ activate S
+ S ->> CY: /oauth2/authorize
+ deactivate S
+ activate CY
+ note right of S: Redirect
+ CY -->> S: /auth/discord/callback?code=CUSTOM_CODE
+ deactivate CY
+ activate S
+ S ->> N: /api/oauth2/token
+ deactivate S
+ activate N
+ N -->> S: Mock Access & Refresh tokens
+ deactivate N
+ activate S
+ S ->> N: /api/users/@me/
+ deactivate S
+ activate N
+ N -->> S: Mock Profile Info
+ deactivate N
+ activate S
+ S ->> N: /api/users/@me/guilds
+ deactivate S
+ activate N
+ N -->> S: Mock Guilds array
+ deactivate N
+ activate S
+ note over S: DiscordStrategy
+ note left of S: Session Created
+ S ->> C: Homepage
+ deactivate S
+```
+
+### File Explanations
+
+Utilizing Cypress has a brought in a fair bit of new files. Here's an explanation on their purposes.
+
+- [`cypress.config.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress.config.js.js)
+ - Mostly the configuration for Cypress, including the base URL, some flags, and custom task functions.
+ - `clearDatabase`
+ - Clears the connected MongoDB database.
+ - `createEvent`
+ - Creates a new Event document.
+ - `generateObjectId`
+ - Generates a new ObjectId.
+- `cypress`
+ - `videos` & `screenshots`
+ - Videos & screenshots that are generated when running the tests, are ignored by git.
+ - `support`
+ - [`e2e.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/support/e2e.js)
+ - Imports the code-coverage logic, and custom commands, and adds a custom `beforeEach` hook to reset the database before each test and visit the homepage.
+ - [`functions.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/support/functions.js)
+ - Helper functions, mostly for dealing with dates.
+ - [`commands.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/support/commands.js)
+ - `login`
+ - Login to the backend using the provided user code.
+ - `createOwnEvents`
+ - Create a number of events for the user code provided.
+ - [`tgt.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/support/tgt.js)
+ - A collection of component-scoped actions & queries for Together as a whole.
+ - This makes the actual tests more readable, additionally allowing for any updates to a single component in the future to be made in one place.
+ - `e2e`
+ - [`auth.cy.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/e2e/auth.cy.js)
+ - 100Dev members can log in and come back
+ - Outsiders aren't logged in and are shown a rejection
+ - All login/logout buttons work
+ - [`landing.cy.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/e2e/landing.cy.js)
+ - Links
+ - Hamburger menu
+ - [`calendar.cy.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/e2e/calendar.cy.js)
+ - Links
+ - Accessible via the calendar button
+ - Guest users can't create events
+ - Current day is highlighted
+ - Month is changeable via buttons & scrolling
+ - Only shows events for the current month
+ - [`view-event-modal.cy.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/e2e/view-event-modal.cy.js)
+ - Event models are shown when clicking on an event
+ - Non-authors of events can't see the delete buttons
+ - Authors can delete individual & all recurring events
+ - [`create-event-form.cy.js`](https://github.com/RascalTwo/Together/blob/13a12608feda04d7599e2a996490af594f6d945d/cypress/e2e/create-event-form.cy.js)
+ - The event creation form is accessible and prevents any invalid submissions
+ - The expected network requests are made to the backend
+ - Created events are instantly shown on the calendar
diff --git a/docs/07-Design-Docs.md b/docs/07-Design-Docs.md
new file mode 100644
index 00000000..3ba36885
--- /dev/null
+++ b/docs/07-Design-Docs.md
@@ -0,0 +1,13 @@
+# Design Docs
+
+This folder is for storing any design document that you will create while developing the project.
+
+You can also view the design discussions at https://github.com/Together-100Devs/Together/discussions/17
+
+> A technical specification document outlines how you’re going to address a technical problem by designing and building a solution for it. It’s sometimes also referred to as a technical design document, a software design document, or an engineering design document. It’s often written by the engineer who will build the solution or be the point person during implementation, but for larger projects, it can be written by technical leads, project leads, or senior engineers. These documents show the engineer’s team and other stakeholders what the design, work involved, impact, and timeline of a feature, project, program, or service will be.
+
+
diff --git a/docs/08-Troubleshooting.md b/docs/08-Troubleshooting.md
new file mode 100644
index 00000000..346210ef
--- /dev/null
+++ b/docs/08-Troubleshooting.md
@@ -0,0 +1,34 @@
+# Operating System Issue
+
+
+ Mac
+
+
+ Issue 1
+
+
+
+
+
+
+ Windows
+
+
+ MongoMemoryServer Instance failed
+
+ - Change DB_STRING in `.env` from `mongodb://127.0.0.1:27017/` to a Mongo DB atlas string.
+
+
+
+ Tests are not working
+
+ - Resolution: Test can be run on Github. There is a known incompatibility with cypress and Windows with WSL.
+
+
+
+
+
+ Linux
+
+
+ Issue 1 {children};
+}
+```
+
+3. Basic Story File
+
+```jsx
+// Button.stories.jsx
+
+import Button from "./Button";
+
+export default {
+ title: "Components/Button", // How it appears in Storybook sidebar
+ component: Button,
+};
+
+export const Primary = () => Click me ;
+
+export const Secondary = () => Cancel ;
+
+export const WithLongText = () => Submit your application here ;
+```
diff --git a/docs/images/discord-client-secret.JPG b/docs/images/discord-client-secret.JPG
new file mode 100644
index 00000000..dc452ce4
Binary files /dev/null and b/docs/images/discord-client-secret.JPG differ
diff --git a/docs/images/discord-oauth-new-application-button.JPG b/docs/images/discord-oauth-new-application-button.JPG
new file mode 100644
index 00000000..529669c3
Binary files /dev/null and b/docs/images/discord-oauth-new-application-button.JPG differ
diff --git a/docs/images/discord-redirect-button.jpg b/docs/images/discord-redirect-button.jpg
new file mode 100644
index 00000000..bb90a78e
Binary files /dev/null and b/docs/images/discord-redirect-button.jpg differ
diff --git a/package-lock.json b/package-lock.json
index 2ac48462..45a736c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "Together",
+ "name": "together",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "Together",
+ "name": "together",
"version": "1.0.0",
"license": "MIT",
"workspaces": [
@@ -16,7 +16,7 @@
"@cypress/code-coverage": "^3.14.1",
"concurrently": "^7.5.0",
"cross-env": "^7.0.3",
- "cypress": "^12.2.0",
+ "cypress": "^14.5.1",
"eslint": "^8.27.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-cypress": "^2.12.1",
@@ -44,14 +44,12 @@
},
"devDependencies": {
"@storybook/react-vite": "^9.0.12",
+ "@tailwindcss/vite": "^4.1.10",
"@vitejs/plugin-react": "^4.4.1",
- "autoprefixer": "^10.4.13",
"axios": "^1.1.3",
- "http-proxy-middleware": "^2.0.6",
- "postcss": "^8.4.18",
"prop-types": "^15.8.1",
"storybook": "^9.0.12",
- "tailwindcss": "^3.2.2",
+ "tailwindcss": "^4.1.10",
"vite": "^6.3.5",
"vite-plugin-istanbul": "^7.0.0"
}
@@ -64,13 +62,14 @@
"license": "MIT"
},
"node_modules/@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.1.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
"node": ">=6.0.0"
@@ -156,21 +155,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz",
@@ -1904,16 +1888,6 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true
},
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
"node_modules/@cypress/code-coverage": {
"version": "3.14.1",
"resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.14.1.tgz",
@@ -1987,10 +1961,11 @@
}
},
"node_modules/@cypress/request": {
- "version": "2.88.11",
- "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz",
- "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==",
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
+ "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -1998,16 +1973,16 @@
"combined-stream": "~1.0.6",
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "http-signature": "~1.3.6",
+ "form-data": "~4.0.0",
+ "http-signature": "~1.4.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
"mime-types": "~2.1.19",
"performance-now": "^2.1.0",
- "qs": "~6.10.3",
+ "qs": "6.14.0",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
+ "tough-cookie": "^5.0.0",
"tunnel-agent": "^0.6.0",
"uuid": "^8.3.2"
},
@@ -2015,55 +1990,17 @@
"node": ">= 6"
}
},
- "node_modules/@cypress/request/node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/@cypress/request/node_modules/qs": {
- "version": "6.10.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
- "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==",
- "dev": true,
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/@cypress/request/node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
+ "tldts": "^6.1.32"
},
"engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/@cypress/request/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
+ "node": ">=16"
}
},
"node_modules/@cypress/webpack-preprocessor": {
@@ -2773,6 +2710,19 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -3668,16 +3618,14 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.11.tgz",
+ "integrity": "sha512-C512c1ytBTio4MrpWKlJpyFHT6+qfFL8SZ58zBzJ1OOzUEjHeF1BtjY2fH7n4x/g2OV/KiiMLAivOp1DXmiMMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
- },
- "engines": {
- "node": ">=6.0.0"
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@jridgewell/resolve-uri": {
@@ -3689,16 +3637,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@jridgewell/source-map": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
@@ -3711,22 +3649,6 @@
"@jridgewell/trace-mapping": "^0.3.25"
}
},
- "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
- "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
@@ -3824,6 +3746,18 @@
"tslib": "^2.3.1"
}
},
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -3859,6 +3793,15 @@
"node": ">= 8"
}
},
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
+ "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -4460,127 +4403,404 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@testing-library/dom": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
- "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
+ "node_modules/@tailwindcss/node": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz",
+ "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=18"
+ "@ampproject/remapping": "^2.3.0",
+ "enhanced-resolve": "^5.18.1",
+ "jiti": "^2.4.2",
+ "lightningcss": "1.30.1",
+ "magic-string": "^0.30.17",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.1.11"
}
},
- "node_modules/@testing-library/jest-dom": {
- "version": "6.6.3",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz",
- "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==",
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz",
+ "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "chalk": "^3.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "lodash": "^4.17.21",
- "redent": "^3.0.0"
+ "detect-libc": "^2.0.4",
+ "tar": "^7.4.3"
},
"engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/@testing-library/jest-dom/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-arm64": "4.1.11",
+ "@tailwindcss/oxide-darwin-x64": "4.1.11",
+ "@tailwindcss/oxide-freebsd-x64": "4.1.11",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.11",
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.11",
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.11",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.11"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz",
+ "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">= 10"
}
},
- "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz",
+ "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
},
- "node_modules/@testing-library/user-event": {
- "version": "14.6.1",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
- "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==",
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz",
+ "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=12",
- "npm": ">=6"
- },
- "peerDependencies": {
- "@testing-library/dom": ">=7.21.4"
+ "node": ">= 10"
}
},
- "node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz",
+ "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">= 6"
+ "node": ">= 10"
}
},
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz",
+ "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
"license": "MIT",
- "peer": true
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
},
- "node_modules/@types/babel__core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
- "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz",
+ "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "@babel/parser": "^7.20.7",
- "@babel/types": "^7.20.7",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@types/babel__generator": {
- "version": "7.6.4",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
- "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz",
+ "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.0.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
}
},
- "node_modules/@types/babel__template": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
- "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz",
+ "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz",
+ "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz",
+ "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@emnapi/wasi-threads": "^1.0.2",
+ "@napi-rs/wasm-runtime": "^0.2.11",
+ "@tybys/wasm-util": "^0.9.0",
+ "tslib": "^2.8.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz",
+ "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz",
+ "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz",
+ "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.1.11",
+ "@tailwindcss/oxide": "4.1.11",
+ "tailwindcss": "4.1.11"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7"
+ }
+ },
+ "node_modules/@testing-library/dom": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@testing-library/jest-dom": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz",
+ "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@adobe/css-tools": "^4.4.0",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "lodash": "^4.17.21",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@testing-library/user-event": {
+ "version": "14.6.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz",
+ "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/aria-query": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
+ "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+ "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
+ "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
"dev": true,
"dependencies": {
"@babel/parser": "^7.1.0",
@@ -4596,18 +4816,6 @@
"@babel/types": "^7.3.0"
}
},
- "node_modules/@types/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
"node_modules/@types/bson": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz",
@@ -4616,17 +4824,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/doctrine": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
@@ -4665,33 +4862,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/express": {
- "version": "4.17.16",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz",
- "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.31",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.33",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
- "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
"node_modules/@types/graceful-fs": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
@@ -4701,15 +4871,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/http-proxy": {
- "version": "1.17.9",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
- "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
@@ -4742,14 +4903,6 @@
"license": "MIT",
"peer": true
},
- "node_modules/@types/mime": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
- "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/@types/mongodb": {
"version": "3.6.20",
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz",
@@ -4770,22 +4923,6 @@
"integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
"dev": true
},
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
"node_modules/@types/resolve": {
"version": "1.20.6",
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz",
@@ -4793,18 +4930,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "@types/mime": "*",
- "@types/node": "*"
- }
- },
"node_modules/@types/sinonjs__fake-timers": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
@@ -5191,29 +5316,6 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/acorn-node": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
- "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
- "dev": true,
- "dependencies": {
- "acorn": "^7.0.0",
- "acorn-walk": "^7.0.0",
- "xtend": "^4.0.2"
- }
- },
- "node_modules/acorn-node/node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/acorn-walk": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
@@ -5420,12 +5522,6 @@
"integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
"dev": true
},
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "dev": true
- },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -5507,13 +5603,14 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true
+ "license": "MIT"
},
"node_modules/asn1": {
"version": "0.2.6",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
"integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"safer-buffer": "~2.1.0"
}
@@ -5523,6 +5620,7 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8"
}
@@ -5577,49 +5675,15 @@
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.13",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz",
- "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- }
- ],
- "dependencies": {
- "browserslist": "^4.21.4",
- "caniuse-lite": "^1.0.30001426",
- "fraction.js": "^4.2.0",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
"engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
+ "node": ">= 4.0.0"
}
},
"node_modules/available-typed-arrays": {
@@ -5639,25 +5703,27 @@
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "*"
}
},
"node_modules/aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/axios": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
- "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
+ "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
"dev": true,
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
+ "form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
@@ -6039,6 +6105,7 @@
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"tweetnacl": "^0.14.3"
}
@@ -6056,15 +6123,6 @@
"node": ">=12.0.0"
}
},
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/bl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
@@ -6086,10 +6144,11 @@
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
},
"node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -6298,15 +6357,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/caniuse-lite": {
"version": "1.0.30001717",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz",
@@ -6332,7 +6382,8 @@
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0"
},
"node_modules/chai": {
"version": "5.2.0",
@@ -6395,43 +6446,14 @@
"node": ">= 0.8.0"
}
},
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
"dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
"node_modules/chrome-trace-event": {
@@ -6488,10 +6510,11 @@
}
},
"node_modules/cli-table3": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
- "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
+ "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"string-width": "^4.2.0"
},
@@ -6499,7 +6522,7 @@
"node": "10.* || >= 12.*"
},
"optionalDependencies": {
- "@colors/colors": "1.5.0"
+ "colors": "1.4.0"
}
},
"node_modules/cli-truncate": {
@@ -6620,11 +6643,21 @@
"integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==",
"dev": true
},
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
"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==",
- "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -6632,6 +6665,16 @@
"node": ">= 0.8"
}
},
+ "node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/common-path-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
@@ -6656,10 +6699,13 @@
"dev": true
},
"node_modules/component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/concat-map": {
"version": "0.0.1",
@@ -6762,15 +6808,16 @@
}
},
"node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
},
"node_modules/cookiejar": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
- "dev": true
+ "license": "MIT"
},
"node_modules/core-js-compat": {
"version": "3.42.0",
@@ -6832,18 +6879,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/cssom": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
@@ -6869,27 +6904,28 @@
"dev": true
},
"node_modules/cypress": {
- "version": "12.6.0",
- "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.6.0.tgz",
- "integrity": "sha512-WdHSVaS1lumSd5XpVTslZd8ui9GIGphrzvXq9+3DtVhqjRZC5M70gu5SW/Y/SLPq3D1wiXGZoHC6HJ7ESVE2lw==",
+ "version": "14.5.1",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-14.5.1.tgz",
+ "integrity": "sha512-vYBeZKW3UAtxwv5mFuSlOBCYhyO0H86TeDKRJ7TgARyHiREIaiDjeHtqjzrXRFrdz9KnNavqlm+z+hklC7v8XQ==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "@cypress/request": "^2.88.10",
+ "@cypress/request": "^3.0.8",
"@cypress/xvfb": "^1.2.4",
- "@types/node": "^14.14.31",
"@types/sinonjs__fake-timers": "8.1.1",
"@types/sizzle": "^2.3.2",
"arch": "^2.2.0",
"blob-util": "^2.0.2",
"bluebird": "^3.7.2",
- "buffer": "^5.6.0",
+ "buffer": "^5.7.1",
"cachedir": "^2.3.0",
"chalk": "^4.1.0",
"check-more-types": "^2.24.0",
+ "ci-info": "^4.1.0",
"cli-cursor": "^3.1.0",
- "cli-table3": "~0.6.1",
- "commander": "^5.1.0",
+ "cli-table3": "0.6.1",
+ "commander": "^6.2.1",
"common-tags": "^1.8.0",
"dayjs": "^1.10.4",
"debug": "^4.3.4",
@@ -6901,20 +6937,22 @@
"figures": "^3.2.0",
"fs-extra": "^9.1.0",
"getos": "^3.2.1",
- "is-ci": "^3.0.0",
+ "hasha": "5.2.2",
"is-installed-globally": "~0.4.0",
"lazy-ass": "^1.6.0",
"listr2": "^3.8.3",
"lodash": "^4.17.21",
"log-symbols": "^4.0.0",
- "minimist": "^1.2.6",
+ "minimist": "^1.2.8",
"ospath": "^1.2.2",
"pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
"proxy-from-env": "1.0.0",
"request-progress": "^3.0.0",
- "semver": "^7.3.2",
+ "semver": "^7.7.1",
"supports-color": "^8.1.1",
- "tmp": "~0.2.1",
+ "tmp": "~0.2.3",
+ "tree-kill": "1.2.2",
"untildify": "^4.0.0",
"yauzl": "^2.10.0"
},
@@ -6922,21 +6960,31 @@
"cypress": "bin/cypress"
},
"engines": {
- "node": "^14.0.0 || ^16.0.0 || >=18.0.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
}
},
- "node_modules/cypress/node_modules/@types/node": {
- "version": "14.18.36",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz",
- "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==",
- "dev": true
- },
"node_modules/cypress/node_modules/bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true
},
+ "node_modules/cypress/node_modules/ci-info": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cypress/node_modules/cli-truncate": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
@@ -6953,15 +7001,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cypress/node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/cypress/node_modules/execa": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
@@ -7051,18 +7090,6 @@
}
}
},
- "node_modules/cypress/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/cypress/node_modules/proxy-from-env": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
@@ -7070,13 +7097,11 @@
"dev": true
},
"node_modules/cypress/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -7113,17 +7138,12 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/cypress/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0"
},
@@ -7278,20 +7298,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/defined": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
- "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -7328,8 +7338,6 @@
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"dev": true,
"license": "Apache-2.0",
- "optional": true,
- "peer": true,
"engines": {
"node": ">=8"
}
@@ -7343,39 +7351,16 @@
"node": ">=8"
}
},
- "node_modules/detective": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
- "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
- "dev": true,
- "dependencies": {
- "acorn-node": "^1.8.2",
- "defined": "^1.0.0",
- "minimist": "^1.2.6"
- },
- "bin": {
- "detective": "bin/detective.js"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/dezalgo": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
"integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
- "dev": true,
+ "license": "ISC",
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true
- },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -7389,12 +7374,6 @@
"node": ">=8"
}
},
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true
- },
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -7461,6 +7440,7 @@
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
@@ -7520,7 +7500,6 @@
"integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@@ -7636,14 +7615,15 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
- "dev": true,
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -8124,12 +8104,6 @@
"integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
"dev": true
},
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true
- },
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
@@ -8248,15 +8222,16 @@
}
},
"node_modules/express-session": {
- "version": "1.17.3",
- "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
- "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
+ "version": "1.18.2",
+ "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz",
+ "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==",
+ "license": "MIT",
"dependencies": {
- "cookie": "0.4.2",
- "cookie-signature": "1.0.6",
+ "cookie": "0.7.2",
+ "cookie-signature": "1.0.7",
"debug": "2.6.9",
"depd": "~2.0.0",
- "on-headers": "~1.0.2",
+ "on-headers": "~1.1.0",
"parseurl": "~1.3.3",
"safe-buffer": "5.2.1",
"uid-safe": "~2.1.5"
@@ -8265,18 +8240,11 @@
"node": ">= 0.8.0"
}
},
- "node_modules/express-session/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/express-session/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -8284,7 +8252,8 @@
"node_modules/express-session/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
},
"node_modules/express/node_modules/accepts": {
"version": "2.0.0",
@@ -8379,21 +8348,6 @@
"node": ">= 0.6"
}
},
- "node_modules/express/node_modules/qs": {
- "version": "6.14.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/express/node_modules/raw-body": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
@@ -8427,7 +8381,8 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/extract-zip": {
"version": "2.0.1",
@@ -8471,7 +8426,8 @@
"dev": true,
"engines": [
"node >=0.6.0"
- ]
+ ],
+ "license": "MIT"
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
@@ -8530,7 +8486,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
- "dev": true
+ "license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.0.6",
@@ -8742,18 +8698,21 @@
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "*"
}
},
"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==",
- "dev": true,
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -8761,15 +8720,17 @@
}
},
"node_modules/formidable": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
- "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
- "dev": true,
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
+ "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
+ "license": "MIT",
"dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
"dezalgo": "^1.0.4",
- "hexoid": "^1.0.0",
- "once": "^1.4.0",
- "qs": "^6.11.0"
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
},
"funding": {
"url": "https://ko-fi.com/tunnckoCore/commissions"
@@ -8783,19 +8744,6 @@
"node": ">= 0.6"
}
},
- "node_modules/fraction.js": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz",
- "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==",
- "dev": true,
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://www.patreon.com/infusion"
- }
- },
"node_modules/framer-motion": {
"version": "8.5.2",
"resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.5.2.tgz",
@@ -9005,6 +8953,7 @@
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0"
}
@@ -9218,12 +9167,12 @@
}
},
"node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
+ "has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -9269,15 +9218,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hexoid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
- "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/hey-listen": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
@@ -9306,28 +9246,14 @@
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dev": true,
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
},
"engines": {
- "node": ">=8.0.0"
+ "node": ">= 0.8"
}
},
"node_modules/http-proxy-agent": {
@@ -9344,39 +9270,16 @@
"node": ">= 6"
}
},
- "node_modules/http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
- "dev": true,
- "dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
- },
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
"node_modules/http-signature": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz",
- "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"jsprim": "^2.0.2",
- "sshpk": "^1.14.1"
+ "sshpk": "^1.18.0"
},
"engines": {
"node": ">=0.10"
@@ -9582,18 +9485,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@@ -9622,18 +9513,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-core-module": {
"version": "2.16.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
@@ -9782,18 +9661,6 @@
"node": ">=8"
}
},
- "node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
@@ -9951,7 +9818,8 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/istanbul-lib-coverage": {
"version": "3.2.0",
@@ -10019,15 +9887,6 @@
"node": ">=8"
}
},
- "node_modules/istanbul-lib-processinfo/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
"node_modules/istanbul-lib-report": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
@@ -11505,26 +11364,12 @@
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
- "node_modules/jest-snapshot/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -11532,12 +11377,6 @@
"node": ">=10"
}
},
- "node_modules/jest-snapshot/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/jest-validate": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
@@ -11684,8 +11523,6 @@
"integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
"dev": true,
"license": "MIT",
- "optional": true,
- "peer": true,
"bin": {
"jiti": "lib/jiti-cli.mjs"
}
@@ -11730,7 +11567,8 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/jsdom": {
"version": "16.7.0",
@@ -11779,14 +11617,17 @@
}
},
"node_modules/jsdom/node_modules/form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz",
+ "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.35"
},
"engines": {
"node": ">= 6"
@@ -11815,7 +11656,8 @@
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
"integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
@@ -11867,6 +11709,7 @@
"engines": [
"node >=0.6.0"
],
+ "license": "MIT",
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
@@ -11934,13 +11777,11 @@
}
},
"node_modules/lightningcss": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz",
- "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
+ "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
"dev": true,
"license": "MPL-2.0",
- "optional": true,
- "peer": true,
"dependencies": {
"detect-libc": "^2.0.3"
},
@@ -11952,22 +11793,22 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "lightningcss-darwin-arm64": "1.29.2",
- "lightningcss-darwin-x64": "1.29.2",
- "lightningcss-freebsd-x64": "1.29.2",
- "lightningcss-linux-arm-gnueabihf": "1.29.2",
- "lightningcss-linux-arm64-gnu": "1.29.2",
- "lightningcss-linux-arm64-musl": "1.29.2",
- "lightningcss-linux-x64-gnu": "1.29.2",
- "lightningcss-linux-x64-musl": "1.29.2",
- "lightningcss-win32-arm64-msvc": "1.29.2",
- "lightningcss-win32-x64-msvc": "1.29.2"
+ "lightningcss-darwin-arm64": "1.30.1",
+ "lightningcss-darwin-x64": "1.30.1",
+ "lightningcss-freebsd-x64": "1.30.1",
+ "lightningcss-linux-arm-gnueabihf": "1.30.1",
+ "lightningcss-linux-arm64-gnu": "1.30.1",
+ "lightningcss-linux-arm64-musl": "1.30.1",
+ "lightningcss-linux-x64-gnu": "1.30.1",
+ "lightningcss-linux-x64-musl": "1.30.1",
+ "lightningcss-win32-arm64-msvc": "1.30.1",
+ "lightningcss-win32-x64-msvc": "1.30.1"
}
},
"node_modules/lightningcss-darwin-arm64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz",
- "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
+ "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
"cpu": [
"arm64"
],
@@ -11977,7 +11818,6 @@
"os": [
"darwin"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -11987,9 +11827,9 @@
}
},
"node_modules/lightningcss-darwin-x64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz",
- "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
+ "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
"cpu": [
"x64"
],
@@ -11999,7 +11839,6 @@
"os": [
"darwin"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12009,9 +11848,9 @@
}
},
"node_modules/lightningcss-freebsd-x64": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz",
- "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
+ "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
"cpu": [
"x64"
],
@@ -12021,7 +11860,6 @@
"os": [
"freebsd"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12031,9 +11869,9 @@
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz",
- "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
+ "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
"cpu": [
"arm"
],
@@ -12043,7 +11881,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12053,9 +11890,9 @@
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz",
- "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
+ "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
"cpu": [
"arm64"
],
@@ -12065,7 +11902,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12075,9 +11911,9 @@
}
},
"node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz",
- "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
+ "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
"cpu": [
"arm64"
],
@@ -12087,7 +11923,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12097,9 +11932,9 @@
}
},
"node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz",
- "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
+ "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
"cpu": [
"x64"
],
@@ -12109,7 +11944,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12119,9 +11953,9 @@
}
},
"node_modules/lightningcss-linux-x64-musl": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz",
- "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
+ "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
"cpu": [
"x64"
],
@@ -12131,7 +11965,6 @@
"os": [
"linux"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12141,9 +11974,9 @@
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz",
- "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
+ "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
"cpu": [
"arm64"
],
@@ -12153,7 +11986,6 @@
"os": [
"win32"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12163,9 +11995,9 @@
}
},
"node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz",
- "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==",
+ "version": "1.30.1",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
+ "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
"cpu": [
"x64"
],
@@ -12175,7 +12007,6 @@
"os": [
"win32"
],
- "peer": true,
"engines": {
"node": ">= 12.0.0"
},
@@ -12646,7 +12477,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -12665,11 +12496,22 @@
"node": ">=8.6"
}
},
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -12678,7 +12520,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -12737,10 +12578,40 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/minizlib": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+ "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/mongodb": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz",
- "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==",
+ "version": "3.7.4",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz",
+ "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==",
+ "license": "Apache-2.0",
"dependencies": {
"bl": "^2.2.1",
"bson": "^1.1.4",
@@ -12959,15 +12830,16 @@
}
},
"node_modules/mongoose": {
- "version": "5.13.15",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz",
- "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==",
+ "version": "5.13.23",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.23.tgz",
+ "integrity": "sha512-Q5bo1yYOcH2wbBPP4tGmcY5VKsFkQcjUDh66YjrbneAFB3vNKQwLvteRFLuLiU17rA5SDl3UMcMJLD9VS8ng2Q==",
+ "license": "MIT",
"dependencies": {
"@types/bson": "1.x || 4.0.x",
"@types/mongodb": "^3.5.27",
"bson": "^1.1.4",
"kareem": "2.3.2",
- "mongodb": "3.7.3",
+ "mongodb": "3.7.4",
"mongoose-legacy-pluralize": "1.0.2",
"mpath": "0.8.4",
"mquery": "3.2.5",
@@ -13003,15 +12875,16 @@
}
},
"node_modules/morgan": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
- "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz",
+ "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==",
+ "license": "MIT",
"dependencies": {
"basic-auth": "~2.0.1",
"debug": "2.6.9",
"depd": "~2.0.0",
"on-finished": "~2.3.0",
- "on-headers": "~1.0.2"
+ "on-headers": "~1.1.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -13091,6 +12964,7 @@
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -13180,15 +13054,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -13425,15 +13290,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -13546,9 +13402,10 @@
}
},
"node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -13750,9 +13607,10 @@
}
},
"node_modules/passport": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
- "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz",
+ "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==",
+ "license": "MIT",
"dependencies": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
@@ -13902,7 +13760,8 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
@@ -13966,207 +13825,77 @@
"path-exists": "^4.0.0"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pkg-dir/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
- "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
- "dev": true,
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-import/node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8"
}
},
- "node_modules/postcss-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz",
- "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==",
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"dependencies": {
- "camelcase-css": "^2.0.1"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.3.3"
+ "node": ">=8"
}
},
- "node_modules/postcss-load-config": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
- "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"dependencies": {
- "lilconfig": "^2.0.5",
- "yaml": "^1.10.2"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">= 10"
+ "node": ">=6"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-load-config/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 6"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/postcss-nested": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
- "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"dependencies": {
- "postcss-selector-parser": "^6.0.10"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
+ "node": ">=8"
}
},
- "node_modules/postcss-selector-parser": {
- "version": "6.0.11",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
- "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
+ "node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
- "node": ">=4"
+ "node": "^10 || ^12 || >=14"
}
},
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -14230,6 +13959,16 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -14331,13 +14070,12 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "dev": true,
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -14372,22 +14110,11 @@
}
]
},
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -14531,24 +14258,6 @@
"react-dom": ">=16.8"
}
},
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/read-cache/node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -14573,18 +14282,6 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
"node_modules/recast": {
"version": "0.23.11",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz",
@@ -15435,10 +15132,11 @@
"dev": true
},
"node_modules/sshpk": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
- "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
@@ -15769,82 +15467,36 @@
}
},
"node_modules/superagent": {
- "version": "8.0.9",
- "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz",
- "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==",
- "dev": true,
+ "version": "10.2.1",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.1.tgz",
+ "integrity": "sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==",
+ "license": "MIT",
"dependencies": {
"component-emitter": "^1.3.0",
"cookiejar": "^2.1.4",
"debug": "^4.3.4",
"fast-safe-stringify": "^2.1.1",
"form-data": "^4.0.0",
- "formidable": "^2.1.2",
+ "formidable": "^3.5.4",
"methods": "^1.1.2",
"mime": "2.6.0",
- "qs": "^6.11.0",
- "semver": "^7.3.8"
- },
- "engines": {
- "node": ">=6.4.0 <13 || >=14"
- }
- },
- "node_modules/superagent/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/superagent/node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/superagent/node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
+ "qs": "^6.11.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=14.18.0"
}
},
- "node_modules/superagent/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
"node_modules/supertest": {
- "version": "6.3.3",
- "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz",
- "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==",
- "dev": true,
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.1.tgz",
+ "integrity": "sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==",
+ "license": "MIT",
"dependencies": {
"methods": "^1.1.2",
- "superagent": "^8.0.5"
+ "superagent": "^10.2.1"
},
"engines": {
- "node": ">=6.4.0"
+ "node": ">=14.18.0"
}
},
"node_modules/supports-color": {
@@ -15891,62 +15543,11 @@
"dev": true
},
"node_modules/tailwindcss": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz",
- "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==",
- "dev": true,
- "dependencies": {
- "arg": "^5.0.2",
- "chokidar": "^3.5.3",
- "color-name": "^1.1.4",
- "detective": "^5.2.1",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.2.12",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "lilconfig": "^2.0.6",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.18",
- "postcss-import": "^14.1.0",
- "postcss-js": "^4.0.0",
- "postcss-load-config": "^3.1.4",
- "postcss-nested": "6.0.0",
- "postcss-selector-parser": "^6.0.10",
- "postcss-value-parser": "^4.2.0",
- "quick-lru": "^5.1.1",
- "resolve": "^1.22.1"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=12.13.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.9"
- }
- },
- "node_modules/tailwindcss/node_modules/resolve": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
- "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
+ "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
"dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT"
},
"node_modules/tapable": {
"version": "2.2.1",
@@ -15954,11 +15555,28 @@
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=6"
}
},
+ "node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/tar-stream": {
"version": "3.1.7",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
@@ -15970,6 +15588,16 @@
"streamx": "^2.15.0"
}
},
+ "node_modules/tar/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/terminal-link": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
@@ -16168,16 +15796,34 @@
"node": ">=14.0.0"
}
},
- "node_modules/tmp": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
- "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "rimraf": "^3.0.0"
+ "tldts-core": "^6.1.86"
},
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8.17.0"
+ "node": ">=14.14"
}
},
"node_modules/tmpl": {
@@ -16208,10 +15854,11 @@
}
},
"node_modules/tough-cookie": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
- "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
@@ -16297,6 +15944,7 @@
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
},
@@ -16308,7 +15956,8 @@
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
+ "dev": true,
+ "license": "Unlicense"
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -16386,6 +16035,7 @@
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+ "license": "MIT",
"dependencies": {
"random-bytes": "~1.0.0"
},
@@ -16577,6 +16227,16 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-to-istanbul": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
@@ -16592,9 +16252,10 @@
}
},
"node_modules/validator": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
- "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==",
+ "version": "13.15.15",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz",
+ "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==",
+ "license": "MIT",
"engines": {
"node": ">= 0.10"
}
@@ -16615,6 +16276,7 @@
"engines": [
"node >=0.6.0"
],
+ "license": "MIT",
"dependencies": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
@@ -16625,7 +16287,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/vite": {
"version": "6.3.5",
@@ -16721,9 +16384,9 @@
}
},
"node_modules/vite-plugin-istanbul/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -17259,10 +16922,11 @@
}
},
"node_modules/ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.3.0"
},
@@ -17291,15 +16955,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -17383,22 +17038,21 @@
"connect-mongo": "^3.2.0",
"express": "^5.1.0",
"express-flash": "^0.0.2",
- "express-session": "^1.17.1",
+ "express-session": "^1.18.1",
"joi": "^17.7.0",
"mongodb": "^3.7.3",
"mongoose": "^5.12.3",
"morgan": "^1.10.0",
- "nanoid": "^3.3.4",
- "passport": "^0.6.0",
+ "passport": "^0.7.0",
"passport-discord": "^0.1.4",
- "validator": "^13.6.0"
+ "supertest": "^7.1.1",
+ "validator": "^13.15.15"
},
"devDependencies": {
- "date-fns": "^2.29.3",
+ "date-fns": "^2.30.0",
"mongodb-memory-server": "^10.1.4",
"nock": "^13.2.9",
- "nyc": "^17.1.0",
- "supertest": "^6.3.3"
+ "nyc": "^17.1.0"
}
},
"server/node_modules/camelcase": {
@@ -17423,17 +17077,6 @@
"wrap-ansi": "^6.2.0"
}
},
- "server/node_modules/date-fns": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
- "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/kossnocorp"
- }
- },
"server/node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
diff --git a/package.json b/package.json
index 0a7e7726..fec310d2 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
- "name": "Together",
+ "name": "together",
"version": "1.0.0",
- "description": "Together is a new app designed for 100devs. Together is a group calendar for public events, so you can see what's going on in your community. We're making it easier to find out about the events that are happening in Discord and let you know how much fun they'll be!",
+ "description": "Together is a new app designed for 100Devs. Together is a group calendar for public events, so you can see what's going on in your community. We're making it easier to find out about the events that are happening in Discord and let you know how much fun they'll be!",
"main": "server.js",
"engines": {
"node": ">=22.14.0"
@@ -25,7 +25,7 @@
"start": "npm run client:build && npm run server:start",
"start-client": "cd client && npm start",
"test": "concurrently \"npm:test:backend\" \"npm:test:frontend\"",
- "test:backend": "cross-env MOCK_USER=true jest --coverage --coverage-reporters=\"json\" && mkdir -p .nyc_output && mv coverage/coverage-final.json .nyc_output/coverage-final.json",
+ "test:backend": "cross-env MOCK_USER=true DISCORD_CLIENT_ID=1 jest --coverage --coverage-reporters=\"json\" && mkdir -p .nyc_output && mv coverage/coverage-final.json .nyc_output/coverage-final.json",
"test:e2e": "cross-env MOCK_USER=false NODE_ENV=test DB_STRING=mongodb://127.0.0.1:27017/ DISCORD_CLIENT_ID=1 DISCORD_CLIENT_SECRET=1 concurrently --success command-cypress --kill-others --names client,mongodb,server,cypress \"npm:client:start\" \"npm:server:dev:mongo\" \"wait-on http-get://localhost:27017/ && npm run --workspace=server start:coverage\" \"wait-on http://localhost:3000 && cypress run\"",
"test:e2e:dev": "cross-env MOCK_USER=false NODE_ENV=test DB_STRING=mongodb://127.0.0.1:27017/ DISCORD_CLIENT_ID=1 DISCORD_CLIENT_SECRET=1 concurrently --success command-cypress --kill-others --names client,mongodb,server,cypress \"npm:client:start\" \"npm:server:dev:mongo\" \"wait-on http-get://localhost:27017/ && npm run --workspace=server start:coverage\" \"wait-on http://localhost:3000 && cypress open\"",
"test:frontend": "echo \"No tests yet\" && exit 0"
@@ -36,7 +36,7 @@
"@cypress/code-coverage": "^3.14.1",
"concurrently": "^7.5.0",
"cross-env": "^7.0.3",
- "cypress": "^12.2.0",
+ "cypress": "^14.5.1",
"eslint": "^8.27.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-cypress": "^2.12.1",
diff --git a/server/.env.example b/server/.env.example
index 0760d19d..ebb5371d 100644
--- a/server/.env.example
+++ b/server/.env.example
@@ -6,5 +6,5 @@ DB_STRING=mongodb://127.0.0.1:27017/
DISCORD_CLIENT_ID=1039303417199345684
DISCORD_CLIENT_SECRET=DISCORD_CLIENT_SECRET
OAUTH_REDIRECT_URL=http://localhost:3000/
-MOCK_USER=true
+MOCK_USER=false
NODE_ENV=development
diff --git a/server/app.js b/server/app.js
index bf5885ad..da81f162 100644
--- a/server/app.js
+++ b/server/app.js
@@ -12,6 +12,9 @@ const eventsRoutes = require("./routes/events");
const mockUser = require("./config/mockUser.json");
const User = require("./models/User");
+// Enables express to properly detect HTTPS requests
+app.set("trust proxy", true);
+
// Passport config
require("./config/passport")(passport);
@@ -30,6 +33,10 @@ app.use(
resave: false,
saveUninitialized: false,
store: new MongoStore({ mongooseConnection: mongoose.connection }),
+ cookie: {
+ secure: process.env.NODE_ENV === "production",
+ maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days in milliseconds
+ },
})
);
diff --git a/server/config/mockUser.json b/server/config/mockUser.json
index f2e0b636..5ea78d5e 100644
--- a/server/config/mockUser.json
+++ b/server/config/mockUser.json
@@ -5,5 +5,6 @@
"discordId": "9999999999999999",
"avatar": "450a0b622a7c905c4c75e190cb21f2df",
"bio": "",
- "__v": 0
+ "__v": 0,
+ "isModerator": false
}
diff --git a/server/config/passport.js b/server/config/passport.js
index fa4b55b3..a02fe2f7 100644
--- a/server/config/passport.js
+++ b/server/config/passport.js
@@ -23,14 +23,14 @@ module.exports = function (passport) {
clientSecret: process.env.DISCORD_CLIENT_SECRET,
callbackURL: "/api/auth/discord/callback",
// pulls discord username without email, and returns basic information about all the user's current guilds / servers.
- scope: ["identify", "guilds"],
+ scope: ["identify", "guilds", "guilds.members.read"],
passReqToCallback: true,
},
async function (currentReq, accessToken, refreshToken, profile, cb) {
- const displayName =
- profile.discriminator.length === 4
- ? `${profile.username}#${profile.discriminator}`
- : profile.username;
+ // Check if user exists in DB
+ let user = await User.findOne({ discordId: profile.id }).exec();
+
+ //if user is not in 100Devs, return (end the function)
const is100Dever = profile.guilds.some(
(server) => server.id === "735923219315425401"
);
@@ -39,8 +39,15 @@ module.exports = function (passport) {
currentReq.session.isNot100Dever = true;
return cb(null, false);
}
- // Check if user exists in DB
- let user = await User.findOne({ discordId: profile.id }).exec();
+
+ //check to see if a global name is set for the user. if not, fallback to username
+ let displayName = profile.global_name ?? profile.username;
+
+ // check to see if there is a .nick property in the current user's guild
+ const serverName = await getServerName(accessToken);
+
+ //if there is a serverName, use that instead of username or global_name
+ if (serverName) displayName = serverName;
try {
// Create user if it doesn't exist
@@ -49,6 +56,7 @@ module.exports = function (passport) {
displayName: displayName,
discordId: profile.id,
avatar: profile.avatar,
+ isModerator: false,
socials: [],
bio: "",
needsToBeWelcome: true,
@@ -56,7 +64,7 @@ module.exports = function (passport) {
return cb(null, user);
} else {
- // it user already exists, update display name and avatar
+ // if user already exists, update display name and avatar
user.displayName = displayName;
user.avatar = profile.avatar;
const updatedUser = await user.save();
@@ -72,3 +80,36 @@ module.exports = function (passport) {
)
);
};
+
+/**
+ * a function that gets a user's server name.
+ * @param {string} accessToken represents the current access token of the auth instance
+ */
+async function getServerName(accessToken) {
+ //if in the parameters, can be reusable + testable
+ //test the happy path
+ try {
+ const devMemberInfo = await fetch(
+ "https://discord.com/api/users/@me/guilds/735923219315425401/member",
+ {
+ headers: {
+ Authorization: `Bearer ${accessToken}`,
+ },
+ }
+ );
+ const devMemberData = await devMemberInfo.json();
+ //return a 200, something that is jsonable
+ //if .nick, that indicates a nickname
+ if (devMemberData.nick) {
+ return devMemberData.nick;
+ }
+ //if 500, return the response, server name
+ //if no .nick, return null (prior server name remains)
+ console.log(`The nickname could not be found.`);
+ } catch (error) {
+ console.log(`The member's guild info could not be found: ${error}`);
+ }
+ return null;
+}
+
+module.exports.getServerName = getServerName;
diff --git a/server/constants/constants.js b/server/constants/constants.js
new file mode 100644
index 00000000..caa21361
--- /dev/null
+++ b/server/constants/constants.js
@@ -0,0 +1,7 @@
+module.exports = {
+ /**
+ * Recurring events should span no more than this number of days.
+ * @constant {number}
+ */
+ MAX_RECURRENCE_PERIOD: 730,
+};
diff --git a/server/controllers/events.js b/server/controllers/events.js
index c6580139..bb4d3ad7 100644
--- a/server/controllers/events.js
+++ b/server/controllers/events.js
@@ -58,8 +58,16 @@ module.exports = {
deleteEvent: async (req, res) => {
const { id } = req.params;
- // Prevent users that are authenticated from deleting events they do not author.
- const event = await Event.findOne({ _id: id, user: req.user._id });
+ let event;
+
+ if (!req.user.isModerator) {
+ // Prevent users that are authenticated from deleting events they do not author.
+ event = await Event.findOne({ _id: id, user: req.user._id });
+ } else {
+ // Moderators can delete any event
+ event = await Event.findById(id);
+ }
+
if (!event) {
throw httpError(404);
}
diff --git a/server/middleware/auth.js b/server/middleware/auth.js
index a9fc7c9a..199e59dc 100644
--- a/server/middleware/auth.js
+++ b/server/middleware/auth.js
@@ -1,17 +1,46 @@
+const User = require("../models/User");
+
module.exports = {
- ensureAuth: function (req, res, next) {
+ // TODO: Please refactor me
+ ensureAuth: async function (req, res, next) {
+ // Handle test authentication via Authorization header
+ if (process.env.NODE_ENV === "test" && req.headers.authorization) {
+ const token = req.headers.authorization;
+
+ // Map authorization tokens to Discord IDs
+ const tokenToDiscordId = {
+ "100_DEVER": "1",
+ SECOND_100_DEVER: "2",
+ JOHN_DOE: "3",
+ MODERATOR_USER: "4",
+ };
+
+ const discordId = tokenToDiscordId[token];
+ if (discordId) {
+ const user = await User.findOne({ discordId });
+ if (user) {
+ req.user = user;
+ return next();
+ }
+ }
+
+ // If no user found, return 401
+ return res.sendStatus(401);
+ }
+
if (req.isAuthenticated()) {
- /* istanbul ignore next */
+ /* istanbul ignore next */
if (process.env.NODE_ENV !== "test")
console.log("user is authenticated, proceeeding");
return next();
} else {
- /* istanbul ignore next */
+ /* istanbul ignore next */
if (process.env.NODE_ENV !== "test")
console.log("user is not authenticated");
res.sendStatus(401);
}
},
+
ensureGuest: function (req, res, next) {
if (!req.isAuthenticated()) {
return next();
diff --git a/server/models/Event.js b/server/models/Event.js
index 9a2826b4..c8f30c42 100644
--- a/server/models/Event.js
+++ b/server/models/Event.js
@@ -3,12 +3,10 @@
const mongoose = require("mongoose");
const Joi = require("joi");
const { Temporal } = require("@js-temporal/polyfill");
-
+const { MAX_RECURRENCE_PERIOD } = require("../constants/constants");
const STRING_MAX_LENGTH = 280;
// Event's starting date should be less than (strictly) EVENT_MAX_DATE
const EVENT_MAX_DATE = "2030-01-01";
-// Recurring events should span no more than MAX_RECURRENCE_PERIOD number of days
-const MAX_RECURRENCE_PERIOD = 90;
const DAYS_OF_WEEK = ["1", "2", "3", "4", "5", "6", "7"];
const EventSchema = new mongoose.Schema(
@@ -155,6 +153,5 @@ module.exports = {
Event,
createEventSchema,
STRING_MAX_LENGTH,
- MAX_RECURRENCE_PERIOD,
EVENT_MAX_DATE,
};
diff --git a/server/package.json b/server/package.json
index 6e37e16b..b00a833b 100644
--- a/server/package.json
+++ b/server/package.json
@@ -2,7 +2,7 @@
"name": "server",
"description": "Server for Together App",
"main": "server.js",
- "author": "100devs",
+ "author": "100Devs",
"scripts": {
"start": "node --env-file=.env server.js",
"start:coverage": "nyc --silent node server.js",
@@ -15,21 +15,20 @@
"connect-mongo": "^3.2.0",
"express": "^5.1.0",
"express-flash": "^0.0.2",
- "express-session": "^1.17.1",
+ "express-session": "^1.18.1",
"joi": "^17.7.0",
"mongodb": "^3.7.3",
"mongoose": "^5.12.3",
"morgan": "^1.10.0",
- "nanoid": "^3.3.4",
- "passport": "^0.6.0",
+ "passport": "^0.7.0",
"passport-discord": "^0.1.4",
- "validator": "^13.6.0"
+ "supertest": "^7.1.1",
+ "validator": "^13.15.15"
},
"devDependencies": {
- "date-fns": "^2.29.3",
+ "date-fns": "^2.30.0",
"mongodb-memory-server": "^10.1.4",
"nock": "^13.2.9",
- "nyc": "^17.1.0",
- "supertest": "^6.3.3"
+ "nyc": "^17.1.0"
}
}
diff --git a/server/test/acceptance/routes.test.js b/server/test/acceptance/routes.test.js
index 17491321..359228b9 100644
--- a/server/test/acceptance/routes.test.js
+++ b/server/test/acceptance/routes.test.js
@@ -1,5 +1,6 @@
const request = require("supertest");
const app = require("../../app");
+const mockDiscordResponses = require("../passport-discord-mocking");
const {
validFormDataNonRecurr,
validFormDataRecurr,
@@ -13,6 +14,52 @@ describe("event routes", () => {
beforeEach(async () => {
await testDb.setUp();
+ mockDiscordResponses();
+
+ // create test users
+ const User = require("../../models/User");
+ await User.create([
+ {
+ discordId: "1",
+ displayName: "100Dever#0001",
+ discriminator: "0001",
+ avatar: null,
+ isModerator: false,
+ socials: [],
+ bio: "",
+ needsToBeWelcome: false,
+ },
+ {
+ discordId: "2",
+ displayName: "100Dever2#0002",
+ discriminator: "0002",
+ avatar: null,
+ isModerator: false,
+ socials: [],
+ bio: "",
+ needsToBeWelcome: false,
+ },
+ {
+ discordId: "3",
+ displayName: "John Doe#0003",
+ discriminator: "0003",
+ avatar: null,
+ isModerator: false,
+ socials: [],
+ bio: "",
+ needsToBeWelcome: false,
+ },
+ {
+ discordId: "4",
+ displayName: "Moderator#0004",
+ discriminator: "0004",
+ avatar: null,
+ isModerator: true,
+ socials: [],
+ bio: "",
+ needsToBeWelcome: false,
+ },
+ ]);
});
afterEach(async () => {
@@ -128,56 +175,88 @@ describe("event routes", () => {
});
describe("DELETE /api/events/:id", () => {
- it("should delete event if it exists and return 204 on success", async () => {
- // Create an event
- const resPost = await request(app)
+ it("deletes event if it exists", async () => {
+ const createEventRes = await request(app)
.post("/api/events")
+ .set("Authorization", "100_DEVER")
.send(validFormDataNonRecurr);
- expect(resPost.statusCode).toBe(201);
+ const event = createEventRes.body.events[0];
- // Delete event
- const { _id } = resPost.body.events[0];
- const resDel = await request(app).delete(`/api/events/${_id}`);
- expect(resDel.statusCode).toBe(204);
+ const deleteRes = await request(app)
+ .delete(`/api/events/${event._id}`)
+ .set("Authorization", "100_DEVER");
+ expect(deleteRes.statusCode).toBe(204);
- // Check if deleted
- const resGet = await request(app).get("/api/events");
- expect(resGet.body).toHaveLength(0);
+ const getRes = await request(app).get("/api/events");
+ expect(getRes.body).toHaveLength(0);
});
- it("should return 404 if event is not found", async () => {
+ it("returns 404 if event doesn't exist", async () => {
const _id = "63c722239b1a9104e164d728";
- const resDel = await request(app).delete(`/api/events/${_id}`);
- expect(resDel.statusCode).toBe(404);
+ const deleteRes = await request(app)
+ .delete(`/api/events/${_id}`)
+ .set("Authorization", "100_DEVER");
+ expect(deleteRes.statusCode).toBe(404);
+ });
+
+ it("should allow moderator to delete any event", async () => {
+ // create regular (non moderator) user to create event
+ const createEventRes = await request(app)
+ .post("/api/events")
+ .set("Authorization", "100_DEVER")
+ .send(validFormDataNonRecurr);
+ const event = createEventRes.body.events[0];
+
+ // delete as moderator
+ const resDel = await request(app)
+ .delete(`/api/events/${event._id}`)
+ .set("Authorization", "MODERATOR_USER");
+ expect(resDel.statusCode).toBe(204);
+
+ // verify deletion
+ const getRes = await request(app).get("/api/events");
+ expect(getRes.body).toHaveLength(0);
+ });
+
+ it("should prevent non-moderator from deleting other's events", async () => {
+ // create an event as a regular user
+ const createEventRes = await request(app)
+ .post("/api/events")
+ .set("Authorization", "100_DEVER")
+ .send(validFormDataNonRecurr);
+ const event = createEventRes.body.events[0];
+
+ // try to delete the event as second non-moderator user
+ const deleteRes = await request(app)
+ .delete(`/api/events/${event._id}`)
+ .set("Authorization", "SECOND_100_DEVER");
+ expect(deleteRes.statusCode).toBe(404);
});
});
describe("DELETE /api/events/deleteAllEvents/:groupId", () => {
it("should return 404 if no events found", async () => {
const groupId = "1234";
- const resDel = await request(app).delete(
- `/api/events/deleteAllEvents/${groupId}`
- );
- expect(resDel.statusCode).toBe(404);
+ const deleteRes = await request(app)
+ .delete(`/api/events/deleteAllEvents/${groupId}`)
+ .set("Authorization", "100_DEVER");
+ expect(deleteRes.statusCode).toBe(404);
});
- it("should delete events if they exist and return 204 on success", async () => {
- // Create an event
- const resPost = await request(app)
+ it("deletes all events in group", async () => {
+ const createEventRes = await request(app)
.post("/api/events")
+ .set("Authorization", "100_DEVER")
.send(validFormDataRecurr);
- expect(resPost.statusCode).toBe(201);
+ const event = createEventRes.body.events[0];
- // Delete event
- const { groupId } = resPost.body.events[0];
- const resDel = await request(app).delete(
- `/api/events/deleteAllEvents/${groupId}`
- );
- expect(resDel.statusCode).toBe(204);
+ const deleteRes = await request(app)
+ .delete(`/api/events/deleteAllEvents/${event.groupId}`)
+ .set("Authorization", "100_DEVER");
+ expect(deleteRes.statusCode).toBe(204);
- // Check if deleted
- const resGet = await request(app).get("/api/events");
- expect(resGet.body).toHaveLength(0);
+ const getRes = await request(app).get("/api/events");
+ expect(getRes.body).toHaveLength(0);
});
});
});
diff --git a/server/test/passport-discord-mocking.js b/server/test/passport-discord-mocking.js
index b668aa5f..e3adc22c 100644
--- a/server/test/passport-discord-mocking.js
+++ b/server/test/passport-discord-mocking.js
@@ -64,9 +64,29 @@ const RESPONSES = {
},
"/users/@me/guilds": [],
},
+ MODERATOR_USER: {
+ "/oauth2/token": {
+ access_token: "MODERATOR_USER",
+ token_type: "Bearer",
+ expires_in: 604800,
+ refresh_token: "MODERATOR_USER",
+ scope: "identify",
+ },
+ "/users/@me": {
+ id: "4",
+ username: "Moderator",
+ discriminator: "0004",
+ },
+ "/users/@me/guilds": [
+ {
+ id: "735923219315425401",
+ name: "Learn w/ Leon and Friends",
+ },
+ ],
+ },
};
-module.exports = function mockDiscordResponses() {
+function mockDiscordResponses() {
return nock("https://discord.com/api")
.post("/oauth2/token")
.reply(200, (_, requestBody) => {
@@ -99,4 +119,7 @@ module.exports = function mockDiscordResponses() {
);
})
.persist();
-};
+}
+
+module.exports = mockDiscordResponses;
+module.exports.RESPONSES = RESPONSES;
diff --git a/server/test/unit/createEventsArray.test.js b/server/test/unit/createEventsArray.test.js
index fb453920..2c463874 100644
--- a/server/test/unit/createEventsArray.test.js
+++ b/server/test/unit/createEventsArray.test.js
@@ -1,6 +1,6 @@
"use strict";
-const { nanoid } = require("nanoid");
+const crypto = require("node:crypto");
const { createEventsArray } = require("../../utilities/createEventsArray");
const {
generateTestCases,
@@ -18,8 +18,10 @@ const {
PDTtoPSTrecurring,
} = require("./createEventsArrayMockData");
-jest.mock("nanoid");
-const mockedNanoid = jest.mocked(nanoid);
+jest.mock("node:crypto", () => ({
+ randomUUID: jest.fn(),
+}));
+const mockedCrypto = jest.mocked(crypto);
describe("Events created in Western European Time (WET) and Western European Summer Time (WEST)", () => {
describe("WET - WEST non recurring", () => {
@@ -29,6 +31,7 @@ describe("Events created in Western European Time (WET) and Western European Sum
...generateTestCases(WETtoWESTnonrecurring),
...generateTestCases(WESTtoWETnonrecurring),
])("$description", ({ input, output }) => {
+ mockedCrypto.randomUUID.mockReturnValueOnce("1234");
const res = createEventsArray(input);
expect(res).toBeInstanceOf(Array);
expect(res).toHaveLength(1);
@@ -41,7 +44,7 @@ describe("Events created in Western European Time (WET) and Western European Sum
...generateTestCases(WETtoWESTrecurring),
...generateTestCases(WESTtoWETrecurring),
])("$description", ({ input, output }) => {
- mockedNanoid.mockReturnValueOnce("1234");
+ mockedCrypto.randomUUID.mockReturnValueOnce("1234");
const res = createEventsArray(input);
expect(res).toBeInstanceOf(Array);
expect(res).toHaveLength(3);
@@ -70,7 +73,7 @@ describe("Events created in Pacific Standard Time (PST) and Pacific Daylight Tim
...generateTestCases(PSTtoPDTrecurring),
...generateTestCases(PDTtoPSTrecurring),
])("$description", ({ input, output }) => {
- mockedNanoid.mockReturnValueOnce("1234");
+ mockedCrypto.randomUUID.mockReturnValueOnce("1234");
const res = createEventsArray(input);
expect(res).toBeInstanceOf(Array);
expect(res).toHaveLength(3);
diff --git a/server/test/unit/events.test.js b/server/test/unit/events.test.js
new file mode 100644
index 00000000..d0faad01
--- /dev/null
+++ b/server/test/unit/events.test.js
@@ -0,0 +1,59 @@
+"use strict";
+
+const { deleteEvent } = require("../../controllers/events");
+const { Event } = require("../../models/Event");
+
+jest.mock("../../models/Event");
+const mockedEvent = jest.mocked(Event);
+
+describe("Event controller", () => {
+ describe("deleteEvent", () => {
+ let req, res;
+
+ beforeEach(() => {
+ req = {
+ params: { id: "123" },
+ user: { _id: "user123" },
+ };
+ res = {
+ sendStatus: jest.fn(),
+ };
+ // clear mock data between tests
+ jest.clearAllMocks();
+ });
+
+ test("allows moderators to delete any event", async () => {
+ req.user.isModerator = true;
+ const mockEvent = { _id: "123" };
+ mockedEvent.findById.mockResolvedValue(mockEvent);
+ mockedEvent.findByIdAndDelete.mockResolvedValue({});
+
+ await deleteEvent(req, res);
+
+ expect(mockedEvent.findById).toHaveBeenCalledWith("123");
+ expect(res.sendStatus).toHaveBeenCalledWith(204);
+ });
+
+ test("allows users to delete their own events", async () => {
+ req.user.isModerator = false;
+ const mockEvent = { _id: "123", user: "user123" };
+ mockedEvent.findOne.mockResolvedValue(mockEvent);
+ mockedEvent.findByIdAndDelete.mockResolvedValue({});
+
+ await deleteEvent(req, res);
+
+ expect(mockedEvent.findOne).toHaveBeenCalledWith({
+ _id: "123",
+ user: "user123",
+ });
+ expect(res.sendStatus).toHaveBeenCalledWith(204);
+ });
+
+ test("returns 404 when event is not found", async () => {
+ req.user.isModerator = false;
+ mockedEvent.findOne.mockResolvedValue(null);
+
+ await expect(deleteEvent(req, res)).rejects.toThrow();
+ });
+ });
+});
diff --git a/server/test/unit/passport.test.js b/server/test/unit/passport.test.js
new file mode 100644
index 00000000..deb03ce9
--- /dev/null
+++ b/server/test/unit/passport.test.js
@@ -0,0 +1,91 @@
+"use strict";
+
+// Assuming your passport config file is two directories up in /config
+const { getServerName } = require("../../config/passport");
+
+describe("getServerName", () => {
+ beforeEach(() => {
+ global.fetch = jest.fn();
+ });
+
+ afterEach(() => {
+ // restore all mocks after each test
+ jest.restoreAllMocks();
+ global.fetch.mockClear();
+ });
+
+ /* given nick property, return the nick property */
+
+ it("nickname is present", async () => {
+ // define the mock response for this specific test case
+ const mockApiResponse = {
+ nick: "notLegmother",
+ user: { id: "123", username: "discord-user" },
+ };
+
+ // resolve with an object that has a .json() method,
+ // which in turn resolves with our mock API response.
+ jest.spyOn(global, "fetch").mockResolvedValue({
+ json: jest.fn().mockResolvedValue(mockApiResponse),
+ });
+
+ // call the function, expect it to be the nickname
+ const result = await getServerName("fake-token");
+ console.log(result);
+ expect(result).toBe("notLegmother");
+ });
+
+ //test the cases in which it goes wrong, i.e. no nick property
+ //capture the user behavior rather than the specific output
+ it("nickname is not present", async () => {
+ const mockApiResponse = {
+ user: { id: "123", username: "discord-user" },
+ };
+
+ // resolve with an object that has a .json() method,
+ // which in turn resolves with our mock API response.
+ jest.spyOn(global, "fetch").mockResolvedValue({
+ json: jest.fn().mockResolvedValue(mockApiResponse),
+ });
+
+ // what is logging? check on that
+ const consoleLogSpy = jest
+ .spyOn(console, "log")
+ .mockImplementation(() => {});
+
+ const result = await getServerName("fake-token");
+
+ // assertions: return null and the expected log message
+ expect(result).toBe(null); // The function should return null
+ expect(consoleLogSpy).toHaveBeenCalledWith(
+ "The nickname could not be found."
+ );
+ });
+
+ //server / API error
+ it("returns no data", async () => {
+ const mockApiResponse = {
+ status: 400,
+ statusText: "Bad Request",
+ };
+
+ // resolve with an object that has a .json() method,
+ // which in turn resolves with our mock API response.
+ jest.spyOn(global, "fetch").mockResolvedValue({
+ json: jest.fn().mockResolvedValue(mockApiResponse),
+ });
+
+ // what is logging? check on that
+ const consoleLogSpy = jest
+ .spyOn(console, "log")
+ .mockImplementation(() => {});
+
+ const result = await getServerName("fake-token");
+
+ // assertions: return null and the expected log message
+ expect(result).toBe(null); // The function should return null
+ expect(consoleLogSpy).toHaveBeenCalledWith(
+ "The nickname could not be found."
+ );
+ });
+});
diff --git a/server/test/unit/validateBody.test.js b/server/test/unit/validateBody.test.js
index a7d71064..6f1c3f27 100644
--- a/server/test/unit/validateBody.test.js
+++ b/server/test/unit/validateBody.test.js
@@ -1,11 +1,9 @@
"use strict";
const validateBody = require("../../middleware/validateBody");
-const {
- createEventSchema,
- MAX_RECURRENCE_PERIOD,
- EVENT_MAX_DATE,
-} = require("../../models/Event");
+const { createEventSchema, EVENT_MAX_DATE } = require("../../models/Event");
+const { MAX_RECURRENCE_PERIOD } = require("../../constants/constants");
+
const sample = require("./validateBodyMockData");
const mockRequest = (body) => ({ body });
diff --git a/server/test/unit/validateBodyMockData.js b/server/test/unit/validateBodyMockData.js
index 9b750965..a34f523d 100644
--- a/server/test/unit/validateBodyMockData.js
+++ b/server/test/unit/validateBodyMockData.js
@@ -1,12 +1,8 @@
"use strict";
const { Temporal } = require("@js-temporal/polyfill");
-
-const {
- STRING_MAX_LENGTH,
- MAX_RECURRENCE_PERIOD,
- EVENT_MAX_DATE,
-} = require("../../models/Event");
+const { STRING_MAX_LENGTH, EVENT_MAX_DATE } = require("../../models/Event");
+const { MAX_RECURRENCE_PERIOD } = require("../../constants/constants");
const dateNow = Temporal.Now.plainDateISO();
const dateYesterday = dateNow.subtract({ days: 1 });
@@ -20,10 +16,10 @@ const dateAfterMax = Temporal.PlainDate.from(EVENT_MAX_DATE).add({
days: 2,
});
-const timeNow = Temporal.Now.plainTimeISO().round({
- smallestUnit: "minute",
- roundingMode: "ceil",
-});
+//adjusted the creation of the timeNow value to be five minutes from creation to prevent a race condition
+const timeNow = Temporal.Now.plainTimeISO()
+ .add({ minutes: 5 })
+ .round({ smallestUnit: "minute", roundingMode: "ceil" });
const timeIn1hour = timeNow.add({ hours: 1 });
const validFormDataNonRecurr = {
diff --git a/server/utilities/createEventsArray.js b/server/utilities/createEventsArray.js
index 2fc5c3a0..ba7a9b6d 100644
--- a/server/utilities/createEventsArray.js
+++ b/server/utilities/createEventsArray.js
@@ -1,6 +1,6 @@
"use strict";
-const { nanoid } = require("nanoid");
+const crypto = require("node:crypto");
const { Temporal } = require("@js-temporal/polyfill");
/**
@@ -81,7 +81,7 @@ const createEventsArray = ({
}
// Recurring events have the same group id. This allows deleting them all at once by this id.
- const groupId = rate === "noRecurr" ? null : nanoid();
+ const groupId = rate === "noRecurr" ? null : crypto.randomUUID();
// Create dates array with events information
const events = eventStartDates.map((date) => {