├── .gitignore
├── client
├── src
│ ├── config.js
│ ├── components
│ │ ├── ui
│ │ │ ├── Card.jsx
│ │ │ ├── Message.jsx
│ │ │ ├── Label.jsx
│ │ │ ├── ButtonLink.jsx
│ │ │ ├── Input.jsx
│ │ │ ├── Button.jsx
│ │ │ ├── index.js
│ │ │ └── Textarea.jsx
│ │ ├── tasks
│ │ │ └── TaskCard.jsx
│ │ └── Navbar.jsx
│ ├── api
│ │ ├── axios.js
│ │ ├── auth.js
│ │ └── tasks.js
│ ├── index.css
│ ├── setupTests.js
│ ├── schemas
│ │ ├── task.js
│ │ └── auth.js
│ ├── App.test.js
│ ├── main.jsx
│ ├── routes.jsx
│ ├── reportWebVitals.js
│ ├── App.css
│ ├── pages
│ │ ├── TasksPage.jsx
│ │ ├── HomePage.jsx
│ │ ├── LoginPage.jsx
│ │ ├── TaskFormPage.jsx
│ │ └── RegisterPage.jsx
│ ├── App.jsx
│ ├── context
│ │ ├── tasksContext.jsx
│ │ └── authContext.jsx
│ └── assets
│ │ └── react.svg
├── postcss.config.cjs
├── vite.config.js
├── tailwind.config.cjs
├── .gitignore
├── index.html
├── package.json
├── public
│ └── vite.svg
└── pnpm-lock.yaml
├── .env.template
├── docker-compose.yml
├── src
├── schemas
│ ├── task.schema.js
│ └── auth.schema.js
├── config.js
├── db.js
├── middlewares
│ ├── validator.middleware.js
│ └── auth.middleware.js
├── libs
│ └── jwt.js
├── index.js
├── models
│ ├── user.model.js
│ └── task.model.js
├── routes
│ ├── auth.routes.js
│ └── tasks.routes.js
├── app.js
└── controllers
│ ├── tasks.controllers.js
│ └── auth.controller.js
├── .vscode
└── settings.json
├── README.md
├── requests
├── auth.http
└── tasks.http
├── package.json
└── pnpm-lock.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
--------------------------------------------------------------------------------
/client/src/config.js:
--------------------------------------------------------------------------------
1 | export const API_URL = import.meta.env.VITE_API_URL|| "http://localhost:4000/api";
2 |
--------------------------------------------------------------------------------
/client/postcss.config.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/.env.template:
--------------------------------------------------------------------------------
1 | PORT=4000
2 | MONGODB_URI=mongodb://localhost/mern-tasks
3 | TOKEN_SECRET=yoursecret
4 | FRONTEND_URL=http://localhost:5173
--------------------------------------------------------------------------------
/client/src/components/ui/Card.jsx:
--------------------------------------------------------------------------------
1 | export function Card({ children }) {
2 | return
{children}
;
3 | }
4 |
--------------------------------------------------------------------------------
/client/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()]
7 | })
8 |
--------------------------------------------------------------------------------
/client/src/components/ui/Message.jsx:
--------------------------------------------------------------------------------
1 | export function Message({ message }) {
2 | return (
3 |
4 | {message}
5 |
6 | );
7 | }
8 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | tasksdb:
5 | image: mongo
6 | container_name: tasksdb
7 | restart: always
8 | ports:
9 | - 27017:27017
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/client/src/components/ui/Label.jsx:
--------------------------------------------------------------------------------
1 | export function Label({ htmlFor, children }) {
2 | return (
3 |
6 | );
7 | }
8 |
--------------------------------------------------------------------------------
/client/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
4 | theme: {
5 | extend: {},
6 | },
7 | plugins: [],
8 | };
9 |
--------------------------------------------------------------------------------
/client/src/api/axios.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import { API_URL } from "../config";
3 |
4 | const instance = axios.create({
5 | baseURL: API_URL,
6 | withCredentials: true,
7 | });
8 |
9 | export default instance;
10 |
--------------------------------------------------------------------------------
/client/src/components/ui/ButtonLink.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | export const ButtonLink = ({ to, children }) => (
4 |
5 | {children}
6 |
7 | );
8 |
--------------------------------------------------------------------------------
/client/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 | body {
6 | background: #202020;
7 | color: white;
8 | }
9 |
10 | .content-container {
11 | height: calc(100vh - theme("spacing.20"));
12 | }
13 |
--------------------------------------------------------------------------------
/client/src/components/ui/Input.jsx:
--------------------------------------------------------------------------------
1 | import { forwardRef } from "react";
2 |
3 | export const Input = forwardRef((props, ref) => (
4 |
9 | ));
10 |
--------------------------------------------------------------------------------
/client/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/client/src/schemas/task.js:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const taskSchema = z.object({
4 | title: z.string({
5 | required_error: "Title is required",
6 | }),
7 | description: z.string({
8 | required_error: "Description is required",
9 | }),
10 | });
11 |
--------------------------------------------------------------------------------
/src/schemas/task.schema.js:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const createTaskSchema = z.object({
4 | title: z.string({
5 | required_error: "Title is required",
6 | }),
7 | description: z.string().optional(),
8 | date: z.string().datetime().optional(),
9 | });
10 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.exclude": {
3 | "**/.git": true,
4 | "**/.svn": true,
5 | "**/.hg": true,
6 | "**/CVS": true,
7 | "**/.DS_Store": true,
8 | "**/Thumbs.db": true,
9 | "node_modules": true,
10 | "client/node_modules": true,
11 | }
12 | }
--------------------------------------------------------------------------------
/client/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/client/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App'
4 | import './index.css'
5 |
6 | ReactDOM.createRoot(document.getElementById('root')).render(
7 |
8 |
9 |
10 | )
11 |
--------------------------------------------------------------------------------
/client/src/components/ui/Button.jsx:
--------------------------------------------------------------------------------
1 | export function Button({ onClick, children }) {
2 | return (
3 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/client/src/components/ui/index.js:
--------------------------------------------------------------------------------
1 | export { Button } from "./Button";
2 | export { ButtonLink } from "./ButtonLink";
3 | export { Card } from "./Card";
4 | export { Input } from "./Input";
5 | export { Message } from "./Message";
6 | export { Label } from "./Label";
7 | import { Textarea } from "./Textarea";
8 |
--------------------------------------------------------------------------------
/src/config.js:
--------------------------------------------------------------------------------
1 | export const PORT = process.env.PORT || 4000;
2 | export const MONGODB_URI =
3 | process.env.MONGODB_URI || "mongodb://localhost/mern-tasks";
4 | export const TOKEN_SECRET = process.env.TOKEN_SECRET || "secret";
5 |
6 | export const FRONTEND_URL = process.env.FRONTEND_URL || "http://localhost:5173";
--------------------------------------------------------------------------------
/client/src/api/auth.js:
--------------------------------------------------------------------------------
1 | import axios from "./axios";
2 |
3 | export const registerRequest = async (user) =>
4 | axios.post(`/auth/register`, user);
5 |
6 | export const loginRequest = async (user) => axios.post(`/auth/login`, user);
7 |
8 | export const verifyTokenRequest = async () => axios.get(`/auth/verify`);
9 |
--------------------------------------------------------------------------------
/client/src/components/ui/Textarea.jsx:
--------------------------------------------------------------------------------
1 | import { forwardRef } from "react";
2 |
3 | export const Textarea = forwardRef((props, ref, rows = 2) => (
4 |
10 | ));
11 |
--------------------------------------------------------------------------------
/src/db.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 | import { MONGODB_URI } from "./config.js";
3 |
4 | export const connectDB = async () => {
5 | try {
6 | await mongoose.connect(MONGODB_URI);
7 | console.log("MongoDB is connected");
8 | } catch (error) {
9 | console.error(error);
10 | }
11 | };
12 |
--------------------------------------------------------------------------------
/src/middlewares/validator.middleware.js:
--------------------------------------------------------------------------------
1 | export const validateSchema = (schema) => (req, res, next) => {
2 | try {
3 | schema.parse(req.body);
4 | next();
5 | } catch (error) {
6 | return res
7 | .status(400)
8 | .json({ message: error.errors.map((error) => error.message) });
9 | }
10 | };
11 |
--------------------------------------------------------------------------------
/src/libs/jwt.js:
--------------------------------------------------------------------------------
1 | import { TOKEN_SECRET } from "../config.js";
2 | import jwt from "jsonwebtoken";
3 |
4 | export async function createAccessToken(payload) {
5 | return new Promise((resolve, reject) => {
6 | jwt.sign(payload, TOKEN_SECRET, { expiresIn: "1d" }, (err, token) => {
7 | if (err) reject(err);
8 | resolve(token);
9 | });
10 | });
11 | }
12 |
--------------------------------------------------------------------------------
/client/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/client/src/routes.jsx:
--------------------------------------------------------------------------------
1 | import { Navigate, Outlet } from "react-router-dom";
2 | import { useAuth } from "./context/authContext";
3 |
4 | export const ProtectedRoute = () => {
5 | const { isAuthenticated, loading } = useAuth();
6 |
7 | if (loading) return Loading...
;
8 | if (!isAuthenticated && !loading) return ;
9 | return ;
10 | };
11 |
--------------------------------------------------------------------------------
/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import app from "./app.js";
2 | import { PORT } from "./config.js";
3 | import { connectDB } from "./db.js";
4 |
5 | async function main() {
6 | try {
7 | await connectDB();
8 | app.listen(PORT);
9 | console.log(`Listening on port http://localhost:${PORT}`);
10 | console.log(`Environment: ${process.env.NODE_ENV}`)
11 | } catch (error) {
12 | console.error(error);
13 | }
14 | }
15 |
16 | main();
17 |
--------------------------------------------------------------------------------
/client/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/client/src/api/tasks.js:
--------------------------------------------------------------------------------
1 | import axios from "./axios";
2 |
3 | export const getTasksRequest = async () => axios.get("/tasks");
4 |
5 | export const createTaskRequest = async (task) => axios.post("/tasks", task);
6 |
7 | export const updateTaskRequest = async (task) =>
8 | axios.put(`/tasks/${task._id}`, task);
9 |
10 | export const deleteTaskRequest = async (id) => axios.delete(`/tasks/${id}`);
11 |
12 | export const getTaskRequest = async (id) => axios.get(`/tasks/${id}`);
13 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### MERN Stack CRUD with JWT
2 |
3 | This is a web application project using React, with a Nodejs Backend using Express and Mongodb as Database (MERN Stack)
4 |
5 | ### Installation with docker-compose (Recommended)
6 |
7 | ```sh
8 | docker-compose up -d
9 | npm run dev
10 | ```
11 |
12 | ### Deployment
13 |
14 | ```sh
15 | git clone https://github.com/FaztWeb/mern-tasks-auth
16 | cd mern-tasks-auth
17 | npm i
18 | npm run build
19 | npm start
20 | ```
21 |
22 | > You need to have a Mongodb database running
--------------------------------------------------------------------------------
/requests/auth.http:
--------------------------------------------------------------------------------
1 | @api = http://localhost:4000/api/auth
2 |
3 | ### post register
4 | POST {{api}}/register
5 | Content-Type: application/json
6 |
7 | {
8 | "username": "ryan2",
9 | "email": "ryan2@gmail.com",
10 | "password": "ryanpsasword"
11 | }
12 |
13 | ### post login
14 | POST {{api}}/login
15 | Content-Type: application/json
16 |
17 | {
18 | "email": "ryan2@gmail.com",
19 | "password": "ryanpsasword"
20 | }
21 |
22 | ### verified token
23 | GET {{api}}/verify
24 |
25 | ### Logout
26 | POST {{api}}/logout
--------------------------------------------------------------------------------
/src/models/user.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const userSchema = new mongoose.Schema(
4 | {
5 | username: {
6 | type: String,
7 | required: true,
8 | trim: true,
9 | },
10 | email: {
11 | type: String,
12 | required: true,
13 | unique: true,
14 | },
15 | password: {
16 | type: String,
17 | required: true,
18 | },
19 | },
20 | {
21 | timestamps: true,
22 | }
23 | );
24 |
25 | export default mongoose.model("User", userSchema);
26 |
--------------------------------------------------------------------------------
/src/models/task.model.js:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | const taskSchema = new mongoose.Schema(
4 | {
5 | title: {
6 | type: String,
7 | required: true,
8 | },
9 | description: {
10 | type: String,
11 | required: true,
12 | },
13 | date: {
14 | type: Date,
15 | default: Date.now,
16 | },
17 | user: {
18 | type: mongoose.Types.ObjectId,
19 | ref: "User",
20 | },
21 | },
22 | {
23 | timestamps: true,
24 | }
25 | );
26 |
27 | export default mongoose.model("Task", taskSchema);
28 |
--------------------------------------------------------------------------------
/src/routes/auth.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | login,
4 | logout,
5 | register,
6 | verifyToken,
7 | } from "../controllers/auth.controller.js";
8 | import { validateSchema } from "../middlewares/validator.middleware.js";
9 | import { loginSchema, registerSchema } from "../schemas/auth.schema.js";
10 |
11 | const router = Router();
12 |
13 | router.post("/register", validateSchema(registerSchema), register);
14 | router.post("/login", validateSchema(loginSchema), login);
15 | router.get("/verify", verifyToken);
16 | router.post("/logout", verifyToken, logout);
17 |
18 | export default router;
19 |
--------------------------------------------------------------------------------
/src/schemas/auth.schema.js:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const registerSchema = z.object({
4 | username: z.string({
5 | required_error: "Username is required",
6 | }),
7 | email: z
8 | .string({
9 | required_error: "Email is required",
10 | })
11 | .email({
12 | message: "Email is not valid",
13 | }),
14 | password: z
15 | .string({
16 | required_error: "Password is required",
17 | })
18 | .min(6, {
19 | message: "Password must be at least 6 characters",
20 | }),
21 | });
22 |
23 | export const loginSchema = z.object({
24 | email: z.string().email(),
25 | password: z.string().min(6),
26 | });
27 |
--------------------------------------------------------------------------------
/src/middlewares/auth.middleware.js:
--------------------------------------------------------------------------------
1 | import jwt from "jsonwebtoken";
2 | import { TOKEN_SECRET } from "../config.js";
3 |
4 | export const auth = (req, res, next) => {
5 | try {
6 | const { token } = req.cookies;
7 |
8 | if (!token)
9 | return res
10 | .status(401)
11 | .json({ message: "No token, authorization denied" });
12 |
13 | jwt.verify(token, TOKEN_SECRET, (error, user) => {
14 | if (error) {
15 | return res.status(401).json({ message: "Token is not valid" });
16 | }
17 | req.user = user;
18 | next();
19 | });
20 | } catch (error) {
21 | return res.status(500).json({ message: error.message });
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/client/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | height: 40vmin;
7 | pointer-events: none;
8 | }
9 |
10 | @media (prefers-reduced-motion: no-preference) {
11 | .App-logo {
12 | animation: App-logo-spin infinite 20s linear;
13 | }
14 | }
15 |
16 | .App-header {
17 | background-color: #282c34;
18 | min-height: 100vh;
19 | display: flex;
20 | flex-direction: column;
21 | align-items: center;
22 | justify-content: center;
23 | font-size: calc(10px + 2vmin);
24 | color: white;
25 | }
26 |
27 | .App-link {
28 | color: #61dafb;
29 | }
30 |
31 | @keyframes App-logo-spin {
32 | from {
33 | transform: rotate(0deg);
34 | }
35 | to {
36 | transform: rotate(360deg);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/routes/tasks.routes.js:
--------------------------------------------------------------------------------
1 | import { Router } from "express";
2 | import {
3 | createTask,
4 | deleteTask,
5 | getTask,
6 | getTasks,
7 | updateTask,
8 | } from "../controllers/tasks.controllers.js";
9 | import { auth } from "../middlewares/auth.middleware.js";
10 | import { validateSchema } from "../middlewares/validator.middleware.js";
11 | import { createTaskSchema } from "../schemas/task.schema.js";
12 |
13 | const router = Router();
14 |
15 | router.get("/tasks", auth, getTasks);
16 |
17 | router.post("/tasks", auth, validateSchema(createTaskSchema), createTask);
18 |
19 | router.get("/tasks/:id", auth, getTask);
20 |
21 | router.put("/tasks/:id", auth, updateTask);
22 |
23 | router.delete("/tasks/:id", auth, deleteTask);
24 |
25 | export default router;
26 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mern-tasks",
3 | "version": "1.0.0",
4 | "description": "A MERN CRUD with Authentication",
5 | "main": "index.js",
6 | "type": "module",
7 | "scripts": {
8 | "dev": "cross-env NODE_ENV=development nodemon src/index.js --ignore client",
9 | "start": "cross-env NODE_ENV=production node src/index.js"
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "license": "ISC",
14 | "dependencies": {
15 | "bcryptjs": "^2.4.3",
16 | "cookie-parser": "^1.4.6",
17 | "cors": "^2.8.5",
18 | "express": "^4.18.2",
19 | "jsonwebtoken": "^9.0.0",
20 | "mongoose": "^7.2.2",
21 | "morgan": "^1.10.0",
22 | "zod": "^3.21.4"
23 | },
24 | "devDependencies": {
25 | "cross-env": "^7.0.3",
26 | "dotenv": "^16.1.3",
27 | "nodemon": "^2.0.22"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "@hookform/resolvers": "^3.1.0",
13 | "axios": "^1.4.0",
14 | "dayjs": "^1.11.7",
15 | "dayjs-plugin-utc": "^0.1.2",
16 | "js-cookie": "^3.0.5",
17 | "react": "^18.2.0",
18 | "react-dom": "^18.2.0",
19 | "react-hook-form": "^7.44.3",
20 | "react-icons": "^4.9.0",
21 | "react-router-dom": "^6.11.2",
22 | "zod": "^3.21.4"
23 | },
24 | "devDependencies": {
25 | "@types/react": "^18.2.8",
26 | "@types/react-dom": "^18.2.4",
27 | "@vitejs/plugin-react": "^4.0.0",
28 | "autoprefixer": "^10.4.14",
29 | "postcss": "^8.4.24",
30 | "tailwindcss": "^3.3.2",
31 | "vite": "^4.3.9"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/app.js:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cors from "cors";
3 | import morgan from "morgan";
4 | import cookieParser from "cookie-parser";
5 |
6 | import authRoutes from "./routes/auth.routes.js";
7 | import taksRoutes from "./routes/tasks.routes.js";
8 | import { FRONTEND_URL } from "./config.js";
9 |
10 | const app = express();
11 |
12 | app.use(
13 | cors({
14 | credentials: true,
15 | origin: FRONTEND_URL,
16 | })
17 | );
18 | app.use(express.json());
19 | app.use(morgan("dev"));
20 | app.use(cookieParser());
21 |
22 | app.use("/api/auth", authRoutes);
23 | app.use("/api", taksRoutes);
24 |
25 | if (process.env.NODE_ENV === "production") {
26 | const path = await import("path");
27 | app.use(express.static("client/dist"));
28 |
29 | app.get("*", (req, res) => {
30 | console.log(path.resolve("client", "dist", "index.html") );
31 | res.sendFile(path.resolve("client", "dist", "index.html"));
32 | });
33 | }
34 |
35 | export default app;
36 |
--------------------------------------------------------------------------------
/requests/tasks.http:
--------------------------------------------------------------------------------
1 | @api = http://localhost:4000/api/tasks
2 | @token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzZjI1MDcyODM1ZWFkMTQ2MTJjOWE3OCIsInVzZXJuYW1lIjoicnlhbiIsImlhdCI6MTY3NjgyNDY5MCwiZXhwIjoxNjc2OTExMDkwfQ.Pvldt1v-iUPgnGKtZKb2RUtFohoVmOUsEENtdJi_NSc
3 |
4 | ### GET /tasks - Auth required
5 | GET {{api}}
6 | Authorization: {{token}}
7 |
8 | ### POST /tasks
9 | POST {{api}}
10 | Content-Type: application/json
11 | Authorization: {{token}}
12 |
13 | {
14 | "title": "My new task 3",
15 | "description": "My new task description 2",
16 | "date": "2023-02-01T00:00:00Z"
17 | }
18 |
19 | ### DELETE /tasks
20 | DELETE {{api}}/63f256b575d10c34095ab5a4
21 | Authorization: {{token}}
22 |
23 | ### GET /tasks/:id - Auth required
24 | GET {{api}}/63f25705f3c17dc1ef38d1c9
25 | Authorization: {{token}}
26 |
27 | ### UPDATE /tasks - Auth required
28 | PUT {{api}}/63f25705f3c17dc1ef38d1c9
29 | Authorization: {{token}}
30 | Content-Type: application/json
31 |
32 | {
33 | "title": "test1 "
34 | }
--------------------------------------------------------------------------------
/client/src/components/tasks/TaskCard.jsx:
--------------------------------------------------------------------------------
1 | import { useTasks } from "../../context/tasksContext";
2 | import { Button, ButtonLink, Card } from "../ui";
3 |
4 | export function TaskCard({ task }) {
5 | const { deleteTask } = useTasks();
6 |
7 | return (
8 |
9 |
16 | {task.description}
17 | {/* format date */}
18 |
19 | {task.date &&
20 | new Date(task.date).toLocaleDateString("en-US", {
21 | weekday: "long",
22 | year: "numeric",
23 | month: "long",
24 | day: "numeric",
25 | })}
26 |
27 |
28 | );
29 | }
30 |
--------------------------------------------------------------------------------
/client/src/pages/TasksPage.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { useTasks } from "../context/tasksContext";
3 | import { TaskCard } from "../components/tasks/TaskCard";
4 | import { ImFileEmpty } from "react-icons/im";
5 |
6 | export function TasksPage() {
7 | const { tasks, getTasks } = useTasks();
8 |
9 | useEffect(() => {
10 | getTasks();
11 | }, []);
12 |
13 | return (
14 | <>
15 | {tasks.length === 0 && (
16 |
17 |
18 |
19 |
20 | No tasks yet, please add a new task
21 |
22 |
23 |
24 | )}
25 |
26 |
27 | {tasks.map((task) => (
28 |
29 | ))}
30 |
31 | >
32 | );
33 | }
34 |
--------------------------------------------------------------------------------
/client/src/schemas/auth.js:
--------------------------------------------------------------------------------
1 | import { z } from "zod";
2 |
3 | export const loginSchema = z.object({
4 | email: z.string().email({
5 | message: "Please enter a valid email address",
6 | }),
7 | password: z.string().min(6, {
8 | message: "Password must be at least 6 characters",
9 | }),
10 | });
11 |
12 | export const registerSchema = z
13 | .object({
14 | username: z
15 | .string({
16 | required_error: "Username is required",
17 | })
18 | .min(3, {
19 | message: "Username must be at least 3 characters",
20 | }),
21 | email: z.string().email({
22 | message: "Please enter a valid email address",
23 | }),
24 | password: z.string().min(6, {
25 | message: "Password must be at least 6 characters",
26 | }),
27 | confirmPassword: z.string().min(6, {
28 | message: "Password must be at least 6 characters",
29 | }),
30 | })
31 | .refine((data) => data.password === data.confirmPassword, {
32 | message: "Passwords do not match",
33 | path: ["confirmPassword"],
34 | });
35 |
--------------------------------------------------------------------------------
/client/src/pages/HomePage.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 |
3 | function HomePage() {
4 | return (
5 |
6 |
7 | React Tasks
8 |
9 | Lorem ipsum dolor, sit amet consectetur adipisicing elit. Dignissimos
10 | fugit doloremque molestias recusandae labore repellat amet dicta tempore
11 | necessitatibus facilis repellendus voluptas ducimus maiores deserunt sed
12 | quo ratione provident debitis aut, voluptatem aliquam iste blanditiis
13 | ex? Voluptatibus, fuga quasi necessitatibus cumque optio error enim,
14 | officia accusantium vitae doloremque, molestias modi.
15 |
16 |
17 |
21 | Get Started
22 |
23 |
24 |
25 | );
26 | }
27 |
28 | export default HomePage;
29 |
--------------------------------------------------------------------------------
/client/src/components/Navbar.jsx:
--------------------------------------------------------------------------------
1 | import { Link } from "react-router-dom";
2 | import { useAuth } from "../context/authContext";
3 | import { ButtonLink } from "./ui/ButtonLink";
4 |
5 | export function Navbar() {
6 | const { isAuthenticated, logout, user } = useAuth();
7 | console.log(isAuthenticated, user)
8 |
9 | return (
10 |
41 | );
42 | }
43 |
--------------------------------------------------------------------------------
/client/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { BrowserRouter, Routes, Route } from "react-router-dom";
2 | import { Navbar } from "./components/Navbar";
3 | import { AuthProvider } from "./context/authContext";
4 | import { ProtectedRoute } from "./routes";
5 |
6 | import HomePage from "./pages/HomePage";
7 | import RegisterPage from "./pages/RegisterPage";
8 | import { TaskFormPage } from "./pages/TaskFormPage";
9 | import { LoginPage } from "./pages/LoginPage";
10 | import { TasksPage } from "./pages/TasksPage";
11 | import { TaskProvider } from "./context/tasksContext";
12 |
13 | function App() {
14 | return (
15 |
16 |
17 |
18 |
19 |
20 |
21 | } />
22 | } />
23 | } />
24 | }>
25 | } />
26 | } />
27 | } />
28 | Profile} />
29 |
30 |
31 |
32 |
33 |
34 |
35 | );
36 | }
37 |
38 | export default App;
39 |
--------------------------------------------------------------------------------
/client/src/context/tasksContext.jsx:
--------------------------------------------------------------------------------
1 | import { createContext, useContext, useState } from "react";
2 | import {
3 | createTaskRequest,
4 | deleteTaskRequest,
5 | getTasksRequest,
6 | getTaskRequest,
7 | updateTaskRequest,
8 | } from "../api/tasks";
9 |
10 | const TaskContext = createContext();
11 |
12 | export const useTasks = () => {
13 | const context = useContext(TaskContext);
14 | if (!context) throw new Error("useTasks must be used within a TaskProvider");
15 | return context;
16 | };
17 |
18 | export function TaskProvider({ children }) {
19 | const [tasks, setTasks] = useState([]);
20 |
21 | const getTasks = async () => {
22 | const res = await getTasksRequest();
23 | setTasks(res.data);
24 | };
25 |
26 | const deleteTask = async (id) => {
27 | try {
28 | const res = await deleteTaskRequest(id);
29 | if (res.status === 204) setTasks(tasks.filter((task) => task._id !== id));
30 | } catch (error) {
31 | console.log(error);
32 | }
33 | };
34 |
35 | const createTask = async (task) => {
36 | try {
37 | const res = await createTaskRequest(task);
38 | console.log(res.data);
39 | } catch (error) {
40 | console.log(error);
41 | }
42 | };
43 |
44 | const getTask = async (id) => {
45 | try {
46 | const res = await getTaskRequest(id);
47 | return res.data;
48 | } catch (error) {
49 | console.error(error);
50 | }
51 | };
52 |
53 | const updateTask = async (id, task) => {
54 | try {
55 | await updateTaskRequest(id, task);
56 | } catch (error) {
57 | console.error(error);
58 | }
59 | };
60 |
61 | return (
62 |
72 | {children}
73 |
74 | );
75 | }
76 |
--------------------------------------------------------------------------------
/src/controllers/tasks.controllers.js:
--------------------------------------------------------------------------------
1 | import Task from "../models/task.model.js";
2 |
3 | export const getTasks = async (req, res) => {
4 | try {
5 | const tasks = await Task.find({ user : req.user.id }).populate("user");
6 | res.json(tasks);
7 | } catch (error) {
8 | return res.status(500).json({ message: error.message });
9 | }
10 | };
11 |
12 | export const createTask = async (req, res) => {
13 | try {
14 | const { title, description, date } = req.body;
15 | const newTask = new Task({
16 | title,
17 | description,
18 | date,
19 | user: req.user.id,
20 | });
21 | await newTask.save();
22 | res.json(newTask);
23 | } catch (error) {
24 | return res.status(500).json({ message: error.message });
25 | }
26 | };
27 |
28 | export const deleteTask = async (req, res) => {
29 | try {
30 | const deletedTask = await Task.findByIdAndDelete(req.params.id);
31 | if (!deletedTask)
32 | return res.status(404).json({ message: "Task not found" });
33 |
34 | return res.sendStatus(204);
35 | } catch (error) {
36 | return res.status(500).json({ message: error.message });
37 | }
38 | };
39 |
40 | export const updateTask = async (req, res) => {
41 | try {
42 | const { title, description, date } = req.body;
43 | const taskUpdated = await Task.findOneAndUpdate(
44 | { _id: req.params.id },
45 | { title, description, date },
46 | { new: true }
47 | );
48 | return res.json(taskUpdated);
49 | } catch (error) {
50 | return res.status(500).json({ message: error.message });
51 | }
52 | };
53 |
54 | export const getTask = async (req, res) => {
55 | try {
56 | const task = await Task.findById(req.params.id);
57 | if (!task) return res.status(404).json({ message: "Task not found" });
58 | return res.json(task);
59 | } catch (error) {
60 | return res.status(500).json({ message: error.message });
61 | }
62 | };
63 |
--------------------------------------------------------------------------------
/client/src/pages/LoginPage.jsx:
--------------------------------------------------------------------------------
1 | import { useAuth } from "../context/authContext";
2 | import { Link, useNavigate } from "react-router-dom";
3 | import { useForm } from "react-hook-form";
4 | import { useEffect } from "react";
5 | import { zodResolver } from "@hookform/resolvers/zod";
6 | import { Card, Message, Button, Input, Label } from "../components/ui";
7 | import { loginSchema } from "../schemas/auth";
8 |
9 | export function LoginPage() {
10 | const {
11 | register,
12 | handleSubmit,
13 | formState: { errors },
14 | } = useForm({
15 | resolver: zodResolver(loginSchema),
16 | });
17 | const { signin, errors: loginErrors, isAuthenticated } = useAuth();
18 | const navigate = useNavigate();
19 |
20 | const onSubmit = (data) => signin(data);
21 |
22 | useEffect(() => {
23 | if (isAuthenticated) {
24 | navigate("/tasks");
25 | }
26 | }, [isAuthenticated]);
27 |
28 | return (
29 |
30 |
31 | {loginErrors.map((error, i) => (
32 |
33 | ))}
34 | Login
35 |
36 |
58 |
59 |
60 | Don't have an account? Sign up
61 |
62 |
63 |
64 | );
65 | }
66 |
--------------------------------------------------------------------------------
/client/src/pages/TaskFormPage.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { useNavigate, useParams } from "react-router-dom";
3 | import dayjs from "dayjs";
4 | import utc from "dayjs/plugin/utc";
5 | import { Button, Card, Input, Label } from "../components/ui";
6 | import { useTasks } from "../context/tasksContext";
7 | import { Textarea } from "../components/ui/Textarea";
8 | import { useForm } from "react-hook-form";
9 | dayjs.extend(utc);
10 |
11 | export function TaskFormPage() {
12 | const { createTask, getTask, updateTask } = useTasks();
13 | const navigate = useNavigate();
14 | const params = useParams();
15 | const {
16 | register,
17 | setValue,
18 | handleSubmit,
19 | formState: { errors },
20 | } = useForm();
21 |
22 | const onSubmit = async (data) => {
23 | try {
24 | if (params.id) {
25 | updateTask(params.id, {
26 | ...data,
27 | date: dayjs.utc(data.date).format(),
28 | });
29 | } else {
30 | createTask({
31 | ...data,
32 | date: dayjs.utc(data.date).format(),
33 | });
34 | }
35 |
36 | // navigate("/tasks");
37 | } catch (error) {
38 | console.log(error);
39 | // window.location.href = "/";
40 | }
41 | };
42 |
43 | useEffect(() => {
44 | const loadTask = async () => {
45 | if (params.id) {
46 | const task = await getTask(params.id);
47 | setValue("title", task.title);
48 | setValue("description", task.description);
49 | setValue(
50 | "date",
51 | task.date ? dayjs(task.date).utc().format("YYYY-MM-DD") : ""
52 | );
53 | setValue("completed", task.completed);
54 | }
55 | };
56 | loadTask();
57 | }, []);
58 |
59 | return (
60 |
61 |
87 |
88 | );
89 | }
90 |
--------------------------------------------------------------------------------
/client/src/context/authContext.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { createContext, useContext, useState } from "react";
3 | import { loginRequest, registerRequest, verifyTokenRequest } from "../api/auth";
4 | import Cookies from "js-cookie";
5 |
6 | const AuthContext = createContext();
7 |
8 | export const useAuth = () => {
9 | const context = useContext(AuthContext);
10 | if (!context) throw new Error("useAuth must be used within a AuthProvider");
11 | return context;
12 | };
13 |
14 | export const AuthProvider = ({ children }) => {
15 | const [user, setUser] = useState(null);
16 | const [isAuthenticated, setIsAuthenticated] = useState(false);
17 | const [errors, setErrors] = useState([]);
18 | const [loading, setLoading] = useState(true);
19 |
20 | // clear errors after 5 seconds
21 | useEffect(() => {
22 | if (errors.length > 0) {
23 | const timer = setTimeout(() => {
24 | setErrors([]);
25 | }, 5000);
26 | return () => clearTimeout(timer);
27 | }
28 | }, [errors]);
29 |
30 | const signup = async (user) => {
31 | try {
32 | const res = await registerRequest(user);
33 | if (res.status === 200) {
34 | setUser(res.data);
35 | setIsAuthenticated(true);
36 | }
37 | } catch (error) {
38 | console.log(error.response.data);
39 | setErrors(error.response.data.message);
40 | }
41 | };
42 |
43 | const signin = async (user) => {
44 | try {
45 | const res = await loginRequest(user);
46 | setUser(res.data);
47 | setIsAuthenticated(true);
48 | } catch (error) {
49 | console.log(error);
50 | // setErrors(error.response.data.message);
51 | }
52 | };
53 |
54 | const logout = () => {
55 | Cookies.remove("token");
56 | setUser(null);
57 | setIsAuthenticated(false);
58 | };
59 |
60 | useEffect(() => {
61 | const checkLogin = async () => {
62 | const cookies = Cookies.get();
63 | if (!cookies.token) {
64 | setIsAuthenticated(false);
65 | setLoading(false);
66 | return;
67 | }
68 |
69 | try {
70 | const res = await verifyTokenRequest(cookies.token);
71 | console.log(res);
72 | if (!res.data) return setIsAuthenticated(false);
73 | setIsAuthenticated(true);
74 | setUser(res.data);
75 | setLoading(false);
76 | } catch (error) {
77 | setIsAuthenticated(false);
78 | setLoading(false);
79 | }
80 | };
81 | checkLogin();
82 | }, []);
83 |
84 | return (
85 |
96 | {children}
97 |
98 | );
99 | };
100 |
101 | export default AuthContext;
102 |
--------------------------------------------------------------------------------
/client/src/pages/RegisterPage.jsx:
--------------------------------------------------------------------------------
1 | import { useEffect } from "react";
2 | import { useAuth } from "../context/authContext";
3 | import { Link, useNavigate } from "react-router-dom";
4 | import { Card, Message, Button, Input, Label } from "../components/ui";
5 | import { useForm } from "react-hook-form";
6 | import { registerSchema } from "../schemas/auth";
7 | import { zodResolver } from "@hookform/resolvers/zod";
8 |
9 | function Register() {
10 | const { signup, errors: registerErrors, isAuthenticated } = useAuth();
11 | const {
12 | register,
13 | handleSubmit,
14 | formState: { errors },
15 | } = useForm({
16 | resolver: zodResolver(registerSchema),
17 | });
18 | const navigate = useNavigate();
19 |
20 | const onSubmit = async (value) => {
21 | await signup(value);
22 | };
23 |
24 | useEffect(() => {
25 | if (isAuthenticated) navigate("/tasks");
26 | }, [isAuthenticated]);
27 |
28 | return (
29 |
89 | );
90 | }
91 |
92 | export default Register;
93 |
--------------------------------------------------------------------------------
/src/controllers/auth.controller.js:
--------------------------------------------------------------------------------
1 | import User from "../models/user.model.js";
2 | import jwt from "jsonwebtoken";
3 | import bcrypt from "bcryptjs";
4 | import { TOKEN_SECRET } from "../config.js";
5 | import { createAccessToken } from "../libs/jwt.js";
6 |
7 | export const register = async (req, res) => {
8 | try {
9 | const { username, email, password } = req.body;
10 |
11 | const userFound = await User.findOne({ email });
12 |
13 | if (userFound)
14 | return res.status(400).json({
15 | message: ["The email is already in use"],
16 | });
17 |
18 | // hashing the password
19 | const passwordHash = await bcrypt.hash(password, 10);
20 |
21 | // creating the user
22 | const newUser = new User({
23 | username,
24 | email,
25 | password: passwordHash,
26 | });
27 |
28 | // saving the user in the database
29 | const userSaved = await newUser.save();
30 |
31 | // create access token
32 | const token = await createAccessToken({
33 | id: userSaved._id,
34 | });
35 |
36 | res.cookie("token", token, {
37 | httpOnly: process.env.NODE_ENV !== "development",
38 | secure: true,
39 | sameSite: "none",
40 | });
41 |
42 | res.json({
43 | id: userSaved._id,
44 | username: userSaved.username,
45 | email: userSaved.email,
46 | });
47 | } catch (error) {
48 | res.status(500).json({ message: error.message });
49 | }
50 | };
51 |
52 | export const login = async (req, res) => {
53 | try {
54 | const { email, password } = req.body;
55 | const userFound = await User.findOne({ email });
56 |
57 | if (!userFound)
58 | return res.status(400).json({
59 | message: ["The email does not exist"],
60 | });
61 |
62 | const isMatch = await bcrypt.compare(password, userFound.password);
63 | if (!isMatch) {
64 | return res.status(400).json({
65 | message: ["The password is incorrect"],
66 | });
67 | }
68 |
69 | const token = await createAccessToken({
70 | id: userFound._id,
71 | username: userFound.username,
72 | });
73 |
74 | res.cookie("token", token, {
75 | httpOnly: process.env.NODE_ENV !== "development",
76 | secure: true,
77 | sameSite: "none",
78 | });
79 |
80 | res.json({
81 | id: userFound._id,
82 | username: userFound.username,
83 | email: userFound.email,
84 | });
85 | } catch (error) {
86 | return res.status(500).json({ message: error.message });
87 | }
88 | };
89 |
90 | export const verifyToken = async (req, res) => {
91 | const { token } = req.cookies;
92 | if (!token) return res.send(false);
93 |
94 | jwt.verify(token, TOKEN_SECRET, async (error, user) => {
95 | if (error) return res.sendStatus(401);
96 |
97 | const userFound = await User.findById(user.id);
98 | if (!userFound) return res.sendStatus(401);
99 |
100 | return res.json({
101 | id: userFound._id,
102 | username: userFound.username,
103 | email: userFound.email,
104 | });
105 | });
106 | };
107 |
108 | export const logout = async (req, res) => {
109 | res.cookie("token", "", {
110 | httpOnly: true,
111 | secure: true,
112 | expires: new Date(0),
113 | });
114 | return res.sendStatus(200);
115 | };
116 |
--------------------------------------------------------------------------------
/client/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | dependencies:
4 | bcryptjs:
5 | specifier: ^2.4.3
6 | version: 2.4.3
7 | cookie-parser:
8 | specifier: ^1.4.6
9 | version: 1.4.6
10 | cors:
11 | specifier: ^2.8.5
12 | version: 2.8.5
13 | express:
14 | specifier: ^4.18.2
15 | version: 4.18.2
16 | jsonwebtoken:
17 | specifier: ^9.0.0
18 | version: 9.0.0
19 | mongoose:
20 | specifier: ^7.2.2
21 | version: 7.2.2
22 | morgan:
23 | specifier: ^1.10.0
24 | version: 1.10.0
25 | zod:
26 | specifier: ^3.21.4
27 | version: 3.21.4
28 |
29 | devDependencies:
30 | cross-env:
31 | specifier: ^7.0.3
32 | version: 7.0.3
33 | dotenv:
34 | specifier: ^16.1.3
35 | version: 16.1.3
36 | nodemon:
37 | specifier: ^2.0.22
38 | version: 2.0.22
39 |
40 | packages:
41 |
42 | /@types/node@18.13.0:
43 | resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==}
44 | dev: false
45 |
46 | /@types/webidl-conversions@7.0.0:
47 | resolution: {integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==}
48 | dev: false
49 |
50 | /@types/whatwg-url@8.2.2:
51 | resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==}
52 | dependencies:
53 | '@types/node': 18.13.0
54 | '@types/webidl-conversions': 7.0.0
55 | dev: false
56 |
57 | /abbrev@1.1.1:
58 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
59 | dev: true
60 |
61 | /accepts@1.3.8:
62 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
63 | engines: {node: '>= 0.6'}
64 | dependencies:
65 | mime-types: 2.1.35
66 | negotiator: 0.6.3
67 | dev: false
68 |
69 | /anymatch@3.1.3:
70 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
71 | engines: {node: '>= 8'}
72 | dependencies:
73 | normalize-path: 3.0.0
74 | picomatch: 2.3.1
75 | dev: true
76 |
77 | /array-flatten@1.1.1:
78 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
79 | dev: false
80 |
81 | /balanced-match@1.0.2:
82 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
83 | dev: true
84 |
85 | /basic-auth@2.0.1:
86 | resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==}
87 | engines: {node: '>= 0.8'}
88 | dependencies:
89 | safe-buffer: 5.1.2
90 | dev: false
91 |
92 | /bcryptjs@2.4.3:
93 | resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==}
94 | dev: false
95 |
96 | /binary-extensions@2.2.0:
97 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
98 | engines: {node: '>=8'}
99 | dev: true
100 |
101 | /body-parser@1.20.1:
102 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
103 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
104 | dependencies:
105 | bytes: 3.1.2
106 | content-type: 1.0.5
107 | debug: 2.6.9
108 | depd: 2.0.0
109 | destroy: 1.2.0
110 | http-errors: 2.0.0
111 | iconv-lite: 0.4.24
112 | on-finished: 2.4.1
113 | qs: 6.11.0
114 | raw-body: 2.5.1
115 | type-is: 1.6.18
116 | unpipe: 1.0.0
117 | transitivePeerDependencies:
118 | - supports-color
119 | dev: false
120 |
121 | /brace-expansion@1.1.11:
122 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
123 | dependencies:
124 | balanced-match: 1.0.2
125 | concat-map: 0.0.1
126 | dev: true
127 |
128 | /braces@3.0.2:
129 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
130 | engines: {node: '>=8'}
131 | dependencies:
132 | fill-range: 7.0.1
133 | dev: true
134 |
135 | /bson@5.3.0:
136 | resolution: {integrity: sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag==}
137 | engines: {node: '>=14.20.1'}
138 | dev: false
139 |
140 | /buffer-equal-constant-time@1.0.1:
141 | resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
142 | dev: false
143 |
144 | /bytes@3.1.2:
145 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
146 | engines: {node: '>= 0.8'}
147 | dev: false
148 |
149 | /call-bind@1.0.2:
150 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
151 | dependencies:
152 | function-bind: 1.1.1
153 | get-intrinsic: 1.2.0
154 | dev: false
155 |
156 | /chokidar@3.5.3:
157 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
158 | engines: {node: '>= 8.10.0'}
159 | dependencies:
160 | anymatch: 3.1.3
161 | braces: 3.0.2
162 | glob-parent: 5.1.2
163 | is-binary-path: 2.1.0
164 | is-glob: 4.0.3
165 | normalize-path: 3.0.0
166 | readdirp: 3.6.0
167 | optionalDependencies:
168 | fsevents: 2.3.2
169 | dev: true
170 |
171 | /concat-map@0.0.1:
172 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
173 | dev: true
174 |
175 | /content-disposition@0.5.4:
176 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
177 | engines: {node: '>= 0.6'}
178 | dependencies:
179 | safe-buffer: 5.2.1
180 | dev: false
181 |
182 | /content-type@1.0.5:
183 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
184 | engines: {node: '>= 0.6'}
185 | dev: false
186 |
187 | /cookie-parser@1.4.6:
188 | resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==}
189 | engines: {node: '>= 0.8.0'}
190 | dependencies:
191 | cookie: 0.4.1
192 | cookie-signature: 1.0.6
193 | dev: false
194 |
195 | /cookie-signature@1.0.6:
196 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
197 | dev: false
198 |
199 | /cookie@0.4.1:
200 | resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==}
201 | engines: {node: '>= 0.6'}
202 | dev: false
203 |
204 | /cookie@0.5.0:
205 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
206 | engines: {node: '>= 0.6'}
207 | dev: false
208 |
209 | /cors@2.8.5:
210 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
211 | engines: {node: '>= 0.10'}
212 | dependencies:
213 | object-assign: 4.1.1
214 | vary: 1.1.2
215 | dev: false
216 |
217 | /cross-env@7.0.3:
218 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
219 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
220 | hasBin: true
221 | dependencies:
222 | cross-spawn: 7.0.3
223 | dev: true
224 |
225 | /cross-spawn@7.0.3:
226 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
227 | engines: {node: '>= 8'}
228 | dependencies:
229 | path-key: 3.1.1
230 | shebang-command: 2.0.0
231 | which: 2.0.2
232 | dev: true
233 |
234 | /debug@2.6.9:
235 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
236 | peerDependencies:
237 | supports-color: '*'
238 | peerDependenciesMeta:
239 | supports-color:
240 | optional: true
241 | dependencies:
242 | ms: 2.0.0
243 | dev: false
244 |
245 | /debug@3.2.7(supports-color@5.5.0):
246 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
247 | peerDependencies:
248 | supports-color: '*'
249 | peerDependenciesMeta:
250 | supports-color:
251 | optional: true
252 | dependencies:
253 | ms: 2.1.3
254 | supports-color: 5.5.0
255 | dev: true
256 |
257 | /debug@4.3.4:
258 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
259 | engines: {node: '>=6.0'}
260 | peerDependencies:
261 | supports-color: '*'
262 | peerDependenciesMeta:
263 | supports-color:
264 | optional: true
265 | dependencies:
266 | ms: 2.1.2
267 | dev: false
268 |
269 | /depd@2.0.0:
270 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
271 | engines: {node: '>= 0.8'}
272 | dev: false
273 |
274 | /destroy@1.2.0:
275 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
276 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
277 | dev: false
278 |
279 | /dotenv@16.1.3:
280 | resolution: {integrity: sha512-FYssxsmCTtKL72fGBSvb1K9dRz0/VZeWqFme/vSb7r7323x4CRaHu4LvQ5JG3+s6yt2YPbBrkpiEODktfyjI9A==}
281 | engines: {node: '>=12'}
282 | dev: true
283 |
284 | /ecdsa-sig-formatter@1.0.11:
285 | resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
286 | dependencies:
287 | safe-buffer: 5.2.1
288 | dev: false
289 |
290 | /ee-first@1.1.1:
291 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
292 | dev: false
293 |
294 | /encodeurl@1.0.2:
295 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
296 | engines: {node: '>= 0.8'}
297 | dev: false
298 |
299 | /escape-html@1.0.3:
300 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
301 | dev: false
302 |
303 | /etag@1.8.1:
304 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
305 | engines: {node: '>= 0.6'}
306 | dev: false
307 |
308 | /express@4.18.2:
309 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
310 | engines: {node: '>= 0.10.0'}
311 | dependencies:
312 | accepts: 1.3.8
313 | array-flatten: 1.1.1
314 | body-parser: 1.20.1
315 | content-disposition: 0.5.4
316 | content-type: 1.0.5
317 | cookie: 0.5.0
318 | cookie-signature: 1.0.6
319 | debug: 2.6.9
320 | depd: 2.0.0
321 | encodeurl: 1.0.2
322 | escape-html: 1.0.3
323 | etag: 1.8.1
324 | finalhandler: 1.2.0
325 | fresh: 0.5.2
326 | http-errors: 2.0.0
327 | merge-descriptors: 1.0.1
328 | methods: 1.1.2
329 | on-finished: 2.4.1
330 | parseurl: 1.3.3
331 | path-to-regexp: 0.1.7
332 | proxy-addr: 2.0.7
333 | qs: 6.11.0
334 | range-parser: 1.2.1
335 | safe-buffer: 5.2.1
336 | send: 0.18.0
337 | serve-static: 1.15.0
338 | setprototypeof: 1.2.0
339 | statuses: 2.0.1
340 | type-is: 1.6.18
341 | utils-merge: 1.0.1
342 | vary: 1.1.2
343 | transitivePeerDependencies:
344 | - supports-color
345 | dev: false
346 |
347 | /fill-range@7.0.1:
348 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
349 | engines: {node: '>=8'}
350 | dependencies:
351 | to-regex-range: 5.0.1
352 | dev: true
353 |
354 | /finalhandler@1.2.0:
355 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
356 | engines: {node: '>= 0.8'}
357 | dependencies:
358 | debug: 2.6.9
359 | encodeurl: 1.0.2
360 | escape-html: 1.0.3
361 | on-finished: 2.4.1
362 | parseurl: 1.3.3
363 | statuses: 2.0.1
364 | unpipe: 1.0.0
365 | transitivePeerDependencies:
366 | - supports-color
367 | dev: false
368 |
369 | /forwarded@0.2.0:
370 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
371 | engines: {node: '>= 0.6'}
372 | dev: false
373 |
374 | /fresh@0.5.2:
375 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
376 | engines: {node: '>= 0.6'}
377 | dev: false
378 |
379 | /fsevents@2.3.2:
380 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
381 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
382 | os: [darwin]
383 | requiresBuild: true
384 | dev: true
385 | optional: true
386 |
387 | /function-bind@1.1.1:
388 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
389 | dev: false
390 |
391 | /get-intrinsic@1.2.0:
392 | resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==}
393 | dependencies:
394 | function-bind: 1.1.1
395 | has: 1.0.3
396 | has-symbols: 1.0.3
397 | dev: false
398 |
399 | /glob-parent@5.1.2:
400 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
401 | engines: {node: '>= 6'}
402 | dependencies:
403 | is-glob: 4.0.3
404 | dev: true
405 |
406 | /has-flag@3.0.0:
407 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
408 | engines: {node: '>=4'}
409 | dev: true
410 |
411 | /has-symbols@1.0.3:
412 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
413 | engines: {node: '>= 0.4'}
414 | dev: false
415 |
416 | /has@1.0.3:
417 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
418 | engines: {node: '>= 0.4.0'}
419 | dependencies:
420 | function-bind: 1.1.1
421 | dev: false
422 |
423 | /http-errors@2.0.0:
424 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
425 | engines: {node: '>= 0.8'}
426 | dependencies:
427 | depd: 2.0.0
428 | inherits: 2.0.4
429 | setprototypeof: 1.2.0
430 | statuses: 2.0.1
431 | toidentifier: 1.0.1
432 | dev: false
433 |
434 | /iconv-lite@0.4.24:
435 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
436 | engines: {node: '>=0.10.0'}
437 | dependencies:
438 | safer-buffer: 2.1.2
439 | dev: false
440 |
441 | /ignore-by-default@1.0.1:
442 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
443 | dev: true
444 |
445 | /inherits@2.0.4:
446 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
447 | dev: false
448 |
449 | /ip@2.0.0:
450 | resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==}
451 | dev: false
452 |
453 | /ipaddr.js@1.9.1:
454 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
455 | engines: {node: '>= 0.10'}
456 | dev: false
457 |
458 | /is-binary-path@2.1.0:
459 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
460 | engines: {node: '>=8'}
461 | dependencies:
462 | binary-extensions: 2.2.0
463 | dev: true
464 |
465 | /is-extglob@2.1.1:
466 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
467 | engines: {node: '>=0.10.0'}
468 | dev: true
469 |
470 | /is-glob@4.0.3:
471 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
472 | engines: {node: '>=0.10.0'}
473 | dependencies:
474 | is-extglob: 2.1.1
475 | dev: true
476 |
477 | /is-number@7.0.0:
478 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
479 | engines: {node: '>=0.12.0'}
480 | dev: true
481 |
482 | /isexe@2.0.0:
483 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
484 | dev: true
485 |
486 | /jsonwebtoken@9.0.0:
487 | resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==}
488 | engines: {node: '>=12', npm: '>=6'}
489 | dependencies:
490 | jws: 3.2.2
491 | lodash: 4.17.21
492 | ms: 2.1.3
493 | semver: 7.3.8
494 | dev: false
495 |
496 | /jwa@1.4.1:
497 | resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
498 | dependencies:
499 | buffer-equal-constant-time: 1.0.1
500 | ecdsa-sig-formatter: 1.0.11
501 | safe-buffer: 5.2.1
502 | dev: false
503 |
504 | /jws@3.2.2:
505 | resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
506 | dependencies:
507 | jwa: 1.4.1
508 | safe-buffer: 5.2.1
509 | dev: false
510 |
511 | /kareem@2.5.1:
512 | resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==}
513 | engines: {node: '>=12.0.0'}
514 | dev: false
515 |
516 | /lodash@4.17.21:
517 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
518 | dev: false
519 |
520 | /lru-cache@6.0.0:
521 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
522 | engines: {node: '>=10'}
523 | dependencies:
524 | yallist: 4.0.0
525 | dev: false
526 |
527 | /media-typer@0.3.0:
528 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
529 | engines: {node: '>= 0.6'}
530 | dev: false
531 |
532 | /memory-pager@1.5.0:
533 | resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==}
534 | dev: false
535 | optional: true
536 |
537 | /merge-descriptors@1.0.1:
538 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
539 | dev: false
540 |
541 | /methods@1.1.2:
542 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
543 | engines: {node: '>= 0.6'}
544 | dev: false
545 |
546 | /mime-db@1.52.0:
547 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
548 | engines: {node: '>= 0.6'}
549 | dev: false
550 |
551 | /mime-types@2.1.35:
552 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
553 | engines: {node: '>= 0.6'}
554 | dependencies:
555 | mime-db: 1.52.0
556 | dev: false
557 |
558 | /mime@1.6.0:
559 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
560 | engines: {node: '>=4'}
561 | hasBin: true
562 | dev: false
563 |
564 | /minimatch@3.1.2:
565 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
566 | dependencies:
567 | brace-expansion: 1.1.11
568 | dev: true
569 |
570 | /mongodb-connection-string-url@2.6.0:
571 | resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==}
572 | dependencies:
573 | '@types/whatwg-url': 8.2.2
574 | whatwg-url: 11.0.0
575 | dev: false
576 |
577 | /mongodb@5.5.0:
578 | resolution: {integrity: sha512-XgrkUgAAdfnZKQfk5AsYL8j7O99WHd4YXPxYxnh8dZxD+ekYWFRA3JktUsBnfg+455Smf75/+asoU/YLwNGoQQ==}
579 | engines: {node: '>=14.20.1'}
580 | peerDependencies:
581 | '@aws-sdk/credential-providers': ^3.201.0
582 | mongodb-client-encryption: '>=2.3.0 <3'
583 | snappy: ^7.2.2
584 | peerDependenciesMeta:
585 | '@aws-sdk/credential-providers':
586 | optional: true
587 | mongodb-client-encryption:
588 | optional: true
589 | snappy:
590 | optional: true
591 | dependencies:
592 | bson: 5.3.0
593 | mongodb-connection-string-url: 2.6.0
594 | socks: 2.7.1
595 | optionalDependencies:
596 | saslprep: 1.0.3
597 | dev: false
598 |
599 | /mongoose@7.2.2:
600 | resolution: {integrity: sha512-JPBMTF+oYfLGVFWbHSZ/H+f1GajNanGLYH6c/P0nE3bNJfwGhX573vieGR0kNlNhj3cZk8WCPrnVsTNeUmFUag==}
601 | engines: {node: '>=14.20.1'}
602 | dependencies:
603 | bson: 5.3.0
604 | kareem: 2.5.1
605 | mongodb: 5.5.0
606 | mpath: 0.9.0
607 | mquery: 5.0.0
608 | ms: 2.1.3
609 | sift: 16.0.1
610 | transitivePeerDependencies:
611 | - '@aws-sdk/credential-providers'
612 | - mongodb-client-encryption
613 | - snappy
614 | - supports-color
615 | dev: false
616 |
617 | /morgan@1.10.0:
618 | resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==}
619 | engines: {node: '>= 0.8.0'}
620 | dependencies:
621 | basic-auth: 2.0.1
622 | debug: 2.6.9
623 | depd: 2.0.0
624 | on-finished: 2.3.0
625 | on-headers: 1.0.2
626 | transitivePeerDependencies:
627 | - supports-color
628 | dev: false
629 |
630 | /mpath@0.9.0:
631 | resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==}
632 | engines: {node: '>=4.0.0'}
633 | dev: false
634 |
635 | /mquery@5.0.0:
636 | resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==}
637 | engines: {node: '>=14.0.0'}
638 | dependencies:
639 | debug: 4.3.4
640 | transitivePeerDependencies:
641 | - supports-color
642 | dev: false
643 |
644 | /ms@2.0.0:
645 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
646 | dev: false
647 |
648 | /ms@2.1.2:
649 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
650 | dev: false
651 |
652 | /ms@2.1.3:
653 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
654 |
655 | /negotiator@0.6.3:
656 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
657 | engines: {node: '>= 0.6'}
658 | dev: false
659 |
660 | /nodemon@2.0.22:
661 | resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==}
662 | engines: {node: '>=8.10.0'}
663 | hasBin: true
664 | dependencies:
665 | chokidar: 3.5.3
666 | debug: 3.2.7(supports-color@5.5.0)
667 | ignore-by-default: 1.0.1
668 | minimatch: 3.1.2
669 | pstree.remy: 1.1.8
670 | semver: 5.7.1
671 | simple-update-notifier: 1.1.0
672 | supports-color: 5.5.0
673 | touch: 3.1.0
674 | undefsafe: 2.0.5
675 | dev: true
676 |
677 | /nopt@1.0.10:
678 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==}
679 | hasBin: true
680 | dependencies:
681 | abbrev: 1.1.1
682 | dev: true
683 |
684 | /normalize-path@3.0.0:
685 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
686 | engines: {node: '>=0.10.0'}
687 | dev: true
688 |
689 | /object-assign@4.1.1:
690 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
691 | engines: {node: '>=0.10.0'}
692 | dev: false
693 |
694 | /object-inspect@1.12.3:
695 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
696 | dev: false
697 |
698 | /on-finished@2.3.0:
699 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
700 | engines: {node: '>= 0.8'}
701 | dependencies:
702 | ee-first: 1.1.1
703 | dev: false
704 |
705 | /on-finished@2.4.1:
706 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
707 | engines: {node: '>= 0.8'}
708 | dependencies:
709 | ee-first: 1.1.1
710 | dev: false
711 |
712 | /on-headers@1.0.2:
713 | resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
714 | engines: {node: '>= 0.8'}
715 | dev: false
716 |
717 | /parseurl@1.3.3:
718 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
719 | engines: {node: '>= 0.8'}
720 | dev: false
721 |
722 | /path-key@3.1.1:
723 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
724 | engines: {node: '>=8'}
725 | dev: true
726 |
727 | /path-to-regexp@0.1.7:
728 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
729 | dev: false
730 |
731 | /picomatch@2.3.1:
732 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
733 | engines: {node: '>=8.6'}
734 | dev: true
735 |
736 | /proxy-addr@2.0.7:
737 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
738 | engines: {node: '>= 0.10'}
739 | dependencies:
740 | forwarded: 0.2.0
741 | ipaddr.js: 1.9.1
742 | dev: false
743 |
744 | /pstree.remy@1.1.8:
745 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
746 | dev: true
747 |
748 | /punycode@2.3.0:
749 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
750 | engines: {node: '>=6'}
751 | dev: false
752 |
753 | /qs@6.11.0:
754 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
755 | engines: {node: '>=0.6'}
756 | dependencies:
757 | side-channel: 1.0.4
758 | dev: false
759 |
760 | /range-parser@1.2.1:
761 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
762 | engines: {node: '>= 0.6'}
763 | dev: false
764 |
765 | /raw-body@2.5.1:
766 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
767 | engines: {node: '>= 0.8'}
768 | dependencies:
769 | bytes: 3.1.2
770 | http-errors: 2.0.0
771 | iconv-lite: 0.4.24
772 | unpipe: 1.0.0
773 | dev: false
774 |
775 | /readdirp@3.6.0:
776 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
777 | engines: {node: '>=8.10.0'}
778 | dependencies:
779 | picomatch: 2.3.1
780 | dev: true
781 |
782 | /safe-buffer@5.1.2:
783 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
784 | dev: false
785 |
786 | /safe-buffer@5.2.1:
787 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
788 | dev: false
789 |
790 | /safer-buffer@2.1.2:
791 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
792 | dev: false
793 |
794 | /saslprep@1.0.3:
795 | resolution: {integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==}
796 | engines: {node: '>=6'}
797 | requiresBuild: true
798 | dependencies:
799 | sparse-bitfield: 3.0.3
800 | dev: false
801 | optional: true
802 |
803 | /semver@5.7.1:
804 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
805 | hasBin: true
806 | dev: true
807 |
808 | /semver@7.0.0:
809 | resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==}
810 | hasBin: true
811 | dev: true
812 |
813 | /semver@7.3.8:
814 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==}
815 | engines: {node: '>=10'}
816 | hasBin: true
817 | dependencies:
818 | lru-cache: 6.0.0
819 | dev: false
820 |
821 | /send@0.18.0:
822 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
823 | engines: {node: '>= 0.8.0'}
824 | dependencies:
825 | debug: 2.6.9
826 | depd: 2.0.0
827 | destroy: 1.2.0
828 | encodeurl: 1.0.2
829 | escape-html: 1.0.3
830 | etag: 1.8.1
831 | fresh: 0.5.2
832 | http-errors: 2.0.0
833 | mime: 1.6.0
834 | ms: 2.1.3
835 | on-finished: 2.4.1
836 | range-parser: 1.2.1
837 | statuses: 2.0.1
838 | transitivePeerDependencies:
839 | - supports-color
840 | dev: false
841 |
842 | /serve-static@1.15.0:
843 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
844 | engines: {node: '>= 0.8.0'}
845 | dependencies:
846 | encodeurl: 1.0.2
847 | escape-html: 1.0.3
848 | parseurl: 1.3.3
849 | send: 0.18.0
850 | transitivePeerDependencies:
851 | - supports-color
852 | dev: false
853 |
854 | /setprototypeof@1.2.0:
855 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
856 | dev: false
857 |
858 | /shebang-command@2.0.0:
859 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
860 | engines: {node: '>=8'}
861 | dependencies:
862 | shebang-regex: 3.0.0
863 | dev: true
864 |
865 | /shebang-regex@3.0.0:
866 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
867 | engines: {node: '>=8'}
868 | dev: true
869 |
870 | /side-channel@1.0.4:
871 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
872 | dependencies:
873 | call-bind: 1.0.2
874 | get-intrinsic: 1.2.0
875 | object-inspect: 1.12.3
876 | dev: false
877 |
878 | /sift@16.0.1:
879 | resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==}
880 | dev: false
881 |
882 | /simple-update-notifier@1.1.0:
883 | resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==}
884 | engines: {node: '>=8.10.0'}
885 | dependencies:
886 | semver: 7.0.0
887 | dev: true
888 |
889 | /smart-buffer@4.2.0:
890 | resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
891 | engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
892 | dev: false
893 |
894 | /socks@2.7.1:
895 | resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==}
896 | engines: {node: '>= 10.13.0', npm: '>= 3.0.0'}
897 | dependencies:
898 | ip: 2.0.0
899 | smart-buffer: 4.2.0
900 | dev: false
901 |
902 | /sparse-bitfield@3.0.3:
903 | resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==}
904 | dependencies:
905 | memory-pager: 1.5.0
906 | dev: false
907 | optional: true
908 |
909 | /statuses@2.0.1:
910 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
911 | engines: {node: '>= 0.8'}
912 | dev: false
913 |
914 | /supports-color@5.5.0:
915 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
916 | engines: {node: '>=4'}
917 | dependencies:
918 | has-flag: 3.0.0
919 | dev: true
920 |
921 | /to-regex-range@5.0.1:
922 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
923 | engines: {node: '>=8.0'}
924 | dependencies:
925 | is-number: 7.0.0
926 | dev: true
927 |
928 | /toidentifier@1.0.1:
929 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
930 | engines: {node: '>=0.6'}
931 | dev: false
932 |
933 | /touch@3.1.0:
934 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==}
935 | hasBin: true
936 | dependencies:
937 | nopt: 1.0.10
938 | dev: true
939 |
940 | /tr46@3.0.0:
941 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
942 | engines: {node: '>=12'}
943 | dependencies:
944 | punycode: 2.3.0
945 | dev: false
946 |
947 | /type-is@1.6.18:
948 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
949 | engines: {node: '>= 0.6'}
950 | dependencies:
951 | media-typer: 0.3.0
952 | mime-types: 2.1.35
953 | dev: false
954 |
955 | /undefsafe@2.0.5:
956 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
957 | dev: true
958 |
959 | /unpipe@1.0.0:
960 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
961 | engines: {node: '>= 0.8'}
962 | dev: false
963 |
964 | /utils-merge@1.0.1:
965 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
966 | engines: {node: '>= 0.4.0'}
967 | dev: false
968 |
969 | /vary@1.1.2:
970 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
971 | engines: {node: '>= 0.8'}
972 | dev: false
973 |
974 | /webidl-conversions@7.0.0:
975 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
976 | engines: {node: '>=12'}
977 | dev: false
978 |
979 | /whatwg-url@11.0.0:
980 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
981 | engines: {node: '>=12'}
982 | dependencies:
983 | tr46: 3.0.0
984 | webidl-conversions: 7.0.0
985 | dev: false
986 |
987 | /which@2.0.2:
988 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
989 | engines: {node: '>= 8'}
990 | hasBin: true
991 | dependencies:
992 | isexe: 2.0.0
993 | dev: true
994 |
995 | /yallist@4.0.0:
996 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
997 | dev: false
998 |
999 | /zod@3.21.4:
1000 | resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
1001 | dev: false
1002 |
--------------------------------------------------------------------------------
/client/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '6.0'
2 |
3 | dependencies:
4 | '@hookform/resolvers':
5 | specifier: ^3.1.0
6 | version: 3.1.0(react-hook-form@7.44.3)
7 | axios:
8 | specifier: ^1.4.0
9 | version: 1.4.0
10 | dayjs:
11 | specifier: ^1.11.7
12 | version: 1.11.7
13 | dayjs-plugin-utc:
14 | specifier: ^0.1.2
15 | version: 0.1.2
16 | js-cookie:
17 | specifier: ^3.0.5
18 | version: 3.0.5
19 | react:
20 | specifier: ^18.2.0
21 | version: 18.2.0
22 | react-dom:
23 | specifier: ^18.2.0
24 | version: 18.2.0(react@18.2.0)
25 | react-hook-form:
26 | specifier: ^7.44.3
27 | version: 7.44.3(react@18.2.0)
28 | react-icons:
29 | specifier: ^4.9.0
30 | version: 4.9.0(react@18.2.0)
31 | react-router-dom:
32 | specifier: ^6.11.2
33 | version: 6.11.2(react-dom@18.2.0)(react@18.2.0)
34 | zod:
35 | specifier: ^3.21.4
36 | version: 3.21.4
37 |
38 | devDependencies:
39 | '@types/react':
40 | specifier: ^18.2.8
41 | version: 18.2.8
42 | '@types/react-dom':
43 | specifier: ^18.2.4
44 | version: 18.2.4
45 | '@vitejs/plugin-react':
46 | specifier: ^4.0.0
47 | version: 4.0.0(vite@4.3.9)
48 | autoprefixer:
49 | specifier: ^10.4.14
50 | version: 10.4.14(postcss@8.4.24)
51 | postcss:
52 | specifier: ^8.4.24
53 | version: 8.4.24
54 | tailwindcss:
55 | specifier: ^3.3.2
56 | version: 3.3.2
57 | vite:
58 | specifier: ^4.3.9
59 | version: 4.3.9
60 |
61 | packages:
62 |
63 | /@alloc/quick-lru@5.2.0:
64 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
65 | engines: {node: '>=10'}
66 | dev: true
67 |
68 | /@ampproject/remapping@2.2.0:
69 | resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
70 | engines: {node: '>=6.0.0'}
71 | dependencies:
72 | '@jridgewell/gen-mapping': 0.1.1
73 | '@jridgewell/trace-mapping': 0.3.17
74 | dev: true
75 |
76 | /@babel/code-frame@7.21.4:
77 | resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
78 | engines: {node: '>=6.9.0'}
79 | dependencies:
80 | '@babel/highlight': 7.18.6
81 | dev: true
82 |
83 | /@babel/compat-data@7.22.3:
84 | resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==}
85 | engines: {node: '>=6.9.0'}
86 | dev: true
87 |
88 | /@babel/core@7.22.1:
89 | resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==}
90 | engines: {node: '>=6.9.0'}
91 | dependencies:
92 | '@ampproject/remapping': 2.2.0
93 | '@babel/code-frame': 7.21.4
94 | '@babel/generator': 7.22.3
95 | '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
96 | '@babel/helper-module-transforms': 7.22.1
97 | '@babel/helpers': 7.22.3
98 | '@babel/parser': 7.22.4
99 | '@babel/template': 7.21.9
100 | '@babel/traverse': 7.22.4
101 | '@babel/types': 7.22.4
102 | convert-source-map: 1.9.0
103 | debug: 4.3.4
104 | gensync: 1.0.0-beta.2
105 | json5: 2.2.3
106 | semver: 6.3.0
107 | transitivePeerDependencies:
108 | - supports-color
109 | dev: true
110 |
111 | /@babel/generator@7.22.3:
112 | resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==}
113 | engines: {node: '>=6.9.0'}
114 | dependencies:
115 | '@babel/types': 7.22.4
116 | '@jridgewell/gen-mapping': 0.3.2
117 | '@jridgewell/trace-mapping': 0.3.17
118 | jsesc: 2.5.2
119 | dev: true
120 |
121 | /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1):
122 | resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==}
123 | engines: {node: '>=6.9.0'}
124 | peerDependencies:
125 | '@babel/core': ^7.0.0
126 | dependencies:
127 | '@babel/compat-data': 7.22.3
128 | '@babel/core': 7.22.1
129 | '@babel/helper-validator-option': 7.21.0
130 | browserslist: 4.21.5
131 | lru-cache: 5.1.1
132 | semver: 6.3.0
133 | dev: true
134 |
135 | /@babel/helper-environment-visitor@7.22.1:
136 | resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==}
137 | engines: {node: '>=6.9.0'}
138 | dev: true
139 |
140 | /@babel/helper-function-name@7.21.0:
141 | resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
142 | engines: {node: '>=6.9.0'}
143 | dependencies:
144 | '@babel/template': 7.21.9
145 | '@babel/types': 7.22.4
146 | dev: true
147 |
148 | /@babel/helper-hoist-variables@7.18.6:
149 | resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
150 | engines: {node: '>=6.9.0'}
151 | dependencies:
152 | '@babel/types': 7.22.4
153 | dev: true
154 |
155 | /@babel/helper-module-imports@7.21.4:
156 | resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==}
157 | engines: {node: '>=6.9.0'}
158 | dependencies:
159 | '@babel/types': 7.22.4
160 | dev: true
161 |
162 | /@babel/helper-module-transforms@7.22.1:
163 | resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==}
164 | engines: {node: '>=6.9.0'}
165 | dependencies:
166 | '@babel/helper-environment-visitor': 7.22.1
167 | '@babel/helper-module-imports': 7.21.4
168 | '@babel/helper-simple-access': 7.21.5
169 | '@babel/helper-split-export-declaration': 7.18.6
170 | '@babel/helper-validator-identifier': 7.19.1
171 | '@babel/template': 7.21.9
172 | '@babel/traverse': 7.22.4
173 | '@babel/types': 7.22.4
174 | transitivePeerDependencies:
175 | - supports-color
176 | dev: true
177 |
178 | /@babel/helper-plugin-utils@7.20.2:
179 | resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
180 | engines: {node: '>=6.9.0'}
181 | dev: true
182 |
183 | /@babel/helper-simple-access@7.21.5:
184 | resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==}
185 | engines: {node: '>=6.9.0'}
186 | dependencies:
187 | '@babel/types': 7.22.4
188 | dev: true
189 |
190 | /@babel/helper-split-export-declaration@7.18.6:
191 | resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
192 | engines: {node: '>=6.9.0'}
193 | dependencies:
194 | '@babel/types': 7.22.4
195 | dev: true
196 |
197 | /@babel/helper-string-parser@7.21.5:
198 | resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
199 | engines: {node: '>=6.9.0'}
200 | dev: true
201 |
202 | /@babel/helper-validator-identifier@7.19.1:
203 | resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
204 | engines: {node: '>=6.9.0'}
205 | dev: true
206 |
207 | /@babel/helper-validator-option@7.21.0:
208 | resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
209 | engines: {node: '>=6.9.0'}
210 | dev: true
211 |
212 | /@babel/helpers@7.22.3:
213 | resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==}
214 | engines: {node: '>=6.9.0'}
215 | dependencies:
216 | '@babel/template': 7.21.9
217 | '@babel/traverse': 7.22.4
218 | '@babel/types': 7.22.4
219 | transitivePeerDependencies:
220 | - supports-color
221 | dev: true
222 |
223 | /@babel/highlight@7.18.6:
224 | resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
225 | engines: {node: '>=6.9.0'}
226 | dependencies:
227 | '@babel/helper-validator-identifier': 7.19.1
228 | chalk: 2.4.2
229 | js-tokens: 4.0.0
230 | dev: true
231 |
232 | /@babel/parser@7.22.4:
233 | resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==}
234 | engines: {node: '>=6.0.0'}
235 | hasBin: true
236 | dependencies:
237 | '@babel/types': 7.22.4
238 | dev: true
239 |
240 | /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.22.1):
241 | resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==}
242 | engines: {node: '>=6.9.0'}
243 | peerDependencies:
244 | '@babel/core': ^7.0.0-0
245 | dependencies:
246 | '@babel/core': 7.22.1
247 | '@babel/helper-plugin-utils': 7.20.2
248 | dev: true
249 |
250 | /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.22.1):
251 | resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==}
252 | engines: {node: '>=6.9.0'}
253 | peerDependencies:
254 | '@babel/core': ^7.0.0-0
255 | dependencies:
256 | '@babel/core': 7.22.1
257 | '@babel/helper-plugin-utils': 7.20.2
258 | dev: true
259 |
260 | /@babel/template@7.21.9:
261 | resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==}
262 | engines: {node: '>=6.9.0'}
263 | dependencies:
264 | '@babel/code-frame': 7.21.4
265 | '@babel/parser': 7.22.4
266 | '@babel/types': 7.22.4
267 | dev: true
268 |
269 | /@babel/traverse@7.22.4:
270 | resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==}
271 | engines: {node: '>=6.9.0'}
272 | dependencies:
273 | '@babel/code-frame': 7.21.4
274 | '@babel/generator': 7.22.3
275 | '@babel/helper-environment-visitor': 7.22.1
276 | '@babel/helper-function-name': 7.21.0
277 | '@babel/helper-hoist-variables': 7.18.6
278 | '@babel/helper-split-export-declaration': 7.18.6
279 | '@babel/parser': 7.22.4
280 | '@babel/types': 7.22.4
281 | debug: 4.3.4
282 | globals: 11.12.0
283 | transitivePeerDependencies:
284 | - supports-color
285 | dev: true
286 |
287 | /@babel/types@7.22.4:
288 | resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==}
289 | engines: {node: '>=6.9.0'}
290 | dependencies:
291 | '@babel/helper-string-parser': 7.21.5
292 | '@babel/helper-validator-identifier': 7.19.1
293 | to-fast-properties: 2.0.0
294 | dev: true
295 |
296 | /@esbuild/android-arm64@0.17.19:
297 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
298 | engines: {node: '>=12'}
299 | cpu: [arm64]
300 | os: [android]
301 | requiresBuild: true
302 | dev: true
303 | optional: true
304 |
305 | /@esbuild/android-arm@0.17.19:
306 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
307 | engines: {node: '>=12'}
308 | cpu: [arm]
309 | os: [android]
310 | requiresBuild: true
311 | dev: true
312 | optional: true
313 |
314 | /@esbuild/android-x64@0.17.19:
315 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
316 | engines: {node: '>=12'}
317 | cpu: [x64]
318 | os: [android]
319 | requiresBuild: true
320 | dev: true
321 | optional: true
322 |
323 | /@esbuild/darwin-arm64@0.17.19:
324 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
325 | engines: {node: '>=12'}
326 | cpu: [arm64]
327 | os: [darwin]
328 | requiresBuild: true
329 | dev: true
330 | optional: true
331 |
332 | /@esbuild/darwin-x64@0.17.19:
333 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
334 | engines: {node: '>=12'}
335 | cpu: [x64]
336 | os: [darwin]
337 | requiresBuild: true
338 | dev: true
339 | optional: true
340 |
341 | /@esbuild/freebsd-arm64@0.17.19:
342 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
343 | engines: {node: '>=12'}
344 | cpu: [arm64]
345 | os: [freebsd]
346 | requiresBuild: true
347 | dev: true
348 | optional: true
349 |
350 | /@esbuild/freebsd-x64@0.17.19:
351 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
352 | engines: {node: '>=12'}
353 | cpu: [x64]
354 | os: [freebsd]
355 | requiresBuild: true
356 | dev: true
357 | optional: true
358 |
359 | /@esbuild/linux-arm64@0.17.19:
360 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
361 | engines: {node: '>=12'}
362 | cpu: [arm64]
363 | os: [linux]
364 | requiresBuild: true
365 | dev: true
366 | optional: true
367 |
368 | /@esbuild/linux-arm@0.17.19:
369 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
370 | engines: {node: '>=12'}
371 | cpu: [arm]
372 | os: [linux]
373 | requiresBuild: true
374 | dev: true
375 | optional: true
376 |
377 | /@esbuild/linux-ia32@0.17.19:
378 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
379 | engines: {node: '>=12'}
380 | cpu: [ia32]
381 | os: [linux]
382 | requiresBuild: true
383 | dev: true
384 | optional: true
385 |
386 | /@esbuild/linux-loong64@0.17.19:
387 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
388 | engines: {node: '>=12'}
389 | cpu: [loong64]
390 | os: [linux]
391 | requiresBuild: true
392 | dev: true
393 | optional: true
394 |
395 | /@esbuild/linux-mips64el@0.17.19:
396 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
397 | engines: {node: '>=12'}
398 | cpu: [mips64el]
399 | os: [linux]
400 | requiresBuild: true
401 | dev: true
402 | optional: true
403 |
404 | /@esbuild/linux-ppc64@0.17.19:
405 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
406 | engines: {node: '>=12'}
407 | cpu: [ppc64]
408 | os: [linux]
409 | requiresBuild: true
410 | dev: true
411 | optional: true
412 |
413 | /@esbuild/linux-riscv64@0.17.19:
414 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
415 | engines: {node: '>=12'}
416 | cpu: [riscv64]
417 | os: [linux]
418 | requiresBuild: true
419 | dev: true
420 | optional: true
421 |
422 | /@esbuild/linux-s390x@0.17.19:
423 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
424 | engines: {node: '>=12'}
425 | cpu: [s390x]
426 | os: [linux]
427 | requiresBuild: true
428 | dev: true
429 | optional: true
430 |
431 | /@esbuild/linux-x64@0.17.19:
432 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
433 | engines: {node: '>=12'}
434 | cpu: [x64]
435 | os: [linux]
436 | requiresBuild: true
437 | dev: true
438 | optional: true
439 |
440 | /@esbuild/netbsd-x64@0.17.19:
441 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
442 | engines: {node: '>=12'}
443 | cpu: [x64]
444 | os: [netbsd]
445 | requiresBuild: true
446 | dev: true
447 | optional: true
448 |
449 | /@esbuild/openbsd-x64@0.17.19:
450 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
451 | engines: {node: '>=12'}
452 | cpu: [x64]
453 | os: [openbsd]
454 | requiresBuild: true
455 | dev: true
456 | optional: true
457 |
458 | /@esbuild/sunos-x64@0.17.19:
459 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
460 | engines: {node: '>=12'}
461 | cpu: [x64]
462 | os: [sunos]
463 | requiresBuild: true
464 | dev: true
465 | optional: true
466 |
467 | /@esbuild/win32-arm64@0.17.19:
468 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
469 | engines: {node: '>=12'}
470 | cpu: [arm64]
471 | os: [win32]
472 | requiresBuild: true
473 | dev: true
474 | optional: true
475 |
476 | /@esbuild/win32-ia32@0.17.19:
477 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
478 | engines: {node: '>=12'}
479 | cpu: [ia32]
480 | os: [win32]
481 | requiresBuild: true
482 | dev: true
483 | optional: true
484 |
485 | /@esbuild/win32-x64@0.17.19:
486 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
487 | engines: {node: '>=12'}
488 | cpu: [x64]
489 | os: [win32]
490 | requiresBuild: true
491 | dev: true
492 | optional: true
493 |
494 | /@hookform/resolvers@3.1.0(react-hook-form@7.44.3):
495 | resolution: {integrity: sha512-z0A8K+Nxq+f83Whm/ajlwE6VtQlp/yPHZnXw7XWVPIGm1Vx0QV8KThU3BpbBRfAZ7/dYqCKKBNnQh85BkmBKkA==}
496 | peerDependencies:
497 | react-hook-form: ^7.0.0
498 | dependencies:
499 | react-hook-form: 7.44.3(react@18.2.0)
500 | dev: false
501 |
502 | /@jridgewell/gen-mapping@0.1.1:
503 | resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
504 | engines: {node: '>=6.0.0'}
505 | dependencies:
506 | '@jridgewell/set-array': 1.1.2
507 | '@jridgewell/sourcemap-codec': 1.4.14
508 | dev: true
509 |
510 | /@jridgewell/gen-mapping@0.3.2:
511 | resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
512 | engines: {node: '>=6.0.0'}
513 | dependencies:
514 | '@jridgewell/set-array': 1.1.2
515 | '@jridgewell/sourcemap-codec': 1.4.14
516 | '@jridgewell/trace-mapping': 0.3.17
517 | dev: true
518 |
519 | /@jridgewell/resolve-uri@3.1.0:
520 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
521 | engines: {node: '>=6.0.0'}
522 | dev: true
523 |
524 | /@jridgewell/set-array@1.1.2:
525 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
526 | engines: {node: '>=6.0.0'}
527 | dev: true
528 |
529 | /@jridgewell/sourcemap-codec@1.4.14:
530 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
531 | dev: true
532 |
533 | /@jridgewell/trace-mapping@0.3.17:
534 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
535 | dependencies:
536 | '@jridgewell/resolve-uri': 3.1.0
537 | '@jridgewell/sourcemap-codec': 1.4.14
538 | dev: true
539 |
540 | /@nodelib/fs.scandir@2.1.5:
541 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
542 | engines: {node: '>= 8'}
543 | dependencies:
544 | '@nodelib/fs.stat': 2.0.5
545 | run-parallel: 1.2.0
546 | dev: true
547 |
548 | /@nodelib/fs.stat@2.0.5:
549 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
550 | engines: {node: '>= 8'}
551 | dev: true
552 |
553 | /@nodelib/fs.walk@1.2.8:
554 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
555 | engines: {node: '>= 8'}
556 | dependencies:
557 | '@nodelib/fs.scandir': 2.1.5
558 | fastq: 1.15.0
559 | dev: true
560 |
561 | /@remix-run/router@1.6.2:
562 | resolution: {integrity: sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==}
563 | engines: {node: '>=14'}
564 | dev: false
565 |
566 | /@types/prop-types@15.7.5:
567 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
568 | dev: true
569 |
570 | /@types/react-dom@18.2.4:
571 | resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==}
572 | dependencies:
573 | '@types/react': 18.2.8
574 | dev: true
575 |
576 | /@types/react@18.2.8:
577 | resolution: {integrity: sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==}
578 | dependencies:
579 | '@types/prop-types': 15.7.5
580 | '@types/scheduler': 0.16.2
581 | csstype: 3.1.1
582 | dev: true
583 |
584 | /@types/scheduler@0.16.2:
585 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
586 | dev: true
587 |
588 | /@vitejs/plugin-react@4.0.0(vite@4.3.9):
589 | resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==}
590 | engines: {node: ^14.18.0 || >=16.0.0}
591 | peerDependencies:
592 | vite: ^4.2.0
593 | dependencies:
594 | '@babel/core': 7.22.1
595 | '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.22.1)
596 | '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.22.1)
597 | react-refresh: 0.14.0
598 | vite: 4.3.9
599 | transitivePeerDependencies:
600 | - supports-color
601 | dev: true
602 |
603 | /ansi-styles@3.2.1:
604 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
605 | engines: {node: '>=4'}
606 | dependencies:
607 | color-convert: 1.9.3
608 | dev: true
609 |
610 | /any-promise@1.3.0:
611 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
612 | dev: true
613 |
614 | /anymatch@3.1.3:
615 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
616 | engines: {node: '>= 8'}
617 | dependencies:
618 | normalize-path: 3.0.0
619 | picomatch: 2.3.1
620 | dev: true
621 |
622 | /arg@5.0.2:
623 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
624 | dev: true
625 |
626 | /asynckit@0.4.0:
627 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
628 | dev: false
629 |
630 | /autoprefixer@10.4.14(postcss@8.4.24):
631 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
632 | engines: {node: ^10 || ^12 || >=14}
633 | hasBin: true
634 | peerDependencies:
635 | postcss: ^8.1.0
636 | dependencies:
637 | browserslist: 4.21.5
638 | caniuse-lite: 1.0.30001492
639 | fraction.js: 4.2.0
640 | normalize-range: 0.1.2
641 | picocolors: 1.0.0
642 | postcss: 8.4.24
643 | postcss-value-parser: 4.2.0
644 | dev: true
645 |
646 | /axios@1.4.0:
647 | resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==}
648 | dependencies:
649 | follow-redirects: 1.15.2
650 | form-data: 4.0.0
651 | proxy-from-env: 1.1.0
652 | transitivePeerDependencies:
653 | - debug
654 | dev: false
655 |
656 | /balanced-match@1.0.2:
657 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
658 | dev: true
659 |
660 | /binary-extensions@2.2.0:
661 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
662 | engines: {node: '>=8'}
663 | dev: true
664 |
665 | /brace-expansion@1.1.11:
666 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
667 | dependencies:
668 | balanced-match: 1.0.2
669 | concat-map: 0.0.1
670 | dev: true
671 |
672 | /braces@3.0.2:
673 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
674 | engines: {node: '>=8'}
675 | dependencies:
676 | fill-range: 7.0.1
677 | dev: true
678 |
679 | /browserslist@4.21.5:
680 | resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==}
681 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
682 | hasBin: true
683 | dependencies:
684 | caniuse-lite: 1.0.30001492
685 | electron-to-chromium: 1.4.295
686 | node-releases: 2.0.10
687 | update-browserslist-db: 1.0.10(browserslist@4.21.5)
688 | dev: true
689 |
690 | /camelcase-css@2.0.1:
691 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
692 | engines: {node: '>= 6'}
693 | dev: true
694 |
695 | /caniuse-lite@1.0.30001492:
696 | resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==}
697 | dev: true
698 |
699 | /chalk@2.4.2:
700 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
701 | engines: {node: '>=4'}
702 | dependencies:
703 | ansi-styles: 3.2.1
704 | escape-string-regexp: 1.0.5
705 | supports-color: 5.5.0
706 | dev: true
707 |
708 | /chokidar@3.5.3:
709 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
710 | engines: {node: '>= 8.10.0'}
711 | dependencies:
712 | anymatch: 3.1.3
713 | braces: 3.0.2
714 | glob-parent: 5.1.2
715 | is-binary-path: 2.1.0
716 | is-glob: 4.0.3
717 | normalize-path: 3.0.0
718 | readdirp: 3.6.0
719 | optionalDependencies:
720 | fsevents: 2.3.2
721 | dev: true
722 |
723 | /color-convert@1.9.3:
724 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
725 | dependencies:
726 | color-name: 1.1.3
727 | dev: true
728 |
729 | /color-name@1.1.3:
730 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
731 | dev: true
732 |
733 | /combined-stream@1.0.8:
734 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
735 | engines: {node: '>= 0.8'}
736 | dependencies:
737 | delayed-stream: 1.0.0
738 | dev: false
739 |
740 | /commander@4.1.1:
741 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
742 | engines: {node: '>= 6'}
743 | dev: true
744 |
745 | /concat-map@0.0.1:
746 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
747 | dev: true
748 |
749 | /convert-source-map@1.9.0:
750 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
751 | dev: true
752 |
753 | /cssesc@3.0.0:
754 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
755 | engines: {node: '>=4'}
756 | hasBin: true
757 | dev: true
758 |
759 | /csstype@3.1.1:
760 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
761 | dev: true
762 |
763 | /dayjs-plugin-utc@0.1.2:
764 | resolution: {integrity: sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg==}
765 | dev: false
766 |
767 | /dayjs@1.11.7:
768 | resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
769 | dev: false
770 |
771 | /debug@4.3.4:
772 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
773 | engines: {node: '>=6.0'}
774 | peerDependencies:
775 | supports-color: '*'
776 | peerDependenciesMeta:
777 | supports-color:
778 | optional: true
779 | dependencies:
780 | ms: 2.1.2
781 | dev: true
782 |
783 | /delayed-stream@1.0.0:
784 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
785 | engines: {node: '>=0.4.0'}
786 | dev: false
787 |
788 | /didyoumean@1.2.2:
789 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
790 | dev: true
791 |
792 | /dlv@1.1.3:
793 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
794 | dev: true
795 |
796 | /electron-to-chromium@1.4.295:
797 | resolution: {integrity: sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==}
798 | dev: true
799 |
800 | /esbuild@0.17.19:
801 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
802 | engines: {node: '>=12'}
803 | hasBin: true
804 | requiresBuild: true
805 | optionalDependencies:
806 | '@esbuild/android-arm': 0.17.19
807 | '@esbuild/android-arm64': 0.17.19
808 | '@esbuild/android-x64': 0.17.19
809 | '@esbuild/darwin-arm64': 0.17.19
810 | '@esbuild/darwin-x64': 0.17.19
811 | '@esbuild/freebsd-arm64': 0.17.19
812 | '@esbuild/freebsd-x64': 0.17.19
813 | '@esbuild/linux-arm': 0.17.19
814 | '@esbuild/linux-arm64': 0.17.19
815 | '@esbuild/linux-ia32': 0.17.19
816 | '@esbuild/linux-loong64': 0.17.19
817 | '@esbuild/linux-mips64el': 0.17.19
818 | '@esbuild/linux-ppc64': 0.17.19
819 | '@esbuild/linux-riscv64': 0.17.19
820 | '@esbuild/linux-s390x': 0.17.19
821 | '@esbuild/linux-x64': 0.17.19
822 | '@esbuild/netbsd-x64': 0.17.19
823 | '@esbuild/openbsd-x64': 0.17.19
824 | '@esbuild/sunos-x64': 0.17.19
825 | '@esbuild/win32-arm64': 0.17.19
826 | '@esbuild/win32-ia32': 0.17.19
827 | '@esbuild/win32-x64': 0.17.19
828 | dev: true
829 |
830 | /escalade@3.1.1:
831 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
832 | engines: {node: '>=6'}
833 | dev: true
834 |
835 | /escape-string-regexp@1.0.5:
836 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
837 | engines: {node: '>=0.8.0'}
838 | dev: true
839 |
840 | /fast-glob@3.2.12:
841 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
842 | engines: {node: '>=8.6.0'}
843 | dependencies:
844 | '@nodelib/fs.stat': 2.0.5
845 | '@nodelib/fs.walk': 1.2.8
846 | glob-parent: 5.1.2
847 | merge2: 1.4.1
848 | micromatch: 4.0.5
849 | dev: true
850 |
851 | /fastq@1.15.0:
852 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
853 | dependencies:
854 | reusify: 1.0.4
855 | dev: true
856 |
857 | /fill-range@7.0.1:
858 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
859 | engines: {node: '>=8'}
860 | dependencies:
861 | to-regex-range: 5.0.1
862 | dev: true
863 |
864 | /follow-redirects@1.15.2:
865 | resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
866 | engines: {node: '>=4.0'}
867 | peerDependencies:
868 | debug: '*'
869 | peerDependenciesMeta:
870 | debug:
871 | optional: true
872 | dev: false
873 |
874 | /form-data@4.0.0:
875 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
876 | engines: {node: '>= 6'}
877 | dependencies:
878 | asynckit: 0.4.0
879 | combined-stream: 1.0.8
880 | mime-types: 2.1.35
881 | dev: false
882 |
883 | /fraction.js@4.2.0:
884 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
885 | dev: true
886 |
887 | /fs.realpath@1.0.0:
888 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
889 | dev: true
890 |
891 | /fsevents@2.3.2:
892 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
893 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
894 | os: [darwin]
895 | requiresBuild: true
896 | dev: true
897 | optional: true
898 |
899 | /function-bind@1.1.1:
900 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
901 | dev: true
902 |
903 | /gensync@1.0.0-beta.2:
904 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
905 | engines: {node: '>=6.9.0'}
906 | dev: true
907 |
908 | /glob-parent@5.1.2:
909 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
910 | engines: {node: '>= 6'}
911 | dependencies:
912 | is-glob: 4.0.3
913 | dev: true
914 |
915 | /glob-parent@6.0.2:
916 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
917 | engines: {node: '>=10.13.0'}
918 | dependencies:
919 | is-glob: 4.0.3
920 | dev: true
921 |
922 | /glob@7.1.6:
923 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
924 | dependencies:
925 | fs.realpath: 1.0.0
926 | inflight: 1.0.6
927 | inherits: 2.0.4
928 | minimatch: 3.1.2
929 | once: 1.4.0
930 | path-is-absolute: 1.0.1
931 | dev: true
932 |
933 | /globals@11.12.0:
934 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
935 | engines: {node: '>=4'}
936 | dev: true
937 |
938 | /has-flag@3.0.0:
939 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
940 | engines: {node: '>=4'}
941 | dev: true
942 |
943 | /has@1.0.3:
944 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
945 | engines: {node: '>= 0.4.0'}
946 | dependencies:
947 | function-bind: 1.1.1
948 | dev: true
949 |
950 | /inflight@1.0.6:
951 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
952 | dependencies:
953 | once: 1.4.0
954 | wrappy: 1.0.2
955 | dev: true
956 |
957 | /inherits@2.0.4:
958 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
959 | dev: true
960 |
961 | /is-binary-path@2.1.0:
962 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
963 | engines: {node: '>=8'}
964 | dependencies:
965 | binary-extensions: 2.2.0
966 | dev: true
967 |
968 | /is-core-module@2.11.0:
969 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
970 | dependencies:
971 | has: 1.0.3
972 | dev: true
973 |
974 | /is-extglob@2.1.1:
975 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
976 | engines: {node: '>=0.10.0'}
977 | dev: true
978 |
979 | /is-glob@4.0.3:
980 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
981 | engines: {node: '>=0.10.0'}
982 | dependencies:
983 | is-extglob: 2.1.1
984 | dev: true
985 |
986 | /is-number@7.0.0:
987 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
988 | engines: {node: '>=0.12.0'}
989 | dev: true
990 |
991 | /jiti@1.18.2:
992 | resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
993 | hasBin: true
994 | dev: true
995 |
996 | /js-cookie@3.0.5:
997 | resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
998 | engines: {node: '>=14'}
999 | dev: false
1000 |
1001 | /js-tokens@4.0.0:
1002 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
1003 |
1004 | /jsesc@2.5.2:
1005 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
1006 | engines: {node: '>=4'}
1007 | hasBin: true
1008 | dev: true
1009 |
1010 | /json5@2.2.3:
1011 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
1012 | engines: {node: '>=6'}
1013 | hasBin: true
1014 | dev: true
1015 |
1016 | /lilconfig@2.1.0:
1017 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
1018 | engines: {node: '>=10'}
1019 | dev: true
1020 |
1021 | /lines-and-columns@1.2.4:
1022 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
1023 | dev: true
1024 |
1025 | /loose-envify@1.4.0:
1026 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
1027 | hasBin: true
1028 | dependencies:
1029 | js-tokens: 4.0.0
1030 | dev: false
1031 |
1032 | /lru-cache@5.1.1:
1033 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
1034 | dependencies:
1035 | yallist: 3.1.1
1036 | dev: true
1037 |
1038 | /merge2@1.4.1:
1039 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1040 | engines: {node: '>= 8'}
1041 | dev: true
1042 |
1043 | /micromatch@4.0.5:
1044 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1045 | engines: {node: '>=8.6'}
1046 | dependencies:
1047 | braces: 3.0.2
1048 | picomatch: 2.3.1
1049 | dev: true
1050 |
1051 | /mime-db@1.52.0:
1052 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
1053 | engines: {node: '>= 0.6'}
1054 | dev: false
1055 |
1056 | /mime-types@2.1.35:
1057 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1058 | engines: {node: '>= 0.6'}
1059 | dependencies:
1060 | mime-db: 1.52.0
1061 | dev: false
1062 |
1063 | /minimatch@3.1.2:
1064 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1065 | dependencies:
1066 | brace-expansion: 1.1.11
1067 | dev: true
1068 |
1069 | /ms@2.1.2:
1070 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1071 | dev: true
1072 |
1073 | /mz@2.7.0:
1074 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
1075 | dependencies:
1076 | any-promise: 1.3.0
1077 | object-assign: 4.1.1
1078 | thenify-all: 1.6.0
1079 | dev: true
1080 |
1081 | /nanoid@3.3.6:
1082 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
1083 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1084 | hasBin: true
1085 | dev: true
1086 |
1087 | /node-releases@2.0.10:
1088 | resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
1089 | dev: true
1090 |
1091 | /normalize-path@3.0.0:
1092 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
1093 | engines: {node: '>=0.10.0'}
1094 | dev: true
1095 |
1096 | /normalize-range@0.1.2:
1097 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
1098 | engines: {node: '>=0.10.0'}
1099 | dev: true
1100 |
1101 | /object-assign@4.1.1:
1102 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
1103 | engines: {node: '>=0.10.0'}
1104 | dev: true
1105 |
1106 | /object-hash@3.0.0:
1107 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
1108 | engines: {node: '>= 6'}
1109 | dev: true
1110 |
1111 | /once@1.4.0:
1112 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
1113 | dependencies:
1114 | wrappy: 1.0.2
1115 | dev: true
1116 |
1117 | /path-is-absolute@1.0.1:
1118 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1119 | engines: {node: '>=0.10.0'}
1120 | dev: true
1121 |
1122 | /path-parse@1.0.7:
1123 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1124 | dev: true
1125 |
1126 | /picocolors@1.0.0:
1127 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
1128 | dev: true
1129 |
1130 | /picomatch@2.3.1:
1131 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1132 | engines: {node: '>=8.6'}
1133 | dev: true
1134 |
1135 | /pify@2.3.0:
1136 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
1137 | engines: {node: '>=0.10.0'}
1138 | dev: true
1139 |
1140 | /pirates@4.0.5:
1141 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
1142 | engines: {node: '>= 6'}
1143 | dev: true
1144 |
1145 | /postcss-import@15.1.0(postcss@8.4.24):
1146 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
1147 | engines: {node: '>=14.0.0'}
1148 | peerDependencies:
1149 | postcss: ^8.0.0
1150 | dependencies:
1151 | postcss: 8.4.24
1152 | postcss-value-parser: 4.2.0
1153 | read-cache: 1.0.0
1154 | resolve: 1.22.2
1155 | dev: true
1156 |
1157 | /postcss-js@4.0.1(postcss@8.4.24):
1158 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
1159 | engines: {node: ^12 || ^14 || >= 16}
1160 | peerDependencies:
1161 | postcss: ^8.4.21
1162 | dependencies:
1163 | camelcase-css: 2.0.1
1164 | postcss: 8.4.24
1165 | dev: true
1166 |
1167 | /postcss-load-config@4.0.1(postcss@8.4.24):
1168 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
1169 | engines: {node: '>= 14'}
1170 | peerDependencies:
1171 | postcss: '>=8.0.9'
1172 | ts-node: '>=9.0.0'
1173 | peerDependenciesMeta:
1174 | postcss:
1175 | optional: true
1176 | ts-node:
1177 | optional: true
1178 | dependencies:
1179 | lilconfig: 2.1.0
1180 | postcss: 8.4.24
1181 | yaml: 2.3.1
1182 | dev: true
1183 |
1184 | /postcss-nested@6.0.1(postcss@8.4.24):
1185 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
1186 | engines: {node: '>=12.0'}
1187 | peerDependencies:
1188 | postcss: ^8.2.14
1189 | dependencies:
1190 | postcss: 8.4.24
1191 | postcss-selector-parser: 6.0.11
1192 | dev: true
1193 |
1194 | /postcss-selector-parser@6.0.11:
1195 | resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==}
1196 | engines: {node: '>=4'}
1197 | dependencies:
1198 | cssesc: 3.0.0
1199 | util-deprecate: 1.0.2
1200 | dev: true
1201 |
1202 | /postcss-value-parser@4.2.0:
1203 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
1204 | dev: true
1205 |
1206 | /postcss@8.4.24:
1207 | resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
1208 | engines: {node: ^10 || ^12 || >=14}
1209 | dependencies:
1210 | nanoid: 3.3.6
1211 | picocolors: 1.0.0
1212 | source-map-js: 1.0.2
1213 | dev: true
1214 |
1215 | /proxy-from-env@1.1.0:
1216 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
1217 | dev: false
1218 |
1219 | /queue-microtask@1.2.3:
1220 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1221 | dev: true
1222 |
1223 | /react-dom@18.2.0(react@18.2.0):
1224 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
1225 | peerDependencies:
1226 | react: ^18.2.0
1227 | dependencies:
1228 | loose-envify: 1.4.0
1229 | react: 18.2.0
1230 | scheduler: 0.23.0
1231 | dev: false
1232 |
1233 | /react-hook-form@7.44.3(react@18.2.0):
1234 | resolution: {integrity: sha512-/tHId6p2ViAka1wECMw8FEPn/oz/w226zehHrJyQ1oIzCBNMIJCaj6ZkQcv+MjDxYh9MWR7RQic7Qqwe4a5nkw==}
1235 | engines: {node: '>=12.22.0'}
1236 | peerDependencies:
1237 | react: ^16.8.0 || ^17 || ^18
1238 | dependencies:
1239 | react: 18.2.0
1240 | dev: false
1241 |
1242 | /react-icons@4.9.0(react@18.2.0):
1243 | resolution: {integrity: sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==}
1244 | peerDependencies:
1245 | react: '*'
1246 | dependencies:
1247 | react: 18.2.0
1248 | dev: false
1249 |
1250 | /react-refresh@0.14.0:
1251 | resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
1252 | engines: {node: '>=0.10.0'}
1253 | dev: true
1254 |
1255 | /react-router-dom@6.11.2(react-dom@18.2.0)(react@18.2.0):
1256 | resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==}
1257 | engines: {node: '>=14'}
1258 | peerDependencies:
1259 | react: '>=16.8'
1260 | react-dom: '>=16.8'
1261 | dependencies:
1262 | '@remix-run/router': 1.6.2
1263 | react: 18.2.0
1264 | react-dom: 18.2.0(react@18.2.0)
1265 | react-router: 6.11.2(react@18.2.0)
1266 | dev: false
1267 |
1268 | /react-router@6.11.2(react@18.2.0):
1269 | resolution: {integrity: sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==}
1270 | engines: {node: '>=14'}
1271 | peerDependencies:
1272 | react: '>=16.8'
1273 | dependencies:
1274 | '@remix-run/router': 1.6.2
1275 | react: 18.2.0
1276 | dev: false
1277 |
1278 | /react@18.2.0:
1279 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
1280 | engines: {node: '>=0.10.0'}
1281 | dependencies:
1282 | loose-envify: 1.4.0
1283 | dev: false
1284 |
1285 | /read-cache@1.0.0:
1286 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
1287 | dependencies:
1288 | pify: 2.3.0
1289 | dev: true
1290 |
1291 | /readdirp@3.6.0:
1292 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1293 | engines: {node: '>=8.10.0'}
1294 | dependencies:
1295 | picomatch: 2.3.1
1296 | dev: true
1297 |
1298 | /resolve@1.22.2:
1299 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
1300 | hasBin: true
1301 | dependencies:
1302 | is-core-module: 2.11.0
1303 | path-parse: 1.0.7
1304 | supports-preserve-symlinks-flag: 1.0.0
1305 | dev: true
1306 |
1307 | /reusify@1.0.4:
1308 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1309 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1310 | dev: true
1311 |
1312 | /rollup@3.23.0:
1313 | resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==}
1314 | engines: {node: '>=14.18.0', npm: '>=8.0.0'}
1315 | hasBin: true
1316 | optionalDependencies:
1317 | fsevents: 2.3.2
1318 | dev: true
1319 |
1320 | /run-parallel@1.2.0:
1321 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1322 | dependencies:
1323 | queue-microtask: 1.2.3
1324 | dev: true
1325 |
1326 | /scheduler@0.23.0:
1327 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
1328 | dependencies:
1329 | loose-envify: 1.4.0
1330 | dev: false
1331 |
1332 | /semver@6.3.0:
1333 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
1334 | hasBin: true
1335 | dev: true
1336 |
1337 | /source-map-js@1.0.2:
1338 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
1339 | engines: {node: '>=0.10.0'}
1340 | dev: true
1341 |
1342 | /sucrase@3.32.0:
1343 | resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
1344 | engines: {node: '>=8'}
1345 | hasBin: true
1346 | dependencies:
1347 | '@jridgewell/gen-mapping': 0.3.2
1348 | commander: 4.1.1
1349 | glob: 7.1.6
1350 | lines-and-columns: 1.2.4
1351 | mz: 2.7.0
1352 | pirates: 4.0.5
1353 | ts-interface-checker: 0.1.13
1354 | dev: true
1355 |
1356 | /supports-color@5.5.0:
1357 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1358 | engines: {node: '>=4'}
1359 | dependencies:
1360 | has-flag: 3.0.0
1361 | dev: true
1362 |
1363 | /supports-preserve-symlinks-flag@1.0.0:
1364 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1365 | engines: {node: '>= 0.4'}
1366 | dev: true
1367 |
1368 | /tailwindcss@3.3.2:
1369 | resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
1370 | engines: {node: '>=14.0.0'}
1371 | hasBin: true
1372 | dependencies:
1373 | '@alloc/quick-lru': 5.2.0
1374 | arg: 5.0.2
1375 | chokidar: 3.5.3
1376 | didyoumean: 1.2.2
1377 | dlv: 1.1.3
1378 | fast-glob: 3.2.12
1379 | glob-parent: 6.0.2
1380 | is-glob: 4.0.3
1381 | jiti: 1.18.2
1382 | lilconfig: 2.1.0
1383 | micromatch: 4.0.5
1384 | normalize-path: 3.0.0
1385 | object-hash: 3.0.0
1386 | picocolors: 1.0.0
1387 | postcss: 8.4.24
1388 | postcss-import: 15.1.0(postcss@8.4.24)
1389 | postcss-js: 4.0.1(postcss@8.4.24)
1390 | postcss-load-config: 4.0.1(postcss@8.4.24)
1391 | postcss-nested: 6.0.1(postcss@8.4.24)
1392 | postcss-selector-parser: 6.0.11
1393 | postcss-value-parser: 4.2.0
1394 | resolve: 1.22.2
1395 | sucrase: 3.32.0
1396 | transitivePeerDependencies:
1397 | - ts-node
1398 | dev: true
1399 |
1400 | /thenify-all@1.6.0:
1401 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
1402 | engines: {node: '>=0.8'}
1403 | dependencies:
1404 | thenify: 3.3.1
1405 | dev: true
1406 |
1407 | /thenify@3.3.1:
1408 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
1409 | dependencies:
1410 | any-promise: 1.3.0
1411 | dev: true
1412 |
1413 | /to-fast-properties@2.0.0:
1414 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1415 | engines: {node: '>=4'}
1416 | dev: true
1417 |
1418 | /to-regex-range@5.0.1:
1419 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1420 | engines: {node: '>=8.0'}
1421 | dependencies:
1422 | is-number: 7.0.0
1423 | dev: true
1424 |
1425 | /ts-interface-checker@0.1.13:
1426 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
1427 | dev: true
1428 |
1429 | /update-browserslist-db@1.0.10(browserslist@4.21.5):
1430 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
1431 | hasBin: true
1432 | peerDependencies:
1433 | browserslist: '>= 4.21.0'
1434 | dependencies:
1435 | browserslist: 4.21.5
1436 | escalade: 3.1.1
1437 | picocolors: 1.0.0
1438 | dev: true
1439 |
1440 | /util-deprecate@1.0.2:
1441 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1442 | dev: true
1443 |
1444 | /vite@4.3.9:
1445 | resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
1446 | engines: {node: ^14.18.0 || >=16.0.0}
1447 | hasBin: true
1448 | peerDependencies:
1449 | '@types/node': '>= 14'
1450 | less: '*'
1451 | sass: '*'
1452 | stylus: '*'
1453 | sugarss: '*'
1454 | terser: ^5.4.0
1455 | peerDependenciesMeta:
1456 | '@types/node':
1457 | optional: true
1458 | less:
1459 | optional: true
1460 | sass:
1461 | optional: true
1462 | stylus:
1463 | optional: true
1464 | sugarss:
1465 | optional: true
1466 | terser:
1467 | optional: true
1468 | dependencies:
1469 | esbuild: 0.17.19
1470 | postcss: 8.4.24
1471 | rollup: 3.23.0
1472 | optionalDependencies:
1473 | fsevents: 2.3.2
1474 | dev: true
1475 |
1476 | /wrappy@1.0.2:
1477 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1478 | dev: true
1479 |
1480 | /yallist@3.1.1:
1481 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1482 | dev: true
1483 |
1484 | /yaml@2.3.1:
1485 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
1486 | engines: {node: '>= 14'}
1487 | dev: true
1488 |
1489 | /zod@3.21.4:
1490 | resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
1491 | dev: false
1492 |
--------------------------------------------------------------------------------