From da7db2f58550162f1c447dc443b0553d16bb7846 Mon Sep 17 00:00:00 2001 From: Younes Date: Mon, 16 Dec 2024 13:59:48 +0100 Subject: [PATCH] feat: better-auth migration (#291) * feat: better-auth migration * feat: fix better auth migration * feat: update authentification and fix chapters generation --- Dockerfile | 2 +- apps/frontend/jsconfig.json | 46 - apps/frontend/package.json | 21 +- apps/frontend/src/App.tsx | 56 +- apps/frontend/src/components/AppBarMenu.tsx | 29 +- apps/frontend/src/components/SharedLayout.tsx | 2 +- apps/frontend/src/components/SigninMenu.tsx | 23 +- .../frontend/src/components/TransUserRole.tsx | 14 +- .../src/components/auth/ConfirmDialog.tsx | 37 +- .../src/components/auth/ForgotDialog.tsx | 37 +- .../src/components/auth/JoinDialog.tsx | 18 +- .../src/components/auth/LoginDialog.tsx | 77 +- .../src/components/auth/RecoverDialog.tsx | 60 +- .../src/components/auth/SignupDialog.tsx | 66 +- .../components/auth/StudentSignupDialog.tsx | 56 +- .../frontend/src/components/chapters/form.tsx | 76 +- .../src/components/chapters/panel.tsx | 7 +- .../src/components/home/ProjectGrid.tsx | 10 +- apps/frontend/src/lib/auth-client.ts | 18 + apps/frontend/src/locales/en/common.json | 16 +- apps/frontend/src/locales/fr/common.json | 15 +- apps/frontend/src/pages/create.tsx | 54 +- apps/frontend/src/pages/home.tsx | 19 +- apps/frontend/src/pages/profile.tsx | 8 +- apps/frontend/src/pages/project.tsx | 9 +- apps/frontend/src/server/env.ts | 19 + apps/frontend/src/server/main.ts | 76 +- apps/frontend/src/state/recoil/project.ts | 6 +- apps/frontend/tsconfig.json | 9 +- apps/frontend/vite.config.ts | 25 +- package.json | 9 +- packages/{passport => auth}/package.json | 33 +- packages/auth/prisma/schema.prisma | 74 + packages/auth/src/auth.ts | 64 + packages/auth/src/env.ts | 11 + packages/auth/src/express.ts | 11 + packages/auth/src/index.ts | 3 + packages/auth/src/plugins/index.ts | 1 + .../src/plugins/signup-as-student/client.ts | 12 + .../src/plugins/signup-as-student/index.ts | 182 + packages/auth/tsconfig.json | 15 + packages/config/package.json | 2 +- packages/emails/emails/email-verification.tsx | 70 + packages/emails/emails/forget-password.tsx | 73 + packages/emails/emails/index.ts | 2 + .../emails/emails/static/celluloid-logo.png | Bin 0 -> 4055 bytes packages/emails/package.json | 26 + packages/emails/tsconfig.json | 15 + packages/passport/src/errors.ts | 33 - packages/passport/src/index.ts | 6 - packages/passport/src/passport.ts | 72 - packages/passport/src/session.ts | 33 - packages/passport/tsconfig.json | 18 - packages/passport/tsup.config.ts | 13 - .../migration.sql | 99 + packages/prisma/package.json | 33 +- packages/prisma/schema.prisma | 88 +- packages/prisma/src/env.ts | 10 + packages/prisma/src/index.ts | 4 +- packages/prisma/src/update-metadata.ts | 44 +- packages/prisma/tsconfig.json | 8 +- packages/queue/package.json | 18 +- packages/queue/src/env.ts | 9 + packages/queue/src/jobs/chapters.ts | 10 +- packages/queue/src/jobs/email.ts | 25 +- packages/queue/src/mailer/send-mail.ts | 50 + .../{trpc => queue}/src/mailer/transport.ts | 10 +- packages/queue/src/utils/scenes.ts | 150 +- packages/queue/src/utils/thumbnail.ts | 10 + packages/queue/tsconfig.json | 1 + packages/queue/tsup.config.ts | 13 - packages/trpc/package.json | 23 +- packages/trpc/src/env.ts | 15 + packages/trpc/src/mailer/sendMail.ts | 95 - packages/trpc/src/routers/annotation.ts | 24 +- packages/trpc/src/routers/chapter.ts | 64 +- packages/trpc/src/routers/playlist.ts | 3 +- packages/trpc/src/routers/project.ts | 16 +- packages/trpc/src/routers/storage.ts | 6 +- packages/trpc/src/routers/user.ts | 725 ++- packages/trpc/src/trpc.ts | 51 +- packages/types/package.json | 5 +- packages/utils/package.json | 17 +- packages/utils/src/env.ts | 67 - packages/utils/src/index.ts | 2 +- packages/utils/src/zod.ts | 17 + packages/utils/tsup.config.ts | 12 - pnpm-lock.yaml | 4157 +++++++++++------ pnpm-workspace.yaml | 11 + turbo.json | 20 +- 90 files changed, 4812 insertions(+), 2789 deletions(-) delete mode 100644 apps/frontend/jsconfig.json create mode 100644 apps/frontend/src/lib/auth-client.ts create mode 100644 apps/frontend/src/server/env.ts rename packages/{passport => auth}/package.json (55%) create mode 100644 packages/auth/prisma/schema.prisma create mode 100644 packages/auth/src/auth.ts create mode 100644 packages/auth/src/env.ts create mode 100644 packages/auth/src/express.ts create mode 100644 packages/auth/src/index.ts create mode 100644 packages/auth/src/plugins/index.ts create mode 100644 packages/auth/src/plugins/signup-as-student/client.ts create mode 100644 packages/auth/src/plugins/signup-as-student/index.ts create mode 100644 packages/auth/tsconfig.json create mode 100644 packages/emails/emails/email-verification.tsx create mode 100644 packages/emails/emails/forget-password.tsx create mode 100644 packages/emails/emails/index.ts create mode 100644 packages/emails/emails/static/celluloid-logo.png create mode 100644 packages/emails/package.json create mode 100644 packages/emails/tsconfig.json delete mode 100644 packages/passport/src/errors.ts delete mode 100644 packages/passport/src/index.ts delete mode 100644 packages/passport/src/passport.ts delete mode 100644 packages/passport/src/session.ts delete mode 100644 packages/passport/tsconfig.json delete mode 100644 packages/passport/tsup.config.ts create mode 100644 packages/prisma/migrations/20241216103120_better_auth_migration/migration.sql create mode 100644 packages/prisma/src/env.ts create mode 100644 packages/queue/src/mailer/send-mail.ts rename packages/{trpc => queue}/src/mailer/transport.ts (91%) create mode 100644 packages/queue/src/utils/thumbnail.ts delete mode 100644 packages/queue/tsup.config.ts create mode 100644 packages/trpc/src/env.ts delete mode 100644 packages/trpc/src/mailer/sendMail.ts delete mode 100644 packages/utils/src/env.ts create mode 100644 packages/utils/src/zod.ts delete mode 100644 packages/utils/tsup.config.ts diff --git a/Dockerfile b/Dockerfile index 5a524691..90470cba 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM node:20-alpine AS base -RUN apk add --no-cache libc6-compat ffmpeg +RUN apk add --no-cache libc6-compat ffmpeg bash RUN npm install -g turbo pnpm FROM base AS pruned diff --git a/apps/frontend/jsconfig.json b/apps/frontend/jsconfig.json deleted file mode 100644 index 337aa104..00000000 --- a/apps/frontend/jsconfig.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "~components/*": [ - "src/components/*" - ], - "~hooks/*": [ - "src/hooks/*" - ], - "~images/*": [ - "src/images/*" - ], - "~locales/*": [ - "src/locales/*" - ], - "~pages/*": [ - "src/pages/*" - ], - "~services/*": [ - "src/services/*" - ], - "~theme/*": [ - "src/theme/*" - ], - "~utils/*": [ - "src/utils/*" - ], - "~/*": [ - "src/*" - ], - "~state/*": [ - "src/state/*" - ], - "~recoil/*": [ - "src/state/recoil/*" - ], - "~auth/*": [ - "src/components/auth/*" - ], - "~settings/*": [ - "src/components/settings/*" - ] - } - } -} \ No newline at end of file diff --git a/apps/frontend/package.json b/apps/frontend/package.json index d515b296..3e927456 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -14,18 +14,18 @@ "type": "module", "private": true, "scripts": { - "dev": "pnpm with-env tsx src/server/main.ts", + "dev": "tsx src/server/main.ts", "start": "NODE_ENV=production tsx src/server/main.ts", "build": "vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "with-env": "dotenv -e ../../.env --" }, "dependencies": { - "@adminjs/express": "^6.1.0", + "@adminjs/express": "^6.1.1", "@adminjs/prisma": "^5.0.3", "@adminjs/themes": "^1.0.1", + "@celluloid/auth": "workspace:*", "@celluloid/prisma": "workspace:*", - "@celluloid/passport": "workspace:*", "@celluloid/queue": "workspace:*", "@celluloid/react-player": "2.14.0", "@celluloid/trpc": "workspace:*", @@ -39,6 +39,7 @@ "@mui/lab": "^5.0.0-alpha.153", "@mui/material": "^6.1.2", "@mui/styles": "^6.1.2", + "@t3-oss/env-core": "^0.11.1", "@tanstack/react-query": "^4.36.1", "@tanstack/react-query-devtools": "^5.4.2", "@tiptap/extension-text-style": "^2.9.1", @@ -48,6 +49,7 @@ "@types/linkify-urls": "^3.1.1", "@uidotdev/usehooks": "^2.4.1", "adminjs": "^7.8.13", + "better-auth": "^1.0.21", "change-case": "^4.1.2", "cookie-parser": "^1.4.7", "copy-to-clipboard": "^3.3.3", @@ -56,7 +58,6 @@ "enzyme": "^3.3.0", "express": "^4.21.1", "express-formidable": "^1.2.0", - "express-session": "^1.18.1", "file-saver": "^2.0.5", "formik": "^2.2.9", "get-urls": "^11.0.0", @@ -69,13 +70,11 @@ "moment-duration-format": "^2.2.2", "mui-image": "^1.0.7", "notistack": "^3.0.1", - "passport": "^0.6.0", - "passport-local": "^1.0.0", "query-string": "^6.1.0", "ramda": "^0.28.0", "randomcolor": "^0.5.3", - "react": "18.3.1", - "react-dom": "18.3.1", + "react": "catalog:react18", + "react-dom": "catalog:react18", "react-draggable": "^4.4.6", "react-error-boundary": "^4.0.11", "react-i18next": "^13.2.2", @@ -90,7 +89,7 @@ "serve": "^14.2.1", "shiitake": "^3.0.2", "tsx": "^4.19.1", - "typescript": "^5.6.2", + "typescript": "catalog:", "vite-express": "^0.19.0", "yup": "^1.4.0", "yup-locales": "^1.2.28" @@ -116,7 +115,6 @@ "@types/cors": "^2.8.13", "@types/express": "^4", "@types/express-formidable": "^1", - "@types/express-session": "^1", "@types/file-saver": "^2.0.5", "@types/get-urls": "^9.1.3", "@types/i18next": "^13.0.0", @@ -140,7 +138,8 @@ "eslint": "^8.50.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.5", - "typescript": "^5.6.2", + "nodemon": "^3.1.9", + "typescript": "catalog:", "vite": "^4.5.5", "vite-aliases": "^0.11.7" } diff --git a/apps/frontend/src/App.tsx b/apps/frontend/src/App.tsx index 83954fb1..a047bdc9 100644 --- a/apps/frontend/src/App.tsx +++ b/apps/frontend/src/App.tsx @@ -1,6 +1,6 @@ import "dayjs/locale/fr"; // import locale -import { CssBaseline, Dialog, ThemeProvider } from "@mui/material"; +import { CssBaseline, ThemeProvider } from "@mui/material"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { createWSClient, httpBatchLink, splitLink, wsLink } from "@trpc/client"; @@ -16,7 +16,6 @@ import React, { Suspense, useCallback, useState } from "react"; import { initReactI18next } from "react-i18next"; import { BrowserRouter, - createBrowserRouter, Navigate, Route, Routes, @@ -55,10 +54,6 @@ import { createTheme } from "./theme"; const API_URL = "/api/trpc"; -const WS_URL = `${location.protocol === "https:" ? "wss" : "ws"}://${ - location.host -}/trpc`; - dayjs.extend(relativeTime); dayjs.extend(isLeapYear); // use plugin dayjs.extend(duration); @@ -166,28 +161,37 @@ const App = () => { const [trpcClient] = useState(() => trpc.createClient({ links: [ - splitLink({ - condition(op) { - // check for operation type - return op.type === "subscription"; + httpBatchLink({ + url: "/api/trpc", + fetch(url, options) { + return fetch(url, { + ...options, + credentials: "include", + }); }, - // when condition is true, use normal request - true: wsLink({ - client: createWSClient({ - url: WS_URL, - }), - }), - // when condition is false, use batching - false: httpBatchLink({ - url: API_URL, - fetch(url, options) { - return fetch(url, { - ...options, - credentials: "include", - }); - }, - }), }), + // splitLink({ + // condition(op) { + // // check for operation type + // return op.type === "subscription"; + // }, + // // when condition is true, use normal request + // true: wsLink({ + // client: createWSClient({ + // url: WS_URL, + // }), + // }), + // // when condition is false, use batching + // false: httpBatchLink({ + // url: API_URL, + // fetch(url, options) { + // return fetch(url, { + // ...options, + // credentials: "include", + // }); + // }, + // }), + // }), ], }) ); diff --git a/apps/frontend/src/components/AppBarMenu.tsx b/apps/frontend/src/components/AppBarMenu.tsx index cf752cc3..b0b2781b 100644 --- a/apps/frontend/src/components/AppBarMenu.tsx +++ b/apps/frontend/src/components/AppBarMenu.tsx @@ -1,38 +1,41 @@ -import { AppBar, Box, BoxProps, Button, styled, Toolbar } from "@mui/material"; -import * as React from "react"; +import { + AppBar, + Box, + type BoxProps, + Button, + styled, + Toolbar, +} from "@mui/material"; +import type * as React from "react"; import { useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import { getButtonLink } from "~components/ButtonLink"; import { Footer } from "~components/Footer"; import { LogoWithLabel } from "~components/LogoWithLabel"; import { SigninMenu } from "~components/SigninMenu"; -import { trpc } from "~utils/trpc"; import { LanguageMenu } from "./LanguageMenu"; +import { useSession } from "~/lib/auth-client"; const Offset = styled("div")(({ theme }) => theme.mixins.toolbar); export const AppBarMenu: React.FC = ({ children }) => { const { t } = useTranslation(); const navigate = useNavigate(); - const { data, isError } = trpc.user.me.useQuery( - {}, - { retry: false, keepPreviousData: false, cacheTime: 0 } - ); - const location = useLocation(); + const { data: session } = useSession(); const handleCreate = () => { - if (data) { - navigate(`/create`); + if (session) { + navigate("/create"); } else { navigate("/signup", { state: { backgroundLocation: "/" } }); } }; const handleJoin = () => { - if (!data) { + if (!session) { navigate("/signup-student", { state: { backgroundLocation: "/" } }); } else { navigate("/join", { state: { backgroundLocation: "/" } }); @@ -95,7 +98,7 @@ export const AppBarMenu: React.FC = ({ children }) => { {t("menu.about")} - + diff --git a/apps/frontend/src/components/SharedLayout.tsx b/apps/frontend/src/components/SharedLayout.tsx index d44c776a..a7f2b744 100644 --- a/apps/frontend/src/components/SharedLayout.tsx +++ b/apps/frontend/src/components/SharedLayout.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import type * as React from "react"; import { Outlet } from "react-router-dom"; import { AppBarMenu } from "./AppBarMenu"; diff --git a/apps/frontend/src/components/SigninMenu.tsx b/apps/frontend/src/components/SigninMenu.tsx index 3438a92e..3a8b5f00 100644 --- a/apps/frontend/src/components/SigninMenu.tsx +++ b/apps/frontend/src/components/SigninMenu.tsx @@ -4,11 +4,10 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router"; -import { trpc, UserMe } from "~utils/trpc"; - import { Avatar } from "./Avatar"; +import { signOut, type User } from "~/lib/auth-client"; -export const SigninMenu = ({ user }: { user: UserMe }) => { +export const SigninMenu = ({ user }: { user: User | null }) => { const navigate = useNavigate(); const location = useLocation(); @@ -17,9 +16,6 @@ export const SigninMenu = ({ user }: { user: UserMe }) => { const [anchorEl, setAnchorEl] = React.useState(null); const open = Boolean(anchorEl); - const utils = trpc.useContext(); - const mutation = trpc.user.logout.useMutation(); - const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; @@ -28,11 +24,14 @@ export const SigninMenu = ({ user }: { user: UserMe }) => { }; const handleLogout = async () => { - await mutation.mutateAsync(); - utils.user.me.invalidate(); - utils.project.list.invalidate(); + await signOut({ + fetchOptions: { + onSuccess: () => { + navigate("/", { replace: true }); + }, + }, + }); handleClose(); - navigate("/", { replace: true }); }; const handleProfile = () => { @@ -69,7 +68,7 @@ export const SigninMenu = ({ user }: { user: UserMe }) => { borderColor: user.color, borderStyle: "solid", }} - src={user.avatar?.publicUrl} + src={user.image ?? undefined} > {user.initial} @@ -136,7 +135,7 @@ export const SigninMenu = ({ user }: { user: UserMe }) => { }, }} > - {user && user.role == "Admin" ? ( + {user && user.role === "admin" ? ( {t("menu.admin")} diff --git a/apps/frontend/src/components/TransUserRole.tsx b/apps/frontend/src/components/TransUserRole.tsx index b4cfde7b..d9e5eb29 100644 --- a/apps/frontend/src/components/TransUserRole.tsx +++ b/apps/frontend/src/components/TransUserRole.tsx @@ -1,14 +1,10 @@ import { Trans } from "react-i18next"; -export const TransUserRole = ({ - role, -}: { - role: "Student" | "Teacher" | "Admin"; -}) => - role == "Student" ? ( - - ) : role == "Teacher" ? ( +export const TransUserRole = ({ role }: { role?: string }) => + role === "admin" ? ( + + ) : role === "teacher" ? ( ) : ( - + ); diff --git a/apps/frontend/src/components/auth/ConfirmDialog.tsx b/apps/frontend/src/components/auth/ConfirmDialog.tsx index bc2b6b6d..2bfbc226 100644 --- a/apps/frontend/src/components/auth/ConfirmDialog.tsx +++ b/apps/frontend/src/components/auth/ConfirmDialog.tsx @@ -4,13 +4,13 @@ import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { useSnackbar } from "notistack"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; +import { authClient } from "~/lib/auth-client"; import { useProjectInputIntialValue } from "~/state"; import { StyledDialog } from "~components/Dialog"; import { useRouteQuery } from "~hooks/useRouteQuery"; -import { trpc } from "~utils/trpc"; export const ConfirmDialog: React.FC = () => { const { t } = useTranslation(); @@ -18,8 +18,6 @@ export const ConfirmDialog: React.FC = () => { const query = useRouteQuery(); const { enqueueSnackbar } = useSnackbar(); - const utils = trpc.useUtils(); - const mutation = trpc.user.confirm.useMutation(); const savedProjectValue = useProjectInputIntialValue(); const validationSchema = Yup.object().shape({ @@ -33,7 +31,11 @@ export const ConfirmDialog: React.FC = () => { const handleResendCode = async () => { if (queryEmail) { - await utils.client.user.askEmailConfirm.mutate({ email: queryEmail }); + await authClient.emailOtp.sendVerificationOtp({ + email: queryEmail, + type: "sign-in", // or "email-verification", "forget-password" + }); + enqueueSnackbar(t("confirm.resend.success", "Code envoyé"), { variant: "success", }); @@ -51,13 +53,24 @@ export const ConfirmDialog: React.FC = () => { validateOnBlur: true, validateOnChange: true, onSubmit: async (values) => { + if (!values.username) { + formik.setFieldError("username", t("confirm.username.required")); + return; + } + + formik.setSubmitting(true); + try { - await mutation.mutateAsync({ - username: values.username, - code: values.code, + const { data, error } = await authClient.signIn.emailOtp({ + email: values.username, + otp: values.code, }); - utils.user.me.invalidate(); + if (error) { + formik.setFieldError("error", error.message); + formik.setSubmitting(false); + return; + } if (savedProjectValue.videoInfo) { navigate("/create", { replace: true }); @@ -69,6 +82,8 @@ export const ConfirmDialog: React.FC = () => { } catch (e) { formik.setFieldError("error", e.message); console.log(e); + } finally { + formik.setSubmitting(false); } }, }); @@ -133,8 +148,8 @@ export const ConfirmDialog: React.FC = () => { color="primary" type="submit" data-testid="submit" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} > Envoyer diff --git a/apps/frontend/src/components/auth/ForgotDialog.tsx b/apps/frontend/src/components/auth/ForgotDialog.tsx index 5e1ba552..c02ba29c 100644 --- a/apps/frontend/src/components/auth/ForgotDialog.tsx +++ b/apps/frontend/src/components/auth/ForgotDialog.tsx @@ -3,26 +3,22 @@ import { Box, Button, DialogActions } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; +import { authClient } from "~/lib/auth-client"; import { StyledDialog } from "~components/Dialog"; -import { trpc } from "~utils/trpc"; export const ForgotDialog: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); - const location = useLocation(); - - const utils = trpc.useContext(); - const mutation = trpc.user.forgot.useMutation(); const validationSchema = Yup.object().shape({ email: Yup.string().required(t("forgot.email.required")), }); - const handleRecover = () => { - navigate("/recover", { + const handleRecover = (email?: string) => { + navigate(`/recover?email=${email}`, { state: { backgroundLocation: "/" }, replace: true, }); @@ -38,18 +34,18 @@ export const ForgotDialog: React.FC = () => { validateOnBlur: true, validateOnChange: true, onSubmit: async (values) => { - try { - await mutation.mutateAsync({ - email: values.email, - }); + const { error } = await authClient.emailOtp.sendVerificationOtp({ + email: values.email, + type: "forget-password", // or "email-verification", "forget-password" + }); - utils.user.me.invalidate(); - handleRecover(); - formik.setStatus("submited"); - } catch (e) { - formik.setFieldError("error", e.message); - console.log(e); + if (error) { + formik.setFieldError("error", error.message); + formik.setSubmitting(false); + return; } + + handleRecover(values.email); }, }); @@ -60,6 +56,7 @@ export const ForgotDialog: React.FC = () => { error={formik.errors.error} open={true} loading={formik.isSubmitting} + maxWidth="sm" >
{ size="large" color="primary" type="submit" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} > Changer le mot de passe diff --git a/apps/frontend/src/components/auth/JoinDialog.tsx b/apps/frontend/src/components/auth/JoinDialog.tsx index adb7956a..eecee10f 100644 --- a/apps/frontend/src/components/auth/JoinDialog.tsx +++ b/apps/frontend/src/components/auth/JoinDialog.tsx @@ -1,16 +1,9 @@ import { LoadingButton } from "@mui/lab"; -import { - Alert, - Box, - Button, - DialogActions, - DialogContent, - Stack, -} from "@mui/material"; +import { DialogActions, DialogContent } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; import { StyledDialog } from "~components/Dialog"; @@ -19,10 +12,9 @@ import { isTRPCClientError, trpc } from "~utils/trpc"; export const JoinDialog: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); - const location = useLocation(); const utils = trpc.useContext(); - const mutation = trpc.user.join.useMutation(); + const mutation = trpc.user.joinProject.useMutation(); const validationSchema = Yup.object().shape({ shareCode: Yup.string().required(), @@ -53,13 +45,13 @@ export const JoinDialog: React.FC = () => { } } catch (e) { if (isTRPCClientError(e)) { - if (e.message == "PROJECT_OWNER_CANNOT_JOIN") { + if (e.message === "PROJECT_OWNER_CANNOT_JOIN") { // `cause` is now typed as your router's `TRPCClientError` formik.setFieldError( "error", t("join.error.project-owner-cannot-join") ); - } else if (e.message == "CODE_NOT_FOUND") { + } else if (e.message === "CODE_NOT_FOUND") { formik.setFieldError( "shareCode", t("join.error.project-not-found", "Code de partage est invalide") diff --git a/apps/frontend/src/components/auth/LoginDialog.tsx b/apps/frontend/src/components/auth/LoginDialog.tsx index ba4ca038..a1a5fb1a 100644 --- a/apps/frontend/src/components/auth/LoginDialog.tsx +++ b/apps/frontend/src/components/auth/LoginDialog.tsx @@ -1,12 +1,5 @@ import { LoadingButton } from "@mui/lab"; -import { - Alert, - Box, - Button, - DialogActions, - DialogContent, - Stack, -} from "@mui/material"; +import { Box, Button, DialogActions, DialogContent } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; @@ -14,7 +7,9 @@ import { useLocation, useNavigate } from "react-router"; import * as Yup from "yup"; import { StyledDialog } from "~components/Dialog"; -import { isTRPCClientError, trpc } from "~utils/trpc"; +import { trpc } from "~utils/trpc"; +import { signIn } from "~/lib/auth-client"; +import { authClient } from "../../lib/auth-client"; export const LoginDialog: React.FC = () => { const { t } = useTranslation(); @@ -22,7 +17,6 @@ export const LoginDialog: React.FC = () => { const location = useLocation(); const utils = trpc.useContext(); - const mutation = trpc.user.login.useMutation(); const validationSchema = Yup.object().shape({ username: Yup.string().required().label(t("signin.username")), @@ -40,7 +34,7 @@ export const LoginDialog: React.FC = () => { navigate( { pathname: "/confirm", - search: email ? "?email=" + email : undefined, + search: email ? `?email=${email}` : undefined, }, { state: { backgroundPath: "/" }, @@ -67,36 +61,43 @@ export const LoginDialog: React.FC = () => { validateOnBlur: true, validateOnChange: true, onSubmit: async (values) => { - try { - await mutation.mutateAsync({ + formik.setSubmitting(true); + + const { error } = await signIn.email({ + email: values.username, + password: values.password, + }); + + if (error?.code === "EMAIL_NOT_VERIFIED") { + await authClient.emailOtp.sendVerificationOtp({ + email: values.username, + type: "sign-in", + }); + return handleConfirm(values.username); + } + + if (error) { + const { error } = await signIn.username({ username: values.username, - email: values.email, password: values.password, }); - - utils.user.me.invalidate(); - utils.project.list.invalidate(); - navigate(-1); - formik.setStatus("submited"); - } catch (e) { - if (isTRPCClientError(e)) { - console.log(e.message); - // `cause` is now typed as your router's `TRPCClientError` - if (e.message === "USER_NOT_CONFIRMED") { - handleConfirm(values.username); - } else if (e.message === "USER_NOT_FOUND") { - formik.setFieldError( - "error", - t( - "signin.error.user-not-found", - "Nom d'utilisateur ou mot de passe incorrect" - ) - ); - } - } else { - formik.setFieldError("error", e.message); + if (error) { + formik.setFieldError( + "error", + t( + "signin.error.user-not-found", + "Nom d'utilisateur ou mot de passe incorrect" + ) + ); + formik.setSubmitting(false); + return; } } + + utils.project.list.invalidate(); + navigate(-1); + formik.setStatus("submited"); + formik.setSubmitting(false); }, }); @@ -187,8 +188,8 @@ export const LoginDialog: React.FC = () => { color="primary" type="submit" data-testid="submit" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} sx={{ textTransform: "uppercase" }} > diff --git a/apps/frontend/src/components/auth/RecoverDialog.tsx b/apps/frontend/src/components/auth/RecoverDialog.tsx index 69eb783d..465f6f8a 100644 --- a/apps/frontend/src/components/auth/RecoverDialog.tsx +++ b/apps/frontend/src/components/auth/RecoverDialog.tsx @@ -1,24 +1,22 @@ import { LoadingButton } from "@mui/lab"; -import { Alert, Box, Button, DialogActions, Stack } from "@mui/material"; +import { DialogActions } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; +import { authClient } from "~/lib/auth-client"; import { StyledDialog } from "~components/Dialog"; -import { trpc } from "~utils/trpc"; +import { useRouteQuery } from "~hooks/useRouteQuery"; export const RecoverDialog: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); - const location = useLocation(); - - const utils = trpc.useContext(); - const mutation = trpc.user.recover.useMutation(); + const query = useRouteQuery(); const validationSchema = Yup.object().shape({ - username: Yup.string().required(t("recover.username.required")), + email: Yup.string().required(t("recorver.email.required")), code: Yup.string() .min(4, "Code is too short - should be 4 chars minimum.") .required(t("recover.code.required")), @@ -29,10 +27,11 @@ export const RecoverDialog: React.FC = () => { .oneOf([Yup.ref("password")], "Passwords must match") .required("Password confirmation is required"), }); + const queryEmail = query.get("email") || undefined; const formik = useFormik({ initialValues: { - username: "", + email: queryEmail, code: "", password: "", passwordConfirmation: "", @@ -43,20 +42,25 @@ export const RecoverDialog: React.FC = () => { validateOnBlur: true, validateOnChange: true, onSubmit: async (values) => { - try { - await mutation.mutateAsync({ - username: values.username, - password: values.password, - code: values.code, - }); + formik.setSubmitting(true); + const { error } = await authClient.emailOtp.resetPassword({ + email: values.email, + otp: values.code, + password: values.password, + }); - utils.user.me.invalidate(); - navigate("/"); - formik.setStatus("submited"); - } catch (e) { - formik.setFieldError("error", e.message); - console.log(e); + if (error) { + formik.setFieldError("error", error.message); + formik.setSubmitting(false); + return; } + + await authClient.signIn.email({ + email: values.email, + password: values.password, + }); + + navigate("/"); }, }); @@ -70,21 +74,21 @@ export const RecoverDialog: React.FC = () => { > { size="large" color="primary" type="submit" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} > Envoyer diff --git a/apps/frontend/src/components/auth/SignupDialog.tsx b/apps/frontend/src/components/auth/SignupDialog.tsx index 231749e7..817b5425 100644 --- a/apps/frontend/src/components/auth/SignupDialog.tsx +++ b/apps/frontend/src/components/auth/SignupDialog.tsx @@ -1,28 +1,17 @@ import { LoadingButton } from "@mui/lab"; -import { - Alert, - Box, - Button, - DialogActions, - DialogContent, - Stack, -} from "@mui/material"; +import { DialogActions, DialogContent } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; +import { authClient, signUp } from "~/lib/auth-client"; import { StyledDialog } from "~components/Dialog"; -import { isTRPCClientError, trpc } from "~utils/trpc"; export const SignupDialog: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); - const location = useLocation(); - - const utils = trpc.useContext(); - const mutation = trpc.user.register.useMutation(); const validationSchema = Yup.object().shape({ username: Yup.string().required().label(t("signup.username.label")), @@ -47,32 +36,35 @@ export const SignupDialog: React.FC = () => { validateOnBlur: true, validateOnChange: true, onSubmit: async (values) => { - try { - await mutation.mutateAsync({ - username: values.username, + formik.setSubmitting(true); + + const { data, error } = await signUp.email({ + email: values.email, + password: values.password, + username: values.username, + }); + + if (error) { + if (error.code === "ACCOUNT_EXISTS") { + formik.setFieldError("email", error.message); + } else { + formik.setFieldError("error", error.message); + } + formik.setSubmitting(false); + return; + } + if (data.emailVerified === false) { + await authClient.emailOtp.sendVerificationOtp({ email: values.email, - password: values.password, + type: "sign-in", // or "email-verification", "forget-password" }); - - utils.user.me.invalidate(); - navigate(`/confirm?email=${values.email}`, { + return navigate(`/confirm?email=${values.email}`, { state: { backgroundLocation: "/" }, }); - formik.setStatus("submited"); - } catch (e) { - if (isTRPCClientError(e)) { - // `cause` is now typed as your router's `TRPCClientError` - if (e.message === "ACCOUNT_EXISTS") { - formik.setFieldError( - "email", - t("signup.error.account_exists", "Email exists dejà") - ); - } - } else { - formik.setFieldError("error", e.message); - console.log(e); - } } + navigate(-1); + + // utils.user.me.invalidate(); }, }); @@ -195,8 +187,8 @@ export const SignupDialog: React.FC = () => { size="large" type="submit" data-testid="submit" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} > S'inscrire diff --git a/apps/frontend/src/components/auth/StudentSignupDialog.tsx b/apps/frontend/src/components/auth/StudentSignupDialog.tsx index 0633efa6..b4025bf5 100644 --- a/apps/frontend/src/components/auth/StudentSignupDialog.tsx +++ b/apps/frontend/src/components/auth/StudentSignupDialog.tsx @@ -1,17 +1,11 @@ import { LoadingButton } from "@mui/lab"; -import { - Alert, - Box, - Button, - DialogActions, - DialogContent, - Stack, -} from "@mui/material"; +import { Box, Button, DialogActions, DialogContent } from "@mui/material"; import TextField from "@mui/material/TextField"; import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; -import { useLocation, useNavigate } from "react-router"; +import { useNavigate } from "react-router"; import * as Yup from "yup"; +import { authClient } from "~/lib/auth-client"; import { StyledDialog } from "~components/Dialog"; import { isTRPCClientError, trpc } from "~utils/trpc"; @@ -19,10 +13,9 @@ import { isTRPCClientError, trpc } from "~utils/trpc"; export const StudentSignupDialog: React.FC = () => { const { t } = useTranslation(); const navigate = useNavigate(); - const location = useLocation(); - const utils = trpc.useContext(); - const mutation = trpc.user.registerAsStudent.useMutation(); + // const utils = trpc.useContext(); + const mutation = trpc.user.joinProject.useMutation(); const validationSchema = Yup.object().shape({ shareCode: Yup.string().required(), @@ -31,7 +24,7 @@ export const StudentSignupDialog: React.FC = () => { }); const handleSignin = () => { - navigate(`/login`, { + navigate("/login", { state: { backgroundLocation: "/" }, }); }; @@ -49,39 +42,44 @@ export const StudentSignupDialog: React.FC = () => { validateOnChange: true, onSubmit: async (values) => { try { - const data = await mutation.mutateAsync({ + formik.setSubmitting(true); + const { error } = await authClient.signUpAsStudent({ username: values.username, password: values.password, - shareCode: values.shareCode, }); - formik.setStatus("submited"); - utils.user.me.invalidate(); + if (error) { + if (error.code === "USERNAME_IS_ALREADY_TAKEN_PLEASE_TRY_ANOTHER") { + formik.setFieldError("username", t("join.error.username-taken")); + } + return; + } + const { projectId } = await mutation.mutateAsync({ + shareCode: values.shareCode, + }); - if (data.projectId) { - navigate(`/project/${data.projectId}`); + if (projectId) { + navigate(`/project/${projectId}`); } else { navigate("/"); } + formik.setStatus("submited"); + // utils.user.me.invalidate(); } catch (e) { if (isTRPCClientError(e)) { // `cause` is now typed as your router's `TRPCClientError` - if (e.message == "PROJECT_OWNER_CANNOT_JOIN") { + if (e.message === "PROJECT_OWNER_CANNOT_JOIN") { // `cause` is now typed as your router's `TRPCClientError` formik.setFieldError( - "error", + "shareCode", t("join.error.project-owner-cannot-join") ); - } else if (e.message == "ACCOUNT_EXISTS") { - formik.setFieldError( - "username", - t("join.error.account", "Nom d'utilisateur existe déjà") - ); - } else if (e.message == "CODE_NOT_FOUND") { + } else if (e.message === "CODE_NOT_FOUND") { formik.setFieldError( "shareCode", t("join.error.project-not-found", "Code de partage est invalide") ); + navigate("/join", { replace: true }); } } else { formik.setFieldError( @@ -199,8 +197,8 @@ export const StudentSignupDialog: React.FC = () => { color="primary" type="submit" data-testid="submit-button" - loading={mutation.isLoading} - disabled={mutation.isLoading} + loading={formik.isSubmitting} + disabled={formik.isSubmitting} > Rejoindre diff --git a/apps/frontend/src/components/chapters/form.tsx b/apps/frontend/src/components/chapters/form.tsx index 638e40d5..03eb7eb1 100644 --- a/apps/frontend/src/components/chapters/form.tsx +++ b/apps/frontend/src/components/chapters/form.tsx @@ -4,21 +4,31 @@ import { useFormik } from "formik"; import { Trans, useTranslation } from "react-i18next"; import * as Yup from "yup"; import BookmarksIcon from "@mui/icons-material/Bookmarks"; -import { useVideoPlayerProgressValue } from "~components/project/useVideoPlayer"; -import { type ProjectById, trpc, type UserMe } from "~utils/trpc"; +import { + type ChapterByProjectId, + type ProjectById, + trpc, + type UserMe, +} from "~utils/trpc"; import { ChapterTimestampSlider } from "./slider"; import { useState } from "react"; +import { useConfirm } from "material-ui-confirm"; type ChapterFormProps = { project: ProjectById; - user: UserMe; + user?: UserMe; + chapters: ChapterByProjectId[]; }; export const ChapterForm: React.FC = (props) => { + const [showForm, setShowForm] = useState(false); + + const confirm = useConfirm(); const { t } = useTranslation(); - const [showForm, setShowForm] = useState(false); + const utils = trpc.useUtils(); + const resetMutation = trpc.chapter.reset.useMutation(); const handleOpen = () => { setShowForm(true); @@ -28,6 +38,47 @@ export const ChapterForm: React.FC = (props) => { setShowForm(false); }; + const handleReset = () => { + confirm({ + title: t("chapters.form.reset.confirm.title"), + description: t("chapters.form.reset.confirm.description"), + confirmationText: t("deleteAction"), + cancellationText: t("cancelAction"), + confirmationButtonProps: { + variant: "contained", + color: "error", + }, + contentProps: { + sx: { + color: "white", + backgroundColor: "background.dark", + }, + }, + titleProps: { + sx: { + color: "white", + backgroundColor: "background.dark", + }, + }, + dialogActionsProps: { + sx: { + backgroundColor: "background.dark", + }, + }, + }).then(async () => { + await resetMutation.mutateAsync( + { projectId: props.project.id }, + { + onSuccess: () => { + utils.chapter.byProjectId.invalidate({ + projectId: props.project.id, + }); + }, + } + ); + }); + }; + return ( <> @@ -41,8 +92,19 @@ export const ChapterForm: React.FC = (props) => { sx={{ width: "100%" }} startIcon={} > - Add Chapter + {t("chapters.form.button.add")} + {props.chapters.length > 0 && ( + + )} @@ -133,7 +195,7 @@ export const ChapterFormContent: React.FC< id="title" name="title" sx={{ ml: 1, flex: 1, color: "white" }} - placeholder="Chapter title" + placeholder={t("chapters.form.title.placeholder")} value={formik.values.title} onChange={formik.handleChange} onBlur={formik.handleBlur} @@ -159,7 +221,7 @@ export const ChapterFormContent: React.FC< id="description" name="description" sx={{ ml: 1, flex: 1, color: "white" }} - placeholder="Chapter description" + placeholder={t("chapters.form.description.placeholder")} multiline maxRows={5} minRows={2} diff --git a/apps/frontend/src/components/chapters/panel.tsx b/apps/frontend/src/components/chapters/panel.tsx index fd2377df..63dce1d0 100644 --- a/apps/frontend/src/components/chapters/panel.tsx +++ b/apps/frontend/src/components/chapters/panel.tsx @@ -117,6 +117,11 @@ function ChapterList({ ); } +type ChaptersPanelProps = { + project: ProjectById; + user?: UserMe; +}; + export function ChaptersPanel({ project, user }: ChaptersPanelProps) { // return
{JSON.stringify(project)}
; @@ -151,7 +156,7 @@ export function ChaptersPanelContent({ project, user }: ChaptersPanelProps) { return ( - + ); } diff --git a/apps/frontend/src/components/home/ProjectGrid.tsx b/apps/frontend/src/components/home/ProjectGrid.tsx index 0ca597ac..7a030c12 100644 --- a/apps/frontend/src/components/home/ProjectGrid.tsx +++ b/apps/frontend/src/components/home/ProjectGrid.tsx @@ -25,6 +25,7 @@ import { StyledTitle } from "~components/typography"; import { trpc } from "~utils/trpc"; import ProjectThumbnail from "./ProjectThumbnail"; +import { useSession } from "~/lib/auth-client"; export const ProjectGrid: React.FC = () => { const searchInputRef = useRef(null); @@ -39,7 +40,8 @@ export const ProjectGrid: React.FC = () => { } }, 1000); - const { data: user } = trpc.user.me.useQuery(); + const { data: session } = useSession(); + const [data, mutation] = trpc.project.list.useSuspenseQuery({ term: searchTerm, }); @@ -49,13 +51,15 @@ export const ProjectGrid: React.FC = () => { const userProjects = useMemo( () => data.items - .filter((project) => user && project.userId === user.id) + .filter( + (project) => session?.user && project.userId === session?.user?.id + ) .sort( (a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime() ), - [user, data] + [session?.user, data] ); const publicProjects = R.difference(data.items, userProjects); diff --git a/apps/frontend/src/lib/auth-client.ts b/apps/frontend/src/lib/auth-client.ts new file mode 100644 index 00000000..3df14509 --- /dev/null +++ b/apps/frontend/src/lib/auth-client.ts @@ -0,0 +1,18 @@ +import { createAuthClient } from "better-auth/react"; +import { + emailOTPClient, + inferAdditionalFields, + usernameClient, +} from "better-auth/client/plugins"; +import type { auth } from "@celluloid/auth"; +import { signupAsStudentClient } from "@celluloid/auth/plugins" + + +export const authClient = createAuthClient({ + plugins: [signupAsStudentClient(), usernameClient(), emailOTPClient(), inferAdditionalFields()], +}); + +export type Session = typeof authClient.$Infer.Session; +export type User = typeof authClient.$Infer.Session.user; + +export const { signIn, signUp, signOut, useSession } = authClient; diff --git a/apps/frontend/src/locales/en/common.json b/apps/frontend/src/locales/en/common.json index fccfaff1..b8e87f9a 100644 --- a/apps/frontend/src/locales/en/common.json +++ b/apps/frontend/src/locales/en/common.json @@ -40,7 +40,7 @@ "home.newProject": "Create project", "home.publicProjects": "Explore", "home.searchProject": "Type anything…", - "home.title": "What is Celluloid ?", + "home.title": "What is Especateur ?", "home.tutoriel.description": "Go to <0>Peertube\nChoose a video or upload a new one\nCopy the link to share the video\nCreate your project in Celluloid, copy the video link and go!\nWant to work with others? Share the project code with your partners", "home.tutoriel.link": "The tutorial is here: <0>https://celluloid-media.huma-num.fr/w/7r2FxoQdYjun6tYWJfHUCa", "home.tutoriel.prefix": "To discover the application, you can consult the ", @@ -184,8 +184,8 @@ "recover.code.required": "Code is required", "recover.password.required": "Password is required", "recover.title": "Recover account", - "recover.username.label": "Email or username", - "recover.username.paceholder": "Email or username", + "recover.username.label": "Email", + "recover.username.paceholder": "Email", "recover.code.label": "Confirmation code", "recover.code.placeholder": "Confirmation code", "recover.password.label": "Password", @@ -255,5 +255,13 @@ "project.chapters.button.generate": "Generate Chapters", "chapter.confirm-delete.description": "Are you sure you want to delete the chapter?", "project.chapters.item.placeholder.title": "Chapter title", - "project.chapters.item.placeholder.description": "Chapter description" + "project.chapters.item.placeholder.description": "Chapter description", + "recorver.email.required": "Email is required", + "join.error.username-taken": "Username is already taken", + "chapters.form.reset.confirm.title": "Reset all chapters", + "chapters.form.reset.confirm.description": "Are you sure you want to reset all chapters ?", + "chapters.form.button.add": " Add Chapter", + "chapters.form.button.reset": "Reset Chapters", + "chapters.form.title.placeholder": "Chapter title", + "chapters.form.description.placeholder": "Chapter description" } diff --git a/apps/frontend/src/locales/fr/common.json b/apps/frontend/src/locales/fr/common.json index b5e9bde0..12eb9418 100644 --- a/apps/frontend/src/locales/fr/common.json +++ b/apps/frontend/src/locales/fr/common.json @@ -40,7 +40,7 @@ "home.newProject": "Créer un projet", "home.publicProjects": "Explorer", "home.searchProject": "Rechercher un projet…", - "home.title": "Qu’est-ce que Celluloid ?", + "home.title": "Qu’est-ce que Espectateur ?", "home.tutoriel.description": "Rendez-vous sur une instance <0>Peertube. \nChoisissez une vidéo ou déposez-en une nouvelle dans l’instance.\nCopiez le lien de partage de la vidéo.\nCréez votre projet dans Celluloid en collant le lien de la vidéo et lancez-vous !\nVous voulez travailler à plusieurs ? Partagez le code du projet avec vos partenaires...", "home.tutoriel.link": "Le tutoriel est ici : <0>https://celluloid-media.huma-num.fr/w/7r2FxoQdYjun6tYWJfHUCa", "home.tutoriel.prefix": "Vous voulez en savoir plus ou vous rencontrez des difficultés ?", @@ -184,8 +184,8 @@ "recover.code.required": "Code est obligatoire", "recover.password.required": "Mot de passe est requis", "recover.title": "Récupérer le compte", - "recover.username.label": "Email ou nom d'utilisateur", - "recover.username.paceholder": "Email ou nom d'utilisateur", + "recover.username.label": "Adresse mail", + "recover.username.paceholder": "Adresse mail", "recover.code.label": "Code de confirmation", "recover.code.placeholder": "Code de confirmation", "recover.password.label": "Mot de passe", @@ -255,5 +255,12 @@ "project.chapters.button.generate": "Générer des chapitres", "chapter.confirm-delete.description": "Etes-vous sûr de vouloir supprimer le chapitre ?", "project.chapters.item.placeholder.title": "Titre du chapitre", - "project.chapters.item.placeholder.description": "Description du chapitre" + "project.chapters.item.placeholder.description": "Description du chapitre", + "recorver.email.required": "L'email est obligatoire", + "join.error.username-taken": "Le nom d'utilisateur existe déjà", + "chapters.form.reset.confirm.title": "Réinitialiser tous les chapitres", + "chapters.form.reset.confirm.description": "Etes-vous sûr de vouloir réinitialiser tous les chapitres ?", + "chapters.form.button.add": " Ajouter un chapitre", + "chapters.form.button.reset": "Réinitialiser les chapitres", + "chapters.form.title.placeholder": "Titre du chapitre" } diff --git a/apps/frontend/src/pages/create.tsx b/apps/frontend/src/pages/create.tsx index 86713501..118b13e0 100644 --- a/apps/frontend/src/pages/create.tsx +++ b/apps/frontend/src/pages/create.tsx @@ -1,5 +1,4 @@ import ClearIcon from "@mui/icons-material/Clear"; -import CloseIcon from "@mui/icons-material/Close"; import DeleteIcon from "@mui/icons-material/Delete"; import KeyboardReturnIcon from "@mui/icons-material/KeyboardReturn"; import LinkIcon from "@mui/icons-material/Link"; @@ -7,12 +6,10 @@ import PlaylistAddIcon from "@mui/icons-material/PlaylistAdd"; import { LoadingButton } from "@mui/lab"; import { Alert, - Autocomplete, Box, ButtonBase, Chip, CircularProgress, - Container, Grid, IconButton, InputAdornment, @@ -29,6 +26,7 @@ import React, { useCallback, useEffect, useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router"; import * as Yup from "yup"; +import { useSession } from "~/lib/auth-client"; import { useProjectInputIntialState, @@ -186,7 +184,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ const navigate = useNavigate(); const location = useLocation(); - const { data: user } = trpc.user.me.useQuery(); + const { data: session } = useSession(); const playlistMutation = trpc.playlist.add.useMutation(); const projectMutation = trpc.project.add.useMutation(); @@ -211,6 +209,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ public: Yup.bool(), collaborative: Yup.bool(), videoInfo: Yup.object().required(), + shared: Yup.bool(), }); const formik = useFormik({ @@ -222,7 +221,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ validationSchema: validationSchema, onSubmit: async (values) => { setIsSubmitting(true); - if (!user) { + if (!session) { setInitialValue({ title: values.title, description: values.description, @@ -230,6 +229,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ collaborative: values.collaborative, keywords: values.keywords, videoInfo: data, + shared: values.shared, }); navigate("/login", { state: { backgroundPath: location.pathname } }); } else { @@ -251,7 +251,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ objective: "", levelStart: 0, levelEnd: 5, - shared: false, + shared: values.shared, }); if (project) { formik.resetForm(); @@ -269,6 +269,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ thumbnailURL: video.thumbnailURL, metadata: video.metadata, keywords: values.keywords, + shared: values.shared, })), description: values.description, public: values.public, @@ -276,7 +277,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ objective: "", levelStart: 0, levelEnd: 5, - shared: false, + shared: values.shared, userId: "", }); if (playlist) { @@ -287,7 +288,7 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ } } } catch (e) { - if (e.message == ERR_ALREADY_EXISTING_PROJECT) { + if (e.message === ERR_ALREADY_EXISTING_PROJECT) { formik.setFieldError( "title", humanizeError("ERR_ALREADY_EXISTING_PROJECT") @@ -442,6 +443,43 @@ const CreateProjectForm: React.FC<{ data: PeerTubeVideoDataResult }> = ({ + + + + + + + + + + { + formik.setFieldValue("shared", value); + }} + /> + + + + + + + + + { - const { isError } = trpc.user.me.useQuery( - {}, - { retry: false, keepPreviousData: false, cacheTime: 0 } - ); - - const location = useLocation(); + const { data: session } = useSession(); const { t } = useTranslation(); const navigate = useNavigate(); const handleJoin = useCallback(() => { - if (isError) { + if (!session) { navigate("/signup-student", { state: { backgroundLocation: "/" } }); } else { navigate("/join", { state: { backgroundLocation: "/" } }); } - }, [isError, navigate]); + }, [session, navigate]); const handleCreate = () => { - navigate(`/create`); + navigate("/create"); }; return ( @@ -94,7 +89,7 @@ export const HomePage: React.FC = () => { gutterBottom={true} fontFamily={"abril_fatfaceregular"} > - + diff --git a/apps/frontend/src/pages/profile.tsx b/apps/frontend/src/pages/profile.tsx index a914b3d3..373bd709 100644 --- a/apps/frontend/src/pages/profile.tsx +++ b/apps/frontend/src/pages/profile.tsx @@ -5,7 +5,7 @@ import { Stack, Typography, } from "@mui/material"; -import * as React from "react"; +import type * as React from "react"; import { Avatar } from "~components/Avatar"; import { MyProjectGrid } from "~components/profile/MyProjectGrid"; @@ -48,6 +48,7 @@ const UserProfile: React.FC = () => { borderWidth: 2, borderColor: data.color, borderStyle: "solid", + fontSize: 30, }} src={data.avatar?.publicUrl} > @@ -63,7 +64,10 @@ const UserProfile: React.FC = () => { {data.username} - {data.email} - + {data.email} + + + diff --git a/apps/frontend/src/pages/project.tsx b/apps/frontend/src/pages/project.tsx index 08e4636b..fc7ea9d3 100644 --- a/apps/frontend/src/pages/project.tsx +++ b/apps/frontend/src/pages/project.tsx @@ -3,11 +3,9 @@ import { Box, CircularProgress, Container, - Fab, Grid, Grid2, Paper, - Tooltip, } from "@mui/material"; import React, { Suspense, useEffect, useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -17,10 +15,7 @@ import { AnnotationHints } from "~components/annotation/AnnotationHints"; import { AnnotationPanel } from "~components/annotation/AnnotationPanel"; import { ContextualAnnotations } from "~components/annotation/ContextualAnnotations"; import { ContextualEditor } from "~components/annotation/ContextualEditor"; -import { - useAnnotationEditorState, - useAnnotationHintsVisible, -} from "~components/annotation/useAnnotationEditor"; +import { useAnnotationEditorState } from "~components/annotation/useAnnotationEditor"; import ProjectSummary from "~components/project/ProjectSummary"; import { SideBar } from "~components/project/SideBar"; import { useVideoPlayerProgressValue } from "~components/project/useVideoPlayer"; @@ -28,7 +23,6 @@ import { VideoPlayer } from "~components/project/VideoPlayer"; import { useVideoPlayerEvent } from "~hooks/use-video-player"; import { type AnnotationByProjectId, trpc } from "~utils/trpc"; import type { ProjectById, UserMe } from "~utils/trpc"; -import ViewTimelineIcon from "@mui/icons-material/ViewTimeline"; interface Props { project: ProjectById; @@ -38,7 +32,6 @@ interface Props { const ProjectMainGrid: React.FC = ({ project, user }) => { const videoPlayerRef = React.useRef(null); - const { t } = useTranslation(); const utils = trpc.useUtils(); const videoProgress = useVideoPlayerProgressValue(); const [playerIsReady, setPlayerIsReady] = React.useState(false); diff --git a/apps/frontend/src/server/env.ts b/apps/frontend/src/server/env.ts new file mode 100644 index 00000000..06d4489d --- /dev/null +++ b/apps/frontend/src/server/env.ts @@ -0,0 +1,19 @@ +import { createEnv } from "@t3-oss/env-core"; +import { env as queueEnv } from "@celluloid/queue/env"; +import { env as trpcEnv } from "@celluloid/trpc/env"; +import { env as prismaEnv } from "@celluloid/prisma/env"; +import { env as authEnv } from "@celluloid/auth/env"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + BASE_URL: z.string(), + }, + clientPrefix: 'VITE', + client: { + VITE_COMMIT: z.string().default('dev'), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true, + extends: [queueEnv, trpcEnv, prismaEnv, authEnv] +},); diff --git a/apps/frontend/src/server/main.ts b/apps/frontend/src/server/main.ts index ce020ec4..2049d491 100644 --- a/apps/frontend/src/server/main.ts +++ b/apps/frontend/src/server/main.ts @@ -2,37 +2,24 @@ import express from "express"; import ViteExpress from "vite-express"; import * as trpcExpress from '@trpc/server/adapters/express'; import { appRouter, createContext } from '@celluloid/trpc'; -import type { Session } from 'express-session'; -import { createSession, passport } from '@celluloid/passport'; -import cookieParser from 'cookie-parser'; +import cookies from 'cookie-parser'; import cors from 'cors'; -const app = express(); +import "./env"; + import { emailQueue, chaptersQueue } from "@celluloid/queue"; +import { expressAuthHandler, expressAuthSession } from "@celluloid/auth"; import getAdminRouter from "./admin"; -import { UserRole } from "@celluloid/prisma"; - -const trpcApiEndpoint = '/api/trpc' - -declare module 'http' { - interface IncomingMessage { - session: Session & { - userId?: string - } - } -} +import { debug } from "node:util"; -const sessionParser = createSession(); +const app = express(); app.disable('x-powered-by'); -app.use(express.json()); app.use(express.urlencoded({ extended: true })); -app.use(sessionParser); - app.enable('trust proxy'); // parse cookies -app.use(cookieParser()); +app.use(cookies()); // Setup CORS app.use(cors({ @@ -40,15 +27,7 @@ app.use(cors({ credentials: true, })); -app.use((req, res, next) => { - //@ts-expect-error dynamic - passport.authenticate('session', (err) => { - if (err && err.name === "DeserializeUserError") { - req.session.destroy(() => - next()) - } - })(req, res, next); -}); +app.all("/api/auth/*", expressAuthHandler); // app.use((req, _res, next) => { // // request logger @@ -56,20 +35,28 @@ app.use((req, res, next) => { // next(); // }); +app.get("/api/me", async (req, res) => { + const session = await expressAuthSession(req) + return res.json(session); +}); + +app.use(express.json()); const adminRouter = await getAdminRouter(); -const isAuthenticated = (req: express.Request, res: express.Response, next: express.NextFunction): void => { - // biome-ignore lint/correctness/noVoidTypeReturn: - if (req.user && (req.user as { role?: UserRole }).role === UserRole.Admin) return next(); - res.redirect("/"); -}; +app.use("/admin", async (req, res, next) => { + const session = await expressAuthSession(req) + if (!session || session.user.role !== "admin") { + res.redirect("/"); + return; + } -app.use("/admin", isAuthenticated, adminRouter); + next(); +}, adminRouter); app.use( - trpcApiEndpoint, + "/api/trpc", trpcExpress.createExpressMiddleware({ router: appRouter, createContext, @@ -78,6 +65,21 @@ app.use( emailQueue.start(); chaptersQueue.start(); -ViteExpress.listen(app, 3000, () => +ViteExpress.config({ + ignorePaths: /^\/api\/.*/, +}); + + + +const server = ViteExpress.listen(app, 3000, () => console.log("Server is listening on port 3000..."), ); + +process.on('SIGTERM', async () => { + debug('SIGTERM signal received: closing HTTP server') + server.close(async () => { + await emailQueue.stop(); + await chaptersQueue.stop(); + debug('HTTP server closed') + }) +}) diff --git a/apps/frontend/src/state/recoil/project.ts b/apps/frontend/src/state/recoil/project.ts index 39c89e15..643f1f40 100644 --- a/apps/frontend/src/state/recoil/project.ts +++ b/apps/frontend/src/state/recoil/project.ts @@ -1,6 +1,6 @@ import { atom, useRecoilState, useRecoilValue, useResetRecoilState } from "recoil"; -import { PeerTubeVideoDataResult } from "~services/peertube"; +import type { PeerTubeVideoDataResult } from "~services/peertube"; export type ProjectFormInput = { title: string; @@ -9,16 +9,18 @@ export type ProjectFormInput = { public: boolean; collaborative: boolean; videoInfo: PeerTubeVideoDataResult | undefined; + shared: boolean; }; export const projectInputInitialValueAtom = atom({ - key: `ProjectFormInput`, + key: "ProjectFormInput", default: { title: "", description: "", keywords: [], public: false, collaborative: false, + shared: false, videoInfo: undefined, }, }); diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json index decf7c86..09289a2d 100644 --- a/apps/frontend/tsconfig.json +++ b/apps/frontend/tsconfig.json @@ -29,6 +29,9 @@ "esModuleInterop": true, "allowSyntheticDefaultImports": true, "paths": { + "~/*": [ + "src/*" + ], "~components/*": [ "src/components/*" ], @@ -50,9 +53,6 @@ "~utils/*": [ "src/utils/*" ], - "~/*": [ - "src/*" - ], "~pages/*": [ "src/pages/*" ], @@ -64,6 +64,9 @@ ], "~chapters/*": [ "src/components/chapters/*" + ], + "~lib/*": [ + "src/lib/*" ] } }, diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index bca00ecb..17133649 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -1,15 +1,28 @@ import react from "@vitejs/plugin-react"; +import path from "node:path"; import { defineConfig } from "vite"; -import { ViteAliases } from "vite-aliases"; export default defineConfig(async () => { return { + resolve: { + alias: { + "~": path.resolve(__dirname, "./src"), + "~/": path.resolve(__dirname, "./src"), + "~components": path.resolve(__dirname, "./src/components"), + "~hooks": path.resolve(__dirname, "./src/hooks"), + "~images": path.resolve(__dirname, "./src/images"), + "~services": path.resolve(__dirname, "./src/services"), + "~theme": path.resolve(__dirname, "./src/theme"), + "~utils": path.resolve(__dirname, "./src/utils"), + "~pages": path.resolve(__dirname, "./src/pages"), + "~state": path.resolve(__dirname, "./src/state"), + "~server": path.resolve(__dirname, "./src/server"), + "~chapters": path.resolve(__dirname, "./src/chapters"), + "~lib": path.resolve(__dirname, "./src/lib"), + }, + }, plugins: [ - react(), - ViteAliases({ - prefix: "~", - adjustDuplicates: true, - }), + react() ], } }); diff --git a/package.json b/package.json index b0c74854..ce16f0cf 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "packages/*" ], "scripts": { - "dev": "dotenv -- turbo run dev", + "dev": "dotenv -- turbo watch dev --continue", "clean": "turbo clean", "build": "dotenv -- turbo run build --no-cache", "eslint": "eslint --ext .js,.jsx,.ts,.tsx", @@ -22,6 +22,7 @@ "--shortcuts to run commands in workspaces--": "", "frontend": "dotenv -- pnpm --filter frontend", "admin": "dotenv -- pnpm --filter admin", + "auth": "dotenv -- pnpm --filter auth", "backend": "dotenv -- pnpm --filter backend", "prisma": "dotenv -- pnpm --filter @celluloid/prisma", "docker:build": "docker build -t celluloid:latest ." @@ -52,8 +53,8 @@ "start-server-and-test": "^2.0.1", "ts-jest": "^27.0.1", "tsup": "^8.3.0", - "turbo": "^2.1.3", - "typescript": "^5.6.2", + "turbo": "^2.3.3", + "typescript": "catalog:", "wait-port": "^1.1.0" }, "prettier": { @@ -91,5 +92,5 @@ "node-fetch": "2", "pm2": "^5.3.0" }, - "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" + "packageManager": "pnpm@9.15.0" } diff --git a/packages/passport/package.json b/packages/auth/package.json similarity index 55% rename from packages/passport/package.json rename to packages/auth/package.json index 0c333529..2a0796e0 100644 --- a/packages/passport/package.json +++ b/packages/auth/package.json @@ -1,5 +1,5 @@ { - "name": "@celluloid/passport", + "name": "@celluloid/auth", "version": "3.0.0", "private": true, "license": "MIT", @@ -7,41 +7,48 @@ "repository": { "type": "git", "url": "https://github.com/celluloid-camp/celluloid.git", - "directory": "packages/passport" + "directory": "packages/auth" }, "bugs": { "url": "https://github.com/udecode/plate/celluloid/issues" }, + "type": "module", "exports": { ".": { - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "default": "./src/index.ts" + }, + "./env": { + "types": "./dist/env.d.ts", + "default": "./src/env.ts" + }, + "./plugins": { + "types": "./dist/plugins/index.d.ts", + "default": "./src/plugins/index.ts" } }, "scripts": { "build": "tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", "dev": "tsc" }, "dependencies": { "@celluloid/prisma": "workspace:*", "@celluloid/utils": "workspace:*", + "@celluloid/queue": "workspace:*", + "@prisma/client": "^5.22.0", + "@t3-oss/env-core": "^0.11.1", "bcryptjs": "^2.4.3", - "connect-redis": "^7.1.0", - "express": "^4.19.2", - "express-session": "^1.17.3", - "passport": "^0.6.0", - "passport-local": "^1.0.0", - "redis": "^4.6.10" + "better-auth": "^1.0.21", + "express": "^4.21.2", + "zod": "catalog:" }, "devDependencies": { "@celluloid/config": "workspace:*", "@types/bcryptjs": "^2.4.5", "@types/express": "^5.0.0", - "@types/express-session": "^1.17.8", "@types/node": "^18.14.2", - "@types/passport": "^1.0.14", - "@types/passport-local": "^1.0.37", "tsup": "^8.3.0", - "typescript": "^5.6.2" + "typescript": "catalog:" } } diff --git a/packages/auth/prisma/schema.prisma b/packages/auth/prisma/schema.prisma new file mode 100644 index 00000000..3c3cc709 --- /dev/null +++ b/packages/auth/prisma/schema.prisma @@ -0,0 +1,74 @@ + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id + name String + email String + emailVerified Boolean + image String? + createdAt DateTime + updatedAt DateTime + + role String? + banned Boolean? + banReason String? + banExpires DateTime? + + @@unique([email]) + @@map("user") +} + +model Session { + id String @id + expiresAt DateTime + token String + createdAt DateTime + updatedAt DateTime + ipAddress String? + userAgent String? + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + impersonatedBy String? + + @@unique([token]) + @@map("session") +} + +model Account { + id String @id + accountId String + providerId String + userId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + accessToken String? + refreshToken String? + idToken String? + accessTokenExpiresAt DateTime? + refreshTokenExpiresAt DateTime? + scope String? + password String? + createdAt DateTime + updatedAt DateTime + + @@map("account") +} + +model Verification { + id String @id + identifier String + value String + expiresAt DateTime + createdAt DateTime? + updatedAt DateTime? + + @@map("verification") +} diff --git a/packages/auth/src/auth.ts b/packages/auth/src/auth.ts new file mode 100644 index 00000000..6856b34c --- /dev/null +++ b/packages/auth/src/auth.ts @@ -0,0 +1,64 @@ +import { betterAuth } from "better-auth"; +import { prismaAdapter } from "better-auth/adapters/prisma"; +import { prisma } from "@celluloid/prisma"; +import { admin, emailOTP, username } from "better-auth/plugins"; +import { emailQueue } from "@celluloid/queue"; +import { env } from "./env"; +import { signupAsStudent } from "./plugins/signup-as-student"; + +export const auth = betterAuth({ + baseURL: env.BASE_URL, + logger: { + level: "debug" + }, + database: prismaAdapter(prisma, { + provider: "postgresql", + }), + emailAndPassword: { + enabled: true, + requireEmailVerification: true + }, + user: { + modelName: "User", + additionalFields: { + role: { + type: "string", + required: true, + defaultValue: "teacher", + input: false // don't allow user to set role + }, + color: { + type: "string", + required: false, + input: false // don't allow user to set role + }, + initial: { + type: "string", + required: false, + input: false // don't allow user to set role + }, + } + }, + plugins: [ + username(), + signupAsStudent(), + admin({ + defaultRole: "teacher" + }), + emailOTP({ + sendVerificationOnSignUp: true, + + async sendVerificationOTP({ + email, + otp, + type + }) { + console.log("sendVerificationOTP", email, otp, type); + emailQueue.add({ email, type, otp }); + }, + }) + ], + advanced: { + generateId: false + } +}); diff --git a/packages/auth/src/env.ts b/packages/auth/src/env.ts new file mode 100644 index 00000000..78e3645a --- /dev/null +++ b/packages/auth/src/env.ts @@ -0,0 +1,11 @@ +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + BETTER_AUTH_SECRET: z.string(), + BASE_URL: z.string(), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true, +}); diff --git a/packages/auth/src/express.ts b/packages/auth/src/express.ts new file mode 100644 index 00000000..a64ec8f7 --- /dev/null +++ b/packages/auth/src/express.ts @@ -0,0 +1,11 @@ +import { fromNodeHeaders, toNodeHandler } from "better-auth/node"; +import { auth } from "./auth"; +import type { IncomingMessage } from "node:http"; + +export const expressAuthHandler = toNodeHandler(auth); + +export const expressAuthSession = (req: IncomingMessage) => { + return auth.api.getSession({ + headers: fromNodeHeaders(req.headers), + }); +}; diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts new file mode 100644 index 00000000..50fa1495 --- /dev/null +++ b/packages/auth/src/index.ts @@ -0,0 +1,3 @@ +export * from "./auth"; +export * from "./env"; +export * from "./express"; diff --git a/packages/auth/src/plugins/index.ts b/packages/auth/src/plugins/index.ts new file mode 100644 index 00000000..cd4b1961 --- /dev/null +++ b/packages/auth/src/plugins/index.ts @@ -0,0 +1 @@ +export * from "./signup-as-student/client"; diff --git a/packages/auth/src/plugins/signup-as-student/client.ts b/packages/auth/src/plugins/signup-as-student/client.ts new file mode 100644 index 00000000..d46f416c --- /dev/null +++ b/packages/auth/src/plugins/signup-as-student/client.ts @@ -0,0 +1,12 @@ +import type { BetterAuthClientPlugin } from "better-auth"; +import type { signupAsStudent } from "."; + +export const signupAsStudentClient = () => { + return { + id: "signupAsStudent", + $InferServerPlugin: {} as ReturnType, + pathMethods: { + "/sign-up-as-student": "POST", + }, + } satisfies BetterAuthClientPlugin; +}; diff --git a/packages/auth/src/plugins/signup-as-student/index.ts b/packages/auth/src/plugins/signup-as-student/index.ts new file mode 100644 index 00000000..2a8ca7d2 --- /dev/null +++ b/packages/auth/src/plugins/signup-as-student/index.ts @@ -0,0 +1,182 @@ +import type { Account } from "@celluloid/prisma"; +import { + type BetterAuthPlugin, + parseSetCookieHeader, + setSessionCookie, + type User, +} from "better-auth"; +import { + APIError, + getSessionFromCtx, + sendVerificationEmailFn, +} from "better-auth/api"; +import { createAuthEndpoint, createAuthMiddleware } from "better-auth/plugins"; +import { z } from "zod"; + +const ERROR_CODES = { + INVALID_USERNAME_OR_PASSWORD: "invalid username or password", + EMAIL_NOT_VERIFIED: "email not verified", + UNEXPECTED_ERROR: "unexpected error", + USERNAME_IS_ALREADY_TAKEN: "username is already taken. please try another.", + FAILED_TO_CREATE_USER: "Failed to create user", + COULD_NOT_CREATE_SESSION: "Could not create session", + ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY: + "Anonymous users cannot sign in again anonymously", + PASSWORD_TOO_SHORT: "Password too short", + PASSWORD_TOO_LONG: "Password too long", +}; + + +export const signupAsStudent = () => { + return { + id: "signupAsStudent", + endpoints: { + signUpAsStudent: createAuthEndpoint( + "/sign-up-as-student", + { + method: "POST", + body: z.object({ + username: z.string({ + description: "The username of the user", + }), + password: z.string({ + description: "The password of the user", + }), + rememberMe: z + .boolean({ + description: "Remember the user session", + }) + .optional(), + }), + metadata: { + openapi: { + description: "Sign up as student", + responses: { + 200: { + description: "Sign up as student", + content: { + "application/json": { + schema: { + type: "object", + properties: { + user: { + $ref: "#/components/schemas/User", + }, + session: { + $ref: "#/components/schemas/Session", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + async (ctx) => { + const password = ctx.body.password; + + const minPasswordLength = ctx.context.password.config.minPasswordLength; + if (password.length < minPasswordLength) { + ctx.context.logger.error("Password is too short"); + throw new APIError("BAD_REQUEST", { + message: ERROR_CODES.PASSWORD_TOO_SHORT, + }); + } + + const maxPasswordLength = ctx.context.password.config.maxPasswordLength; + if (password.length > maxPasswordLength) { + ctx.context.logger.error("Password is too long"); + throw new APIError("BAD_REQUEST", { + message: ERROR_CODES.PASSWORD_TOO_LONG, + }); + } + + const id = ctx.context.generateId({ model: "user" }); + const email = `temp-${id}@celluloid.com`; + const newUser = await ctx.context.internalAdapter.createUser({ + id, + email, + emailVerified: true, + name: ctx.body.username, + role: "student", + username: ctx.body.username, + createdAt: new Date(), + updatedAt: new Date(), + }); + if (!newUser) { + return ctx.json(null, { + status: 500, + body: { + message: ERROR_CODES.FAILED_TO_CREATE_USER, + status: 500, + }, + }); + } + + const hash = await ctx.context.password.hash(password); + await ctx.context.internalAdapter.linkAccount({ + userId: newUser.id, + providerId: "credential", + accountId: newUser.id, + password: hash, + }); + + const session = await ctx.context.internalAdapter.createSession( + newUser.id, + ctx.request, + ); + if (!session) { + return ctx.json(null, { + status: 400, + body: { + message: ERROR_CODES.COULD_NOT_CREATE_SESSION, + }, + }); + } + await setSessionCookie(ctx, { + session, + user: newUser, + }); + return ctx.json({ + id: newUser.id, + email: newUser.email, + emailVerified: newUser.emailVerified, + name: newUser.name, + createdAt: newUser.createdAt, + updatedAt: newUser.updatedAt, + }); + }, + ), + }, + hooks: { + before: [ + { + matcher(context) { + return context.path === "/sign-up-as-student"; + }, + async handler(ctx) { + const username = ctx.body.username; + if (username) { + const user = await ctx.context.adapter.findOne({ + model: "user", + where: [ + { + field: "username", + value: username.toLowerCase(), + }, + ], + }); + if (user) { + throw new APIError("UNPROCESSABLE_ENTITY", { + message: ERROR_CODES.USERNAME_IS_ALREADY_TAKEN, + }); + } + } + }, + }, + ], + } + } satisfies BetterAuthPlugin; +}; diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json new file mode 100644 index 00000000..f50c553d --- /dev/null +++ b/packages/auth/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@celluloid/config/tsconfig/internal-package.json", + "compilerOptions": { + "declaration": false, + "composite": false, + "declarationMap": false, + "emitDeclarationOnly": false + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/packages/config/package.json b/packages/config/package.json index bd35139c..f9749228 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -21,6 +21,6 @@ "eslint-plugin-react": "7.33.2" }, "devDependencies": { - "typescript": "^5.6.2" + "typescript": "catalog:" } } diff --git a/packages/emails/emails/email-verification.tsx b/packages/emails/emails/email-verification.tsx new file mode 100644 index 00000000..7242fe33 --- /dev/null +++ b/packages/emails/emails/email-verification.tsx @@ -0,0 +1,70 @@ +import { + Body, + Container, + Head, + Html, + Preview, + Section, + Text, + Tailwind, + Img, + Heading, + Link, + Hr, +} from "@react-email/components"; +import * as React from "react"; + +const baseUrl = process.env.BASE_URL ?? ""; + +interface EmailVerificationProps { + username?: string; + otp: string; +} + +export const EmailVerification = ({ + username = "", + otp = "123456", +}: EmailVerificationProps) => { + return ( + + + Vérification de votre email Celluloid + + + +
+ Celluloid +
+ + + Vérification de votre email + + + Bonjour {username},
Voici votre code de confirmation: +
+ + + {otp} + + + + Veuillez le saisir dans le formulaire prévu à cet effet. + + +
+ + L'équipe Celluloid vous souhaite la bienvenue ! + +
+ +
+ + ); +}; + +export default EmailVerification; diff --git a/packages/emails/emails/forget-password.tsx b/packages/emails/emails/forget-password.tsx new file mode 100644 index 00000000..13760fd8 --- /dev/null +++ b/packages/emails/emails/forget-password.tsx @@ -0,0 +1,73 @@ +import { + Body, + Container, + Head, + Heading, + Hr, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +interface ForgetPasswordEmailProps { + username?: string; + email: string; + otp: string; +} + +const baseUrl = process.env.BASE_URL ? `https://${process.env.BASE_URL}` : ""; + +export const ForgetPasswordEmail = ({ + username = "", + email = "john.doe@example.com", + otp = "123456", +}: ForgetPasswordEmailProps) => { + return ( + + + Réinitialisation de mot de passe Celluloid + + + +
+ Celluloid +
+ + + Réinitialisation de mot de passe + + + Bonjour {username},
+ Nous avons reçu une demande de réinitialisation de mot de passe + pour l'adresse email {email} +
+ + + Voici votre code de confirmation : + + + + {otp} + + +
+ + L'équipe Celluloid vous souhaite la bienvenue ! + +
+ +
+ + ); +}; + +export default ForgetPasswordEmail; diff --git a/packages/emails/emails/index.ts b/packages/emails/emails/index.ts new file mode 100644 index 00000000..79c41ad2 --- /dev/null +++ b/packages/emails/emails/index.ts @@ -0,0 +1,2 @@ +export * from './forget-password'; +export * from './email-verification'; diff --git a/packages/emails/emails/static/celluloid-logo.png b/packages/emails/emails/static/celluloid-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9857462240275acb744b0ced8a0572a355c1ea9d GIT binary patch literal 4055 zcmV;|4=C`7P)^`1poUAp z4^#pw`iaOXa(UzGej*B}tmmqbRaap@U0pe3T^Hp;K~cgXa_A~&06_&;!9|xvkxNAc z6bwmbdjHp%o~h~Xnam^uAMB>S@1ecJ&o*1esRn5ThGy~_UbX8kjtqgSo z-D(Ha0uBS81MdMZsfB6}d4-Zup;}dys%GG5%s@}o2DQ_HbK|H#0`Cd7z&N!`mBx|t zWK|iw=d@H2kNFIg8T)eDJte`m7bsH=REv~sfP_<8!ji{MFq@`o07Y?{JRM#j1aZVF z#qv?RKJas;v^XlKr>Dy?eXC&@olVo+2fo)KQjy{rR61CZipNErK7=i%T1{VMT@y`b z5%$zmU#aMcleSL$$;71ty6M(d_fwnHHU>hx{ zn~#ov0~0H#;}&irCYws+a1P%pm-_FpJ$L5C}Yl=XsL_nMW?3wq;00IwWvD zyg^LzAHf$Pe;4^SAnAm+>p&Yf0M`O_Jrwv@)JsJM-qk=&51CYu>a&TjL(vV4Ctmzm z*|vU<0{v92#@HT!wjx2rwdm(H%)iXX`P8+mZL*OQF7M7Gs#3!%+;7vWyEM`IVS~qj zd$QQGs5pvzT1deX=0xtw2A=P#md|PJGm_E@KcGF$PkA)r}|I$p&6P=4=nSUg{F% zPxJxSGGaV?D-^u}WMk~hbfseaAuptpZTxGH?RFu_dfxUd8U$*lC^lV-k!|V z5rgz&FzS}2PGw9@Tbvxm=b|}f>@xiv1wO+r|4-zmY93=8AFEDkkXoSDsdv;;6;%CV z$W`auPuOW#9-fJuf-(tTBpoQrB7gC+Pvc!KhT=576%nZlVLwpo2v9v%?b6cHZ)rOg zJ5}@`igu<-Su8ym_ZXbVLil!QwvVwr&iu!!;-aHthZf4X_$M0Syk>trkl{aVfwSL5 zCA;Tt$R8=|QkE90EvhGvs7kf4N#Q(Td44^tHjowPa57LFmQ$*f5ZQkb6WB!~)&c)f zD_bawGK|I9OhFGXEI_?l(>Ho!aadA(U(Pgdx7<|J+rvDINn3#PTDP?{#C#<>TF?N?(t~2E`7Zn z-50@=6G6P2T)|mkDEU!O=0}{o#VQjQ_lwag%2QUVZF9+zY;_>RFa~$~1#A9HJda1} zGT;wtrumpTp;}OFnVE0wMP>tVxrgk{ti(^aujyP>o(o^>%qwm66Rup$r0Y!a_W#fc zHjeBIEW&UWAs3p209$RIowJD7g7-k@i^%mMZ!bJ>xpusb#qLN^>ZUTCilGgmEivTI zA;s@$4dl{qxedA=XdI${sPU6Q#Y2y#t?B4GNX0yGt3KuKjPC*3nv4;Tg}7f+EH_S< zAtQaf8n8l0%3gCQ8*v6aIg%v>!ROFU3Hb$Oq@(lKEL5%0dG)t2^$Ssh{o z)sPZs1M|)OhmLHUx9HPmnnVXgoUiFpkM6vyDBh7ygs*H`8yq610sy%ufc9 zTO)LBpsfRpZw2EUiQb1CI{eT^(e66v_PYYAr7ed3F0`8f%h(rc-p+U=pjCY_vJt?AG@Io;!(p0=!4en6F|8FDz#wR!l@(+ErOsn;tLYNV z*{fQaC?K_o>wKSTpkBeK??ZF^8-lVc!ik&&a)QN8=Dg+Yl@XAQ-!`rw%$)S%juTpa zY&NL&YuwX6@2vT}fXw`*Jbf;{sYa`J)%RlX&R6FKi<9rFpb=PrM_A|;8c7jS$Ww6> zp}`k#U?moCSqQZ<7Ja*3P657;_7=v`Bd5~JIQ)cIjPGvrvd>;_xdiE1dsW_C>rq!0AOQ@Ah8f&idjHfLf=B)Q}l;IOc z<8-Jo+ekCa`r~pp7W)k|=Czg2sMf4|tIc2deCbDGDsnTP;+vbPLY9z5t_Gc{KS%PV zPNH4LYkmO!gLktd)Eipu|_sWI&ggtFDs~r+kjh6Hkai zSPPBUs%O*5S8_7EsFhD7w7K3{#`rtEjF*?N=0lw(I2)y@lNPJY=4j!;JM5r2H-v+o zWYM&~JFlK(EnB>?TI2Te)(z5U^ zjQTZ*p92yOeF@BlHjIyloAc6Y8s%{Efh`S}qLDf*fP@OQqscK#`ooAU^fO3iVF>4k zYRm=i0j_(in97brhF|X!<7>~R?(3jEtd|8xuGC43Rb~@KZK{x5PAvHp(WAzo>D)_9 zKLDd?Mm`#PiN=edrgGPBU)TYGSayT=_H|MLUvu=%i71L-hB6zx(SGHGxAKkJS=p+F z$&C@a{L_d;7)z^Fqw|14dFDNM@ist1;A~(ZhW;Wk`=PL82=QTrv%#HS#A3^$656by zV8^bZYM$BmI+evc2ZNXj?F!&3+L4gJvmL!&3h|VBLdNs0vv17LIB4OGKuGdFa-ZmO zlsD_;a&WJQv6HBiQBJ*zvrP=zE17DT(M1&)7praL&muD3OAMOVsT3=e`B@be^)UM8 ztvCATZB-|gUPt|1o_fn}h1B%>j6<`>8cUFojpY^28G+*DJ}vl>g(DU-@A7IGy4*Hw zL}ok-`ZO|f_w1F{Kpf;?Ttj&p#=g)&Pic`bDM;#;|;aV8&+d3y5k zCNpSVOX^g??T7LRz2@_V3e;MRUXusc$cb*49~*rq9k2zBZrzH^`Kvy_jy)cjqrRRj1_*#VFbWchZh*ildSCdMIt`L8~x{zE5WSBTx|KZ5j7io>Sho z->%AuiJV+VrUQl4;|NbIF@K($1Nv{#U>m%1eiKt3L(0fgFUMd-lY?qUG$CAS#2wfr zMpv~=DAq&l>RAtfc9e2dGL-wYGlJU`F^fBy1I(pM$FeD`kdTeR3%7lv+;U1aPdjwK z7u}0y@9cvZq!{auUP2lz3tZl4P9k5xLdX#=M{W@dyPRC;u7rGh}M`7oDI zB?#zug&U}AKwDy@x54jG3H5f>t&HIzyP)NnczB6Lb3(NJ$jO6KDQyoYPuL@~S;SF! zjpaskO=I5VEqCWoJI6NLX&JniW08*?=5jAToEx9s{BCI;9djFdS#LMGJMH_In`TkY zRtNnbnDbZkGv}?s(U@Vf00m4zH(&pN3qxwZF%a; z&VJo4J9BimgEpAOTj%6ercArX zF5a&t^PwGb(S=~}8GLT5x_rpgmIaho=AS!c?V@!2 zRg6}CoFN_2(_xJ7S_r*>^?>f(_EDY!zpZR8aQT(dUF33yy;}zs^>TR+z^nXok-16d z**Nr}+8f~`)ENSA4`8Q4XqVF79pthZ#0%(v3f~>jvdF~~*8!sXLAep*yoEfR81p1_ z=0bP{_{nC_Mh9eC3XMi7wSO?l}irs_=nK { - done(null, (user as User).id) -}); - -passport.deserializeUser(async (id: string, done) => { - const user = await prisma.user.findUnique({ where: { id } }) - if (user) { - return done(null, user); - } - return done(new DeserializeUserError("Deserialize user failed: user does not exist")); - -}); - -passport.use( - new LocalStrategy(async (username: string, password: string, done) => { - const user = await prisma.user.findUnique({ where: { username: username } }) - if (!user) { - return done(new InvalidUserError("User not found")); - } - if (!bcrypt.compareSync(password, user.password)) { - return Promise.resolve(done(new InvalidUserError(`Login failed for user ${user.username}: incorrect password`))); - } - if (!user.confirmed && user.role !== UserRole.Student) { - return done(new UserNotConfirmed()); - } - return done(null, user); - - }), -); - - -const loginStrategy = new LocalStrategy(async (login, password, done) => { - - const user = await prisma.user.findFirst({ - where: { - OR: [{ email: login }, { username: login, }] - } - }); - - if (!user) { - return done(new InvalidUserError("User not found")); - } - if (!bcrypt.compareSync(password, user.password)) { - return done(new InvalidUserError(`Login failed for user ${user.username}: incorrect password`)); - } - if (!user.confirmed && user.role !== UserRole.Student) { - return done(new UserNotConfirmed(`Login failed: ${user.username} is not confirmed`)); - } - return done(null, user); -} -); - -passport.use("login", loginStrategy); - -export default passport; diff --git a/packages/passport/src/session.ts b/packages/passport/src/session.ts deleted file mode 100644 index 4efdc1a2..00000000 --- a/packages/passport/src/session.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { env } from "@celluloid/utils" -import RedisStore from "connect-redis" -import session from "express-session" -import { createClient } from "redis" - - -export function createSession(): ReturnType { - - // Initialize client. - const redisClient = createClient({ - url: env.REDIS_URL - }) - redisClient.connect().catch(console.error) - - // Initialize store. - const redisStore = new RedisStore({ - client: redisClient, - }) - - return session({ - store: redisStore, - name: env.COOKIE_NAME, - cookie: { - domain: env.COOKIE_DOMAIN, - secure: env.COOKIE_SECURE, - maxAge: 30 * 24 * 3600 * 1000, - httpOnly: true, - }, - secret: env.COOKIE_SECRET, - resave: false, - saveUninitialized: true, - }); -} diff --git a/packages/passport/tsconfig.json b/packages/passport/tsconfig.json deleted file mode 100644 index 490ddcef..00000000 --- a/packages/passport/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "@celluloid/config/tsconfig/internal-package.json", - "include": [ - "src" - ], - "exclude": [ - "node_modules" - ], - "compilerOptions": { - "noEmitOnError": false, - "skipLibCheck": true, - "skipDefaultLibCheck": true, - "noImplicitAny": false, - "strict": false, - "checkJs": false, - "allowJs": true - } -} diff --git a/packages/passport/tsup.config.ts b/packages/passport/tsup.config.ts deleted file mode 100644 index 5b98c812..00000000 --- a/packages/passport/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -const isProduction = process.env.NODE_ENV === "production"; - -export default defineConfig({ - clean: true, - dts: true, - entry: ["src/index.ts"], - format: ["esm"], - target: "esnext", - minify: isProduction, - sourcemap: true, -}); diff --git a/packages/prisma/migrations/20241216103120_better_auth_migration/migration.sql b/packages/prisma/migrations/20241216103120_better_auth_migration/migration.sql new file mode 100644 index 00000000..5cb7662c --- /dev/null +++ b/packages/prisma/migrations/20241216103120_better_auth_migration/migration.sql @@ -0,0 +1,99 @@ +/* + Warnings: + + - You are about to drop the column `code` on the `User` table. All the data in the column will be lost. + - You are about to drop the column `codeGeneratedAt` on the `User` table. All the data in the column will be lost. + - You are about to drop the column `confirmed` on the `User` table. All the data in the column will be lost. + - You are about to drop the column `password` on the `User` table. All the data in the column will be lost. + - The `role` column on the `User` table would be dropped and recreated. This will lead to data loss if there is data in the column. + +*/ +-- DropIndex +DROP INDEX "user_username_unique"; + +-- AlterTable +ALTER TABLE "User" DROP COLUMN "code", +DROP COLUMN "codeGeneratedAt", +DROP COLUMN "confirmed", +DROP COLUMN "password", +ADD COLUMN "banExpires" TIMESTAMP(3), +ADD COLUMN "banReason" TEXT, +ADD COLUMN "banned" BOOLEAN, +ADD COLUMN "createdAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "emailVerified" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "image" TEXT, +ADD COLUMN "name" TEXT, +ADD COLUMN "updatedAt" TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ALTER COLUMN "username" SET DATA TYPE TEXT, +ALTER COLUMN "role" SET DATA TYPE TEXT; + +-- CreateTable +CREATE TABLE "session" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "expiresAt" TIMESTAMP(3) NOT NULL, + "token" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "userId" UUID NOT NULL, + + CONSTRAINT "session_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "account" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "accountId" TEXT NOT NULL, + "providerId" TEXT NOT NULL, + "userId" UUID NOT NULL, + "accessToken" TEXT, + "refreshToken" TEXT, + "idToken" TEXT, + "accessTokenExpiresAt" TIMESTAMP(3), + "refreshTokenExpiresAt" TIMESTAMP(3), + "scope" TEXT, + "password" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "verification" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "identifier" TEXT NOT NULL, + "value" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3), + "updatedAt" TIMESTAMP(3), + + CONSTRAINT "verification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "session_token_key" ON "session"("token"); + +-- AddForeignKey +ALTER TABLE "session" ADD CONSTRAINT "session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "account" ADD CONSTRAINT "account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + + +UPDATE "User" +SET "role" = 'teacher' +WHERE "role" = 'Teacher'; + +UPDATE "User" +SET "role" = 'student' +WHERE "role" = 'Student'; + +UPDATE "User" +SET "role" = 'admin' +WHERE "role" = 'Admin'; + + +-- CreateIndex +CREATE UNIQUE INDEX "user_username_unique" ON "User"("username"); diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 1c9c9db8..a5fee8c4 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -2,30 +2,35 @@ "name": "@celluloid/prisma", "version": "3.0.0", "license": "MIT", + "private": true, "homepage": "https://celluloid.huma-num.fr", "repository": { "type": "git", "url": "https://github.com/celluloid-camp/celluloid.git", - "directory": "packages/passport" + "directory": "packages/prisma" }, "bugs": { "url": "https://github.com/udecode/plate/celluloid/issues" }, "type": "module", - "main": "dist/index.js", - "module": "dist/index.mjs", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*" - ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./src/index.ts" + }, + "./env": { + "types": "./dist/env.d.ts", + "default": "./src/env.ts" + } + }, "prisma": { "schema": "schema.prisma", "seed": "tsx src/seed.ts" }, "scripts": { - "build": "pnpm run generate && tsup", - "clean": "rimraf .turbo node_modules dist", - "dev": "tsup --watch", + "build": "pnpm run generate && tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", + "dev": "tsc", "setup": "pnpm db:push && pnpm migrate:init && migrate:deploy && pnpm generate", "migrate": "pnpm prisma migrate", "db": "pnpm prisma db", @@ -52,15 +57,15 @@ "@types/randomcolor": "^0.5.7", "dotenv-cli": "^7.3.0", "eslint": "^8.50.0", - "prisma": "^5.22.0", + "prisma": "^6.0.1", "rimraf": "^5.0.1", "tsup": "^8.3.0", - "typescript": "^5.6.2" + "typescript": "catalog:" }, "dependencies": { - "@prisma/client": "^5.22.0", + "@prisma/client": "^6.0.1", "randomcolor": "^0.6.2", "tsx": "^4.19.1", - "zod": "^3.23.8" + "zod": "catalog:" } } diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 6203f6d1..e82175c4 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - previewFeatures = ["fullTextSearch"] + previewFeatures = ["fullTextSearchPostgres"] // binaryTargets = ["native", "linux-musl"] // output = "./client" } @@ -121,21 +121,16 @@ model Playlist { } model User { - id String @id @unique(map: "user_id_unique") @default(dbgenerated("gen_random_uuid()")) @db.Uuid - email String? @unique(map: "user_email_unique") @db.VarChar(255) - username String @unique(map: "user_username_unique") @db.VarChar(255) - password String @db.VarChar(255) - confirmed Boolean @default(false) - code String? - codeGeneratedAt DateTime? @db.Timestamptz(6) - role UserRole? - extra Json? @default("{}") - annotation Annotation[] - comment Comment[] - project Project[] - UserToProject UserToProject[] - - playlist Playlist[] + id String @id @unique(map: "user_id_unique") @default(dbgenerated("gen_random_uuid()")) @db.Uuid + email String? @unique(map: "user_email_unique") @db.VarChar(255) + username String @unique(map: "user_username_unique") + + annotation Annotation[] + comment Comment[] + project Project[] + UserToProject UserToProject[] + role String? + playlist Playlist[] firstname String? @db.VarChar(255) lastname String? @db.VarChar(255) @@ -145,6 +140,67 @@ model User { avatarStorageId String? @unique @db.Uuid chapters Chapter[] + + name String? + emailVerified Boolean @default(false) + image String? + + createdAt DateTime @default(now()) @db.Timestamptz(6) + updatedAt DateTime @default(now()) @updatedAt @db.Timestamptz(6) + + sessions Session[] + accounts Account[] + + banned Boolean? + banReason String? + banExpires DateTime? + + extra Json? @default("{}") +} + +model Session { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + expiresAt DateTime + token String + createdAt DateTime + updatedAt DateTime + ipAddress String? + userAgent String? + userId String @db.Uuid + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@unique([token]) + @@map("session") +} + +model Account { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + accountId String + providerId String + userId String @db.Uuid + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + accessToken String? + refreshToken String? + idToken String? + accessTokenExpiresAt DateTime? + refreshTokenExpiresAt DateTime? + scope String? + password String? + createdAt DateTime + updatedAt DateTime + + @@map("account") +} + +model Verification { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + identifier String + value String + expiresAt DateTime + createdAt DateTime? + updatedAt DateTime? + + @@map("verification") } /// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by the Prisma Client. diff --git a/packages/prisma/src/env.ts b/packages/prisma/src/env.ts new file mode 100644 index 00000000..d402fa36 --- /dev/null +++ b/packages/prisma/src/env.ts @@ -0,0 +1,10 @@ +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + DATABASE_URL: z.string(), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true +},); diff --git a/packages/prisma/src/index.ts b/packages/prisma/src/index.ts index b586e6ef..4e9f17dc 100644 --- a/packages/prisma/src/index.ts +++ b/packages/prisma/src/index.ts @@ -1,11 +1,11 @@ import PrismaModule, { type Prisma, PrismaClient } from "@prisma/client"; import randomColor from "randomcolor"; -// import { env } from '@celluloid/utils'; +import { env } from "./env"; const prismaClient = new PrismaClient({ datasources: { db: { - url: process.env.DATABASE_URL, + url: env.DATABASE_URL, }, }, }).$extends({ diff --git a/packages/prisma/src/update-metadata.ts b/packages/prisma/src/update-metadata.ts index 7c5c4c83..b185946f 100644 --- a/packages/prisma/src/update-metadata.ts +++ b/packages/prisma/src/update-metadata.ts @@ -1,9 +1,7 @@ -import { prisma, Project } from '@celluloid/prisma' -import fetch from 'node-fetch'; - +import { prisma, type Project } from "@celluloid/prisma"; +import fetch from "node-fetch"; const getProjectMetadata = async (project: Project) => { - const apiUrl = `https://${project.host}/api/v1/videos/${project.videoId}`; const response = await fetch(apiUrl, { @@ -11,17 +9,18 @@ const getProjectMetadata = async (project: Project) => { }); if (response.status === 200) { - const data = await response.json() as any; - return { duration: data.duration, thumbnailURL: `https://${project.host}${data.thumbnailPath}`, metadata: data } - + const data = (await response.json()) as any; + return { + duration: data.duration, + thumbnailURL: `https://${project.host}${data.thumbnailPath}`, + metadata: data, + }; } else { throw new Error( - `Could not perform PeerTube API request (error ${response.status})` + `Could not perform PeerTube API request (error ${response.status})`, ); } - - -} +}; async function main() { // Retrieve all published posts @@ -34,7 +33,9 @@ async function main() { currentProject += 1; // Print the current project ID and update progress - console.log(`Updating project ID: ${project.id} (${currentProject}/${totalProjects})`); + console.log( + `Updating project ID: ${project.id} (${currentProject}/${totalProjects})`, + ); try { const content = await getProjectMetadata(project); @@ -53,7 +54,9 @@ async function main() { // Optional: Print a message to confirm that the project was updated console.log(`Successfully updated project ID: ${project.id}`); } catch (e) { - console.error(`Failed to update project ID: ${project.id}, removing from database. Error: ${e.message}`); + console.error( + `Failed to update project ID: ${project.id}, removing from database. Error: ${e}`, + ); await prisma.project.delete({ where: { @@ -61,20 +64,17 @@ async function main() { }, }); } - } - console.log('All updates completed.'); + console.log("All updates completed."); } - - main() .then(async () => { - await prisma.$disconnect() + await prisma.$disconnect(); }) .catch(async (e) => { - console.error(e) - await prisma.$disconnect() - process.exit(1) - }) + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/packages/prisma/tsconfig.json b/packages/prisma/tsconfig.json index 73b617f7..21193780 100644 --- a/packages/prisma/tsconfig.json +++ b/packages/prisma/tsconfig.json @@ -1,12 +1,10 @@ { - "extends": "@celluloid/config/tsconfig/node16.json", + "extends": "@celluloid/config/tsconfig/internal-package.json", "compilerOptions": { - "resolveJsonModule": true + "rootDir": "src" }, "include": [ - "**/*.ts", - "**/*.tsx", - "tsup.config.ts" + "src" ], "exclude": [ "node_modules" diff --git a/packages/queue/package.json b/packages/queue/package.json index e2fc1af6..4cb85873 100644 --- a/packages/queue/package.json +++ b/packages/queue/package.json @@ -15,29 +15,37 @@ "type": "module", "exports": { ".": { - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "default": "./src/index.ts" + }, + "./env": { + "types": "./dist/env.d.ts", + "default": "./src/env.ts" } }, "scripts": { "build": "tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", "dev": "tsc" }, "dependencies": { "@celluloid/config": "workspace:*", + "@celluloid/emails": "workspace:*", "@celluloid/prisma": "workspace:*", - "@celluloid/utils": "workspace:*", "@celluloid/types": "workspace:*", + "@celluloid/utils": "workspace:*", "@mgcrea/prisma-queue": "^1.11.1", + "@react-email/components": "0.0.31", "@t3-oss/env-core": "^0.11.1", "fluent-ffmpeg": "^2.1.3", "minio": "^7.1.3", - "zod": "^3.23.8" + "nodemailer": "^6.9.9", + "zod": "^3.23.8", + "zx": "^8.2.4" }, "devDependencies": { "@celluloid/config": "workspace:*", "@types/fluent-ffmpeg": "^2", - "tsup": "^8.3.0", - "typescript": "^5.6.2" + "typescript": "catalog:" } } diff --git a/packages/queue/src/env.ts b/packages/queue/src/env.ts index 5c39be92..2ee4d2b9 100644 --- a/packages/queue/src/env.ts +++ b/packages/queue/src/env.ts @@ -1,3 +1,4 @@ +import { envBoolean } from "@celluloid/utils"; import { createEnv } from "@t3-oss/env-core"; import { z } from "zod"; @@ -7,6 +8,14 @@ export const env = createEnv({ STORAGE_ACCESS_KEY: z.string(), STORAGE_SECRET_KEY: z.string(), STORAGE_BUCKET: z.string().default('celluloid'), + + SMTP_HOST: z.string().optional(), + SMTP_PORT: z.coerce.number().optional(), + SMTP_SECURE: envBoolean({ optional: true, defaultValue: false }), + SMTP_EMAIL_FROM: z.string().default("no-reply@celluloid.me"), + SMTP_USER: z.string().optional(), + SMTP_PASSWORD: z.string().optional(), + }, runtimeEnv: process.env, emptyStringAsUndefined: true, diff --git a/packages/queue/src/jobs/chapters.ts b/packages/queue/src/jobs/chapters.ts index ac64dc59..50b2c266 100644 --- a/packages/queue/src/jobs/chapters.ts +++ b/packages/queue/src/jobs/chapters.ts @@ -39,20 +39,20 @@ export const chaptersQueue = createQueue( } - const videoFile = metadata.streamingPlaylists[0]?.files + const videoUrl = metadata.streamingPlaylists[0]?.files .sort((a, b) => a.size - b.size) // Sort files by size in ascending order .find((file) => file.fileDownloadUrl)?.fileDownloadUrl; // Find the first file with a download URL const duration = metadata.duration || 0; - if (!videoFile) { + if (!videoUrl) { console.error("No video file found"); return { status: 404 }; } await job.progress(10); - const videoPath = await downloadVideoFile(videoFile); - await job.progress(50); + // const videoPath = await downloadVideoFile(videoUrl); + // await job.progress(50); await prisma.project.update({ where: { id: payload.projectId }, @@ -62,7 +62,7 @@ export const chaptersQueue = createQueue( }); try { - const chapters = await detectScenes({ projectId: payload.projectId, videoPath, duration }); + const chapters = await detectScenes({ projectId: payload.projectId, videoUrl, duration }); await job.progress(70); const thumbnailStorages = await prisma.storage.createManyAndReturn({ diff --git a/packages/queue/src/jobs/email.ts b/packages/queue/src/jobs/email.ts index a9ef2bf7..fd0bbde6 100644 --- a/packages/queue/src/jobs/email.ts +++ b/packages/queue/src/jobs/email.ts @@ -1,20 +1,29 @@ import { createQueue } from "@mgcrea/prisma-queue" +import { sendEmailVerification, sendForgetPassword } from "../mailer/send-mail"; -type JobPayload = { email: string }; -type JobResult = { status: number }; +type EmailJobPayload = { email: string, username?: string, type: "sign-in" | "email-verification" | "forget-password", otp: string }; +type EmailJobResult = { status: number }; -export const emailQueue = createQueue({ name: "email" }, async (job, client) => { +export const emailQueue = createQueue({ name: "emails" }, async (job, client) => { const { id, payload } = job; console.log(`Processing job#${id} with payload=${JSON.stringify(payload)})`); - // await someAsyncMethod(); - await job.progress(50); + try { + if (["email-verification", "sign-in"].includes(payload.type)) { + await sendEmailVerification({ username: payload.username, email: payload.email, otp: payload.otp }); + } - const status = 200; - if (Math.random() > 0.5) { - throw new Error("Failed for some unknown reason"); + if (payload.type === "forget-password") { + await sendForgetPassword({ username: payload.username, email: payload.email, otp: payload.otp }); + } + } catch (error) { + console.error("Error sending email", error); } + + const status = 200; console.log(`Finished job#${id} with status=${status}`); return { status }; }); + +//testtest-9320 diff --git a/packages/queue/src/mailer/send-mail.ts b/packages/queue/src/mailer/send-mail.ts new file mode 100644 index 00000000..b44ee891 --- /dev/null +++ b/packages/queue/src/mailer/send-mail.ts @@ -0,0 +1,50 @@ + +import { render } from '@react-email/components'; +import * as nodemailer from "nodemailer"; +import { EmailVerification, ForgetPasswordEmail } from '@celluloid/emails'; + +import getTransport from "./transport"; +import { env } from '../env'; +const isDev = process.env.NODE_ENV !== "production"; +const isCI_TEST = process.env.CI_TEST; + +export async function sendMail( + to: string, subject: string, html: string) { + + if (isCI_TEST) { + return console.log(`email send to ${to}`) + } + + const transport = await getTransport(); + const mailOptions = { + from: `"Celluloid" <${env.SMTP_EMAIL_FROM}>`, to, subject, html + }; + await transport.sendMail(mailOptions); + // if (isDev) { + // const url = nodemailer.getTestMessageUrl(info); + // if (url) { + // // Hex codes here equivalent to chalk.blue.underline + // console.log( + // `Development email preview: \x1B[34m\x1B[4m${url}\x1B[24m\x1B[39m` + // ); + // } + // } + return true; + +} + + + +export async function sendForgetPassword({ username, email, otp }: { username?: string, email: string, otp: string }) { + const subject = "[Celluloid] Réinitialisation de votre mot de passe."; + const emailHtml = await render(ForgetPasswordEmail({ username, email, otp })); + return sendMail(email, subject, emailHtml) +} + + +export async function sendEmailVerification({ username, email, otp }: { username?: string, email: string, otp: string }) { + const subject = "[Celluloid] Vérification de votre email"; + const emailHtml = await render(EmailVerification({ username, otp })); + return sendMail(email, subject, emailHtml) + +} diff --git a/packages/trpc/src/mailer/transport.ts b/packages/queue/src/mailer/transport.ts similarity index 91% rename from packages/trpc/src/mailer/transport.ts rename to packages/queue/src/mailer/transport.ts index 333e29e4..22155b0d 100644 --- a/packages/trpc/src/mailer/transport.ts +++ b/packages/queue/src/mailer/transport.ts @@ -1,6 +1,6 @@ -import { env } from '@celluloid/utils'; import { promises as fsp } from "node:fs"; import * as nodemailer from "nodemailer"; +import { env } from "../env"; const { readFile, writeFile } = fsp; const isTest = process.env.NODE_ENV === "test"; @@ -20,11 +20,11 @@ export default function getTransport(): Promise { }); } if (isDev) { - let account; + let account: nodemailer.TestAccount; try { const testAccountJson = await readFile(etherealFilename, "utf8"); account = JSON.parse(testAccountJson); - } catch (e: any) { + } catch (e) { account = await nodemailer.createTestAccount(); await writeFile(etherealFilename, JSON.stringify(account)); } @@ -65,6 +65,10 @@ export default function getTransport(): Promise { host: env.SMTP_HOST, port: env.SMTP_PORT, secure: env.SMTP_SECURE, + auth: { + user: env.SMTP_USER, + pass: env.SMTP_PASSWORD, + }, }); })(); diff --git a/packages/queue/src/utils/scenes.ts b/packages/queue/src/utils/scenes.ts index 67ff9a85..e331af35 100644 --- a/packages/queue/src/utils/scenes.ts +++ b/packages/queue/src/utils/scenes.ts @@ -3,8 +3,10 @@ import fs from "node:fs"; import path from "node:path"; import os from "node:os"; import { Client } from "minio"; -import { env } from "@celluloid/utils"; +import { $ } from "zx"; + import { parseUrl } from "./s3"; +import { env } from "../env"; interface Scene { id: number; @@ -20,116 +22,94 @@ type ScenesResult = { /** * Detects scenes in a video based on a specified threshold and generates thumbnails for each scene. - * @param videoPath - Path to the video file. + * @param videoUrl - Path to the video file. * @param threshold - Scene change threshold (default is 0.4). * @param outputDir - Directory to save the thumbnails. * @returns A promise that resolves with an array of detected scenes and their thumbnail paths. */ export async function detectScenes({ projectId, - videoPath, + videoUrl, threshold = 0.4, duration, }: { projectId: string; - videoPath: string; + videoUrl: string; threshold?: number; duration: number; }): Promise { - return new Promise((resolve, reject) => { + // Create output directory + const currentDate = new Date().toISOString().split("T")[0]; + const outputDir = path.join(os.tmpdir(), `${projectId}/scene_detection_${currentDate}`); + fs.mkdirSync(outputDir, { recursive: true }); + + try { + // Run single FFmpeg command to detect scenes and save thumbnails + const { stdout } = await $`ffmpeg -i ${videoUrl} \ + -vf "select='gt(scene,${threshold})',scale=320:-1,showinfo" \ + -vsync vfr \ + -start_number 1 \ + -frame_pts 0 \ + ${path.join(outputDir, 'thumbnail_%d.jpg')} \ + 2>&1 | grep -oE 'pts_time:[0-9.]+' | awk -F: '{print $2}'`; + + const timestamps = stdout.trim().split('\n').map(Number); const scenes: Scene[] = []; - let output = ""; - - // Create a folder in the OS temp directory with the current date - const currentDate = new Date().toISOString().split("T")[0]; // Format: YYYY-MM-DD - const outputDir = path.join(os.tmpdir(), `${projectId}/scene_detection_${currentDate}`); - fs.mkdirSync(outputDir, { recursive: true }); - - console.log(`Output directory: ${outputDir}`); - - ffmpeg(videoPath) - .videoFilters([ - `select='gt(scene,${threshold})'`, - "scale=320:-1", - "showinfo", - ]) - .outputOptions(["-vsync", "0", "-f", "null"]) - .output("-") - .on("start", (command) => { - console.log("FFmpeg command:", command); - }) - .on("stderr", (stderrLine) => { - output += stderrLine; - }) - .on("end", () => { - // Parse the output to extract scene timestamps - const sceneRegex = /pts_time:(\d+\.\d+)/g; - let match: RegExpExecArray | null; - let id = 1; - let lastTimestamp = 0; - - // biome-ignore lint/suspicious/noAssignInExpressions: - while ((match = sceneRegex.exec(output)) !== null) { - const currentTimestamp = match[1] ? Number.parseFloat(match[1]) : 0; - - if (id > 1) { - // Update the endTime of the previous scene - const currentScene = scenes[scenes.length - 1]; - if (currentScene) { - currentScene.endTime = currentTimestamp; - } - } - - const thumbnailPath = path.join( - outputDir, - `thumbnail_${String(id)}.jpg`, - ); - - scenes.push({ - id, - startTime: lastTimestamp, - endTime: currentTimestamp, // This will be updated in the next iteration - thumbnailPath, - }); - - lastTimestamp = currentTimestamp; - id++; - } - // Set the endTime of the last scene to the video duration - if (scenes.length > 0) { + // Process the timestamps + timestamps.forEach((currentTimestamp: number, index: number) => { + const id = index + 1; + const startTime = index === 0 ? 0 : timestamps[index - 1] ?? 0; + const endTime = currentTimestamp; + + const thumbnailPath = path.join( + outputDir, + `thumbnail_${id}.jpg`, + ); + + scenes.push({ + id, + startTime, + endTime, + thumbnailPath, + }); + }); - const lastScene = scenes[scenes.length - 1]; - if (lastScene) { - lastScene.endTime = duration; - } + // Update the last scene's end time to video duration + if (scenes.length > 0) { + const lastScene = scenes[scenes.length - 1]; + if (lastScene) { + lastScene.endTime = duration; + } - generateThumbnails(projectId, videoPath, scenes, outputDir) - .then(() => resolve({ outputDir, scenes })) - .catch(reject); + // Generate thumbnails and upload to S3 + // await generateThumbnails(projectId, videoUrl, scenes, outputDir); - } else { - resolve({ outputDir, scenes }); - } - }) - .on("error", (err) => { - console.error("Error processing video:", err); - reject(err); - }) - .run(); - }); + const updatedScenes = await uploadThumbnailsToS3(projectId, scenes); + // Remove the temporary directory + fs.rmSync(outputDir, { recursive: true }); + + return { outputDir, scenes: updatedScenes }; + } + + return { outputDir, scenes }; + + } catch (error) { + console.error("Error processing video:", error); + throw error; + } } async function generateThumbnails( projectId: string, - videoPath: string, + videoUrl: string, scenes: Scene[], outputDir: string, ): Promise { return new Promise((resolve, reject) => { const timestamps = scenes.map((scene) => scene.startTime); - ffmpeg(videoPath) + ffmpeg(videoUrl) .screenshots({ timestamps: timestamps, filename: "thumbnail_%i.jpg", @@ -157,7 +137,7 @@ async function generateThumbnails( async function uploadThumbnailsToS3( projectId: string, scenes: Scene[], -): Promise { +): Promise { const storageUrlInfo = parseUrl(env.STORAGE_URL) // Initialize MinIO client @@ -192,4 +172,6 @@ async function uploadThumbnailsToS3( // Remove the local file after upload fs.unlinkSync(localFilePath); } + + return scenes; } diff --git a/packages/queue/src/utils/thumbnail.ts b/packages/queue/src/utils/thumbnail.ts new file mode 100644 index 00000000..000ea6bc --- /dev/null +++ b/packages/queue/src/utils/thumbnail.ts @@ -0,0 +1,10 @@ +import { $ } from "zx"; + +export async function generateThumbnail(videoUrl: string, timestamp: number, outputPath: string): Promise { + try { + await $`ffmpeg -ss ${timestamp} -i ${videoUrl} -vframes 1 -vf scale=320:-1 -f image2 -c:v mjpeg -q:v 2 -y ${outputPath}`; + } catch (error) { + console.error("Error generating thumbnail:", error); + throw error; + } +} diff --git a/packages/queue/tsconfig.json b/packages/queue/tsconfig.json index fe108138..a71ced52 100644 --- a/packages/queue/tsconfig.json +++ b/packages/queue/tsconfig.json @@ -5,6 +5,7 @@ "ES2020", "DOM" ], + "jsx": "react-jsx" }, "include": [ "src" diff --git a/packages/queue/tsup.config.ts b/packages/queue/tsup.config.ts deleted file mode 100644 index 20d7a2e4..00000000 --- a/packages/queue/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; - -const isProduction = process.env.NODE_ENV === "production"; - -export default defineConfig({ - clean: true, - dts: true, - entry: ["src/index.ts",], - format: ['esm'], - target: "esnext", - minify: isProduction, - sourcemap: true, -}); diff --git a/packages/trpc/package.json b/packages/trpc/package.json index f6e397f2..ce38162f 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -15,47 +15,48 @@ "type": "module", "exports": { ".": { - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "default": "./src/index.ts" + }, + "./env": { + "types": "./dist/env.d.ts", + "default": "./src/env.ts" } }, "scripts": { - "build": "tsup", - "dev": "tsup --watch" + "build": "tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", + "dev": "tsc" }, "dependencies": { - "@celluloid/passport": "workspace:*", "@celluloid/prisma": "workspace:*", "@celluloid/queue": "workspace:*", "@celluloid/utils": "workspace:*", + "@celluloid/auth": "workspace:*", "@t3-oss/env-core": "^0.11.1", "@trpc/server": "^10.45.2", "bcryptjs": "^2.4.3", + "better-auth": "^1.0.3", "change-case": "^4.1.2", "dotenv": "^16.3.1", "express": "^4.19.2", - "express-session": "^1.17.3", "js2xmlparser": "^5.0.0", "lodash": "^4.17.21", "minio": "^7.1.3", - "mjml": "^4.14.1", - "nodemailer": "^6.9.9", - "nodemailer-smtp-transport": "^2.7.4", "papaparse": "^5.4.1", "trpc-openapi": "^1.2.0", "uuid": "^9.0.1", "ws": "^8.18.0", - "zod": "^3.23.8" + "zod": "catalog:" }, "devDependencies": { "@celluloid/config": "workspace:*", "@types/express": "^5.0.0", - "@types/express-session": "^1.17.8", "@types/mjml": "^4.7.3", "@types/nodemailer": "^6.4.13", "@types/papaparse": "^5.3.10", "@types/uuid": "^9.0.4", "tsup": "^8.3.0", - "typescript": "^5.6.2" + "typescript": "catalog:" } } diff --git a/packages/trpc/src/env.ts b/packages/trpc/src/env.ts new file mode 100644 index 00000000..23c37013 --- /dev/null +++ b/packages/trpc/src/env.ts @@ -0,0 +1,15 @@ +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + BASE_URL: z.string(), + REDIS_URL: z.string().default("redis://localhost"), + STORAGE_URL: z.string(), + STORAGE_ACCESS_KEY: z.string(), + STORAGE_SECRET_KEY: z.string(), + STORAGE_BUCKET: z.string().default('celluloid'), + }, + runtimeEnv: process.env, + emptyStringAsUndefined: true +}); diff --git a/packages/trpc/src/mailer/sendMail.ts b/packages/trpc/src/mailer/sendMail.ts deleted file mode 100644 index 72052767..00000000 --- a/packages/trpc/src/mailer/sendMail.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { env } from '@celluloid/utils'; -import mjml2html from 'mjml'; -import * as nodemailer from "nodemailer"; - -import getTransport from "./transport"; - -const isDev = process.env.NODE_ENV !== "production"; - -const isCI_TEST = process.env.CI_TEST; - -export async function sendMail( - to: string, subject: string, html: string) { - - if (isCI_TEST) { - return console.log(`email send to ${to}`) - } - - const transport = await getTransport(); - const mailOptions = { - from: `Celluloid <${env.SMTP_EMAIL_FROM}>`, to, subject, html - }; - - const info = await transport.sendMail(mailOptions); - if (isDev) { - const url = nodemailer.getTestMessageUrl(info); - if (url) { - // Hex codes here equivalent to chalk.blue.underline - console.log( - `Development email preview: \x1B[34m\x1B[4m${url}\x1B[24m\x1B[39m` - ); - } - } - -} - - -export async function sendPasswordReset({ username, email, code }: { username: string, email: string, code: string }) { - const subject = `${username} : réinitialisation de votre mot de passe Celluloid`; - const mjmlTemplate = ` - - - - -

Bonjour ${username},

- Nous avons reçu une demande de réinitialisation de mot de passe pour l'adresse email ${email} - Voici votre code de confirmation : ${code} - Ce code sera valable pendant 1 heure. - Veuillez le saisir dans le formulaire prévu à cet effet. - Si vous n'êtes pas à l'origine de cette demande, veuillez simplement ignorer ce mail. - Cordialement, - L'équipe Celluloid -
-
-
-
- `; - - const { html } = mjml2html(mjmlTemplate); - await sendMail(email, subject, html) -} - - - -export async function sendConfirmationCode({ username, email, code }: { username: string, email: string, code: string }) { - const subject = `Bienvenue sur Celluloid, ${username} !`; - const mjmlTemplate = ` - - - - - - Bonjour ${username}, - - - Voici votre code de confirmation : ${code} - - - Ce code est valable pendant 1 heure. - - - Veuillez le saisir dans le formulaire prévu à cet effet. - - - L'équipe Celluloid vous souhaite la bienvenue ! - - - - - - `; - - const { html } = mjml2html(mjmlTemplate); - await sendMail(email, subject, html) -} - diff --git a/packages/trpc/src/routers/annotation.ts b/packages/trpc/src/routers/annotation.ts index 039ac72c..ccafab37 100644 --- a/packages/trpc/src/routers/annotation.ts +++ b/packages/trpc/src/routers/annotation.ts @@ -1,4 +1,4 @@ -import { prisma, UserRole } from '@celluloid/prisma'; +import { prisma } from '@celluloid/prisma'; import type { Annotation } from '@celluloid/prisma'; import { Prisma } from '@celluloid/prisma'; import { toSrt } from '@celluloid/utils'; @@ -97,7 +97,7 @@ export const annotationRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user && ctx.user.id) { + if (ctx.user?.id) { const annotation = await prisma.annotation.create({ data: { userId: ctx.user?.id, @@ -146,7 +146,7 @@ export const annotationRouter = router({ ); } - if (annotation.userId == ctx.user?.id || ctx.user.role == UserRole.Admin || annotation.project.userId == ctx.user?.id) { + if (annotation.userId === ctx.user?.id || ctx.user?.role === "admin" || annotation.project.userId === ctx.user?.id) { // Perform the update const updatedAnnotation = await prisma.annotation.update({ where: { id: input.annotationId }, @@ -195,20 +195,18 @@ export const annotationRouter = router({ ); } - if (annotation.userId == ctx.user?.id || ctx.user.role == UserRole.Admin || annotation.project.userId == ctx.user?.id) { + if (annotation.userId === ctx.user?.id || ctx.user?.role === "admin" || annotation.project.userId === ctx.user?.id) { const annotation = await prisma.annotation.delete({ where: { id: input.annotationId }, }); ee.emit('change', annotation); return annotation; - } else { - throw new TRPCError({ - code: "UNAUTHORIZED", - message: "Can't edit this annotation" - } - ); - } + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Can't edit this annotation" + } + ); }), export: protectedProcedure .input( @@ -241,10 +239,10 @@ export const annotationRouter = router({ let content = ""; if (format === 'xml') { content = toXML("annotations", formated, { cdataKeys: ['comments', 'text'] }); - } else if (format == "csv") { + } else if (format === "csv") { const sorted = formated.sort((a, b) => a.startTime - b.startTime) content = Papa.unparse(sorted); - } else if (format == "srt") { + } else if (format === "srt") { content = toSrt(formated); } return content diff --git a/packages/trpc/src/routers/chapter.ts b/packages/trpc/src/routers/chapter.ts index 5bbc9743..fc17c6eb 100644 --- a/packages/trpc/src/routers/chapter.ts +++ b/packages/trpc/src/routers/chapter.ts @@ -1,12 +1,7 @@ -import { prisma, UserRole } from '@celluloid/prisma'; -import type { Annotation } from '@celluloid/prisma'; +import { prisma } from '@celluloid/prisma'; import { Prisma } from '@celluloid/prisma'; -import { toSrt } from '@celluloid/utils'; import { TRPCError } from '@trpc/server'; -import { observable } from '@trpc/server/observable'; import { EventEmitter } from 'node:events'; -import { parse as toXML } from 'js2xmlparser'; -import Papa from 'papaparse'; import { z } from 'zod'; import { protectedProcedure, publicProcedure, router } from '../trpc'; @@ -75,7 +70,7 @@ export const chapterRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user?.id && ctx.requirePermissions([UserRole.Teacher, UserRole.Admin])) { + if (ctx.user?.id && ctx.requireRoles(['teacher', 'admin'])) { // Find the project by its ID (you need to replace 'projectId' with the actual ID) const project = await prisma.project.findUnique({ @@ -132,7 +127,7 @@ export const chapterRouter = router({ ); } - if (ctx.user.role === UserRole.Admin || project.userId === ctx.user?.id) { + if (ctx.user?.role === "admin" || project.userId === ctx.user?.id) { const chapter = await prisma.chapter.create({ data: { projectId: input.projectId, @@ -190,7 +185,7 @@ export const chapterRouter = router({ ); } - if (ctx.user.role === UserRole.Admin || chapter.project.userId === ctx.user?.id) { + if (ctx.user?.role === "admin" || chapter.project.userId === ctx.user?.id) { // Perform the update const updatedChapter = await prisma.chapter.update({ where: { id: input.chapterId }, @@ -236,7 +231,7 @@ export const chapterRouter = router({ ); } - if (ctx.user.role === UserRole.Admin || chapter.project.userId === ctx.user?.id) { + if (ctx.user?.role === "admin" || chapter.project.userId === ctx.user?.id) { const chapter = await prisma.chapter.delete({ where: { id: input.chapterId }, }); @@ -249,5 +244,54 @@ export const chapterRouter = router({ } ); + }), + reset: protectedProcedure + .input( + z.object({ + projectId: z.string(), + }), + ) + .mutation(async ({ input, ctx }) => { + + const project = await prisma.project.findUnique({ + where: { id: input.projectId }, + select: { + userId: true + } + }); + + if (!project) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "Project not found" + } + ); + } + + if (ctx.user?.role === "admin" || project.userId === ctx.user?.id) { + + // Check if the annotation with the given ID exists + await prisma.chapter.deleteMany({ + where: { projectId: input.projectId } + }); + + await prisma.project.update({ + where: { id: input.projectId }, + data: { + chapterJob: { + disconnect: true + } + } + }); + + // ee.emit('change', chapter); + return; + } + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Can't edit this chapter" + } + ); + }), }); diff --git a/packages/trpc/src/routers/playlist.ts b/packages/trpc/src/routers/playlist.ts index ab0e0af7..bd5c23b4 100644 --- a/packages/trpc/src/routers/playlist.ts +++ b/packages/trpc/src/routers/playlist.ts @@ -1,4 +1,3 @@ -import { UserRole } from '@celluloid/prisma'; import { prisma } from "@celluloid/prisma" import { generateUniqueShareName } from '@celluloid/utils'; import { TRPCError } from '@trpc/server'; @@ -143,7 +142,7 @@ export const playlistRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user && ctx.requirePermissions([UserRole.Teacher, UserRole.Admin])) { + if (ctx.user && ctx.requireRoles(['teacher', 'admin'])) { const userId = ctx.user.id; const project = await prisma.playlist.create({ diff --git a/packages/trpc/src/routers/project.ts b/packages/trpc/src/routers/project.ts index 82c23df5..6674b931 100644 --- a/packages/trpc/src/routers/project.ts +++ b/packages/trpc/src/routers/project.ts @@ -1,4 +1,4 @@ -import { Prisma, prisma, UserRole } from '@celluloid/prisma'; +import { Prisma, prisma } from '@celluloid/prisma'; import { generateUniqueShareName } from '@celluloid/utils'; import { TRPCError } from '@trpc/server'; import { z } from 'zod'; @@ -210,10 +210,10 @@ export const projectRouter = router({ return { ...project, - editable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === UserRole.Admin), - deletable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === UserRole.Admin), - annotable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === UserRole.Admin || (project.members.some(m => ctx.user && m.userId === ctx.user.id) && project.collaborative)), - commentable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === UserRole.Admin || (project.members.some(m => ctx.user && m.userId === ctx.user.id) && project.collaborative)), + editable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === "admin"), + deletable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === "admin"), + annotable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === "admin" || (project.members.some(m => ctx.user && m.userId === ctx.user.id) && project.collaborative)), + commentable: ctx.user && (ctx.user.id === project.userId || ctx.user.role === "admin" || (project.members.some(m => ctx.user && m.userId === ctx.user.id) && project.collaborative)), }; }), add: protectedProcedure @@ -236,7 +236,7 @@ export const projectRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user?.id && ctx.requirePermissions([UserRole.Teacher, UserRole.Admin])) { + if (ctx.user?.id && ctx.requireRoles(['teacher', 'admin'])) { const project = await prisma.project.create({ data: { @@ -287,7 +287,7 @@ export const projectRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user?.id && ctx.requirePermissions([UserRole.Teacher, UserRole.Admin])) { + if (ctx.user?.id && ctx.requireRoles(['teacher', 'admin'])) { // Find the project by its ID (you need to replace 'projectId' with the actual ID) const project = await prisma.project.findUnique({ @@ -340,7 +340,7 @@ export const projectRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user?.id && ctx.requirePermissions([UserRole.Teacher, UserRole.Admin])) { + if (ctx.user?.id && ctx.requireRoles(['teacher', 'admin'])) { // Find the project by its ID (you need to replace 'projectId' with the actual ID) const project = await prisma.project.findUnique({ diff --git a/packages/trpc/src/routers/storage.ts b/packages/trpc/src/routers/storage.ts index 30886260..6d257e4f 100644 --- a/packages/trpc/src/routers/storage.ts +++ b/packages/trpc/src/routers/storage.ts @@ -1,9 +1,9 @@ import { Prisma, prisma } from "@celluloid/prisma"; -import { env } from "@celluloid/utils"; import * as Minio from "minio"; import { z } from "zod"; import { protectedProcedure, router } from "../trpc"; +import { env } from "../env"; const defaultStorageSelect = Prisma.validator()({ id: true, @@ -75,7 +75,7 @@ export const storageRouter = router({ }), ) .mutation(async ({ input, ctx }) => { - if (ctx.user && ctx.user.id) { + if (ctx.user?.id) { const file = await prisma.storage.create({ data: { user: { @@ -99,7 +99,7 @@ export const storageRouter = router({ ) .mutation(async ({ input, ctx }) => { //TODO : check if project owner or collaborator - if (ctx.user && ctx.user.id) { + if (ctx.user?.id) { const comment = await prisma.comment.delete({ where: { id: input.commentId }, }); diff --git a/packages/trpc/src/routers/user.ts b/packages/trpc/src/routers/user.ts index c8600559..82802905 100644 --- a/packages/trpc/src/routers/user.ts +++ b/packages/trpc/src/routers/user.ts @@ -1,13 +1,7 @@ -import { passport } from "@celluloid/passport"; -import { Prisma, prisma, UserRole } from "@celluloid/prisma" -import { compareCodes, generateOtp, hashPassword } from "@celluloid/utils"; +import { Prisma, prisma } from "@celluloid/prisma" import { TRPCError } from "@trpc/server"; -import bcrypt from 'bcryptjs'; import { z } from 'zod'; - -import { sendConfirmationCode, sendPasswordReset } from "../mailer/sendMail"; import { protectedProcedure, publicProcedure, router } from '../trpc'; -import { emailQueue } from "@celluloid/queue"; export const defaultUserSelect = Prisma.validator()({ id: true, @@ -32,309 +26,309 @@ export const defaultUserSelect = Prisma.validator()({ export const UserSchema = z.object({ id: z.string({ description: 'The unique identifier for the user' }), username: z.string({ description: 'The username for the user' }), - role: z.nativeEnum(UserRole, { description: 'The role assigned to the user, either Admin or User' }).nullable(), + role: z.string({ description: 'The role assigned to the user, either Admin or User' }).nullable(), initial: z.string({ description: 'The initial letter or string for user representation' }), color: z.string({ description: 'The color code associated with the user' }) }); export const userRouter = router({ - login: publicProcedure - .meta({ - openapi: { - method: 'POST', - path: '/login', - description: 'This endpoint allows a user to login.' - } - }) - .input( - z.object({ - username: z.string({ description: 'The username of the user' }), - password: z.string({ description: 'The password for the user' }) - }), - ).output(UserSchema.nullable()) - .mutation(async ({ ctx, input }) => { - - //@ts-expect-error dynamic - ctx.req.body = input; - - emailQueue.add({ email: input.username }); - await new Promise((resolve, reject) => { - passport.authenticate("login", { - failWithError: true - })(ctx.req, ctx.res, (err: Error, user: Express.User) => { - if (err) return reject(err); - resolve(user); - }) - }).catch(err => { - console.log(err.name); - - if (err?.name === 'InvalidUserError') { - throw new TRPCError({ - code: 'UNAUTHORIZED', - message: 'USER_NOT_FOUND' - }) - } - if (err?.name === "UserNotConfirmed") { - throw new TRPCError({ - code: 'UNAUTHORIZED', - message: 'USER_NOT_CONFIRMED' - }) - } - - throw new TRPCError({ - code: 'INTERNAL_SERVER_ERROR', - message: err - }) - }) - - const user = await prisma.user.findFirst({ - select: defaultUserSelect, - where: { - OR: [{ email: input.username }, { username: input.username, }] - } - }); - - return user; - }), - forgot: publicProcedure.input( - z.object({ - email: z.string() - }), - ).mutation(async ({ ctx, input }) => { - const user = await prisma.user.findFirst({ - select: { ...defaultUserSelect, email: true }, - where: { - OR: [{ email: input.email }, { username: input.email, }] - } - }); - - if (!user) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Email or username not found", - }); - } - if (!user.email) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: `User account doesn't have email address`, - }); - } - - const otp = generateOtp(); - await prisma.user.update({ - where: { id: user.id }, - data: { - code: otp, - codeGeneratedAt: new Date() - } - }) - await sendPasswordReset({ email: user.email, username: user.username, code: otp }) - return { status: true } - }), - - recover: publicProcedure.input( - z.object({ - username: z.string(), - code: z.string(), - password: z.string().min(8) - }), - ).mutation(async ({ ctx, input }) => { - const user = await prisma.user.findFirst({ - select: { ...defaultUserSelect, email: true, code: true }, - where: { - OR: [{ email: input.username }, { username: input.username, }] - } - }); - - if (!user) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Email or username not found", - }); - } - - if (!compareCodes(input.code, user.code || "")) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Failed to recover account, code invalid" - }); - } - - const newUser = await prisma.user.update({ - where: { id: user.id }, - data: { - password: hashPassword(input.password), - code: null, - codeGeneratedAt: null, - confirmed: true - } - }) - - //@ts-expect-error dynamic - await new Promise((resolve) => ctx.req.login(newUser, () => resolve(null))); - - return { status: true } - - }), - - register: publicProcedure.input( - z.object({ - username: z.string(), - email: z.string(), - password: z.string().min(8) - }), - ).mutation(async ({ ctx, input }) => { - - - const user = await prisma.user.findFirst({ - select: { ...defaultUserSelect, email: true, code: true }, - where: { - OR: [{ email: input.email }, { username: input.username, }] - } - }); - - if (user) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: "ACCOUNT_EXISTS", - }); - } - - const code = generateOtp(); - const newUser = await prisma.user.create({ - select: { - ...defaultUserSelect, email: true - }, - data: { - username: input.username, - email: input.email, - password: hashPassword(input.password), - code: process.env.CI_TEST ? "0000" : code, - codeGeneratedAt: new Date(), - confirmed: false, - role: "Teacher" - } - }) - - console.log(" Confirmation code", code) - - await sendConfirmationCode({ username: newUser.username, email: input.email, code: code }); - - return newUser - - }), - registerAsStudent: publicProcedure.input( - z.object({ - username: z.string(), - shareCode: z.string(), - password: z.string().min(8) - }), - ).mutation(async ({ ctx, input }) => { - - - const project = await prisma.project.findUnique({ - where: { shareCode: input.shareCode } - - }); - - if (!project) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "CODE_NOT_FOUND", - }); - } - - - const user = await prisma.user.findFirst({ - select: defaultUserSelect, - where: { - username: input.username - } - }); - - if (user) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: "ACCOUNT_EXISTS", - }); - } - - - const newUser = await prisma.user.create({ - select: { - ...defaultUserSelect - }, - data: { - username: input.username, - password: hashPassword(input.password), - confirmed: true, - role: "Student" - } - }) - - await prisma.project.update({ - where: { id: project.id }, - data: { - members: { - create: [{ - userId: newUser.id, - }], - } - } - }) - - //@ts-expect-error dynamic - await new Promise((resolve) => ctx.req.login(newUser, () => resolve(null))); - - return { projectId: project.id } - - }), - - changePassword: protectedProcedure.input( - z.object({ - oldPassword: z.string(), - newPassword: z.string().min(8) - }), - ).mutation(async ({ ctx, input }) => { - - if (ctx.user) { - const user = await prisma.user.findUnique({ - where: { id: ctx.user.id }, - }); - - if (!user) { - throw new TRPCError({ - code: 'UNAUTHORIZED', - }); - } - - if (!bcrypt.compareSync(input.oldPassword, user.password)) { - throw new TRPCError({ - code: 'UNAUTHORIZED', - message: 'WRONG_PASSWORD' - }); - } - - const newUser = await prisma.user.update({ - where: { id: ctx.user.id }, - select: defaultUserSelect, - data: { - password: hashPassword(input.newPassword), - } - }) - - return newUser - } - - throw new TRPCError({ - code: 'UNAUTHORIZED', - }); - - - }), - join: protectedProcedure.input( + // login: publicProcedure + // .meta({ + // openapi: { + // method: 'POST', + // path: '/login', + // description: 'This endpoint allows a user to login.' + // } + // }) + // .input( + // z.object({ + // username: z.string({ description: 'The username of the user' }), + // password: z.string({ description: 'The password for the user' }) + // }), + // ).output(UserSchema.nullable()) + // .mutation(async ({ ctx, input }) => { + + // //@ts-expect-error dynamic + // ctx.req.body = input; + + // emailQueue.add({ email: input.username }); + // await new Promise((resolve, reject) => { + // passport.authenticate("login", { + // failWithError: true + // })(ctx.req, ctx.res, (err: Error, user: Express.User) => { + // if (err) return reject(err); + // resolve(user); + // }) + // }).catch(err => { + // console.log(err.name); + + // if (err?.name === 'InvalidUserError') { + // throw new TRPCError({ + // code: 'UNAUTHORIZED', + // message: 'USER_NOT_FOUND' + // }) + // } + // if (err?.name === "UserNotConfirmed") { + // throw new TRPCError({ + // code: 'UNAUTHORIZED', + // message: 'USER_NOT_CONFIRMED' + // }) + // } + + // throw new TRPCError({ + // code: 'INTERNAL_SERVER_ERROR', + // message: err + // }) + // }) + + // const user = await prisma.user.findFirst({ + // select: defaultUserSelect, + // where: { + // OR: [{ email: input.username }, { username: input.username, }] + // } + // }); + + // return user; + // }), + // forgot: publicProcedure.input( + // z.object({ + // email: z.string() + // }), + // ).mutation(async ({ ctx, input }) => { + // const user = await prisma.user.findFirst({ + // select: { ...defaultUserSelect, email: true }, + // where: { + // OR: [{ email: input.email }, { username: input.email, }] + // } + // }); + + // if (!user) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: "Email or username not found", + // }); + // } + // if (!user.email) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: `User account doesn't have email address`, + // }); + // } + + // const otp = generateOtp(); + // await prisma.user.update({ + // where: { id: user.id }, + // data: { + // code: otp, + // codeGeneratedAt: new Date() + // } + // }) + // await sendPasswordReset({ email: user.email, username: user.username, code: otp }) + // return { status: true } + // }), + + // recover: publicProcedure.input( + // z.object({ + // username: z.string(), + // code: z.string(), + // password: z.string().min(8) + // }), + // ).mutation(async ({ ctx, input }) => { + // const user = await prisma.user.findFirst({ + // select: { ...defaultUserSelect, email: true, code: true }, + // where: { + // OR: [{ email: input.username }, { username: input.username, }] + // } + // }); + + // if (!user) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: "Email or username not found", + // }); + // } + + // if (!compareCodes(input.code, user.code || "")) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: "Failed to recover account, code invalid" + // }); + // } + + // const newUser = await prisma.user.update({ + // where: { id: user.id }, + // data: { + // password: hashPassword(input.password), + // code: null, + // codeGeneratedAt: null, + // confirmed: true + // } + // }) + + // //@ts-expect-error dynamic + // await new Promise((resolve) => ctx.req.login(newUser, () => resolve(null))); + + // return { status: true } + + // }), + + // register: publicProcedure.input( + // z.object({ + // username: z.string(), + // email: z.string(), + // password: z.string().min(8) + // }), + // ).mutation(async ({ ctx, input }) => { + + + // const user = await prisma.user.findFirst({ + // select: { ...defaultUserSelect, email: true, code: true }, + // where: { + // OR: [{ email: input.email }, { username: input.username, }] + // } + // }); + + // if (user) { + // throw new TRPCError({ + // code: 'BAD_REQUEST', + // message: "ACCOUNT_EXISTS", + // }); + // } + + // const code = generateOtp(); + // const newUser = await prisma.user.create({ + // select: { + // ...defaultUserSelect, email: true + // }, + // data: { + // username: input.username, + // email: input.email, + // password: hashPassword(input.password), + // code: process.env.CI_TEST ? "0000" : code, + // codeGeneratedAt: new Date(), + // confirmed: false, + // role: "Teacher" + // } + // }) + + // console.log(" Confirmation code", code) + + // await sendConfirmationCode({ username: newUser.username, email: input.email, code: code }); + + // return newUser + + // }), + // registerAsStudent: publicProcedure.input( + // z.object({ + // username: z.string(), + // shareCode: z.string(), + // password: z.string().min(8) + // }), + // ).mutation(async ({ ctx, input }) => { + + + // const project = await prisma.project.findUnique({ + // where: { shareCode: input.shareCode } + + // }); + + // if (!project) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: "CODE_NOT_FOUND", + // }); + // } + + + // const user = await prisma.user.findFirst({ + // select: defaultUserSelect, + // where: { + // username: input.username + // } + // }); + + // if (user) { + // throw new TRPCError({ + // code: 'BAD_REQUEST', + // message: "ACCOUNT_EXISTS", + // }); + // } + + + // const newUser = await prisma.user.create({ + // select: { + // ...defaultUserSelect + // }, + // data: { + // username: input.username, + // password: hashPassword(input.password), + // confirmed: true, + // role: "Student" + // } + // }) + + // await prisma.project.update({ + // where: { id: project.id }, + // data: { + // members: { + // create: [{ + // userId: newUser.id, + // }], + // } + // } + // }) + + // //@ts-expect-error dynamic + // await new Promise((resolve) => ctx.req.login(newUser, () => resolve(null))); + + // return { projectId: project.id } + + // }), + + // changePassword: protectedProcedure.input( + // z.object({ + // oldPassword: z.string(), + // newPassword: z.string().min(8) + // }), + // ).mutation(async ({ ctx, input }) => { + + // if (ctx.user) { + // const user = await prisma.user.findUnique({ + // where: { id: ctx.user.id }, + // }); + + // if (!user) { + // throw new TRPCError({ + // code: 'UNAUTHORIZED', + // }); + // } + + // if (!bcrypt.compareSync(input.oldPassword, user.password)) { + // throw new TRPCError({ + // code: 'UNAUTHORIZED', + // message: 'WRONG_PASSWORD' + // }); + // } + + // const newUser = await prisma.user.update({ + // where: { id: ctx.user.id }, + // select: defaultUserSelect, + // data: { + // password: hashPassword(input.newPassword), + // } + // }) + + // return newUser + // } + + // throw new TRPCError({ + // code: 'UNAUTHORIZED', + // }); + + + // }), + joinProject: protectedProcedure.input( z.object({ shareCode: z.string(), }), @@ -373,84 +367,44 @@ export const userRouter = router({ return { projectId: project.id } }), - askEmailConfirm: publicProcedure.input( - z.object({ - email: z.string() - }), - ).mutation(async ({ ctx, input }) => { - const user = await prisma.user.findFirst({ - select: { ...defaultUserSelect, email: true }, - where: { - OR: [{ email: input.email }, { username: input.email, }] - } - }); - - if (!user) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Email or username not found", - }); - } - if (!user.email) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: `User account doesn't have email address`, - }); - } - - const otp = generateOtp(); - await prisma.user.update({ - where: { id: user.id }, - data: { - code: otp, - codeGeneratedAt: new Date() - } - }) - console.log(" Confirmation code", otp) - - await sendConfirmationCode({ email: user.email, username: user.username, code: otp }) - return { status: true } - }), - - confirm: publicProcedure.input( - z.object({ - username: z.string(), - code: z.string(), - }), - ).mutation(async ({ ctx, input }) => { - const user = await prisma.user.findFirst({ - select: { ...defaultUserSelect, email: true, code: true }, - where: { - OR: [{ email: input.username }, { username: input.username, }] - } - }); - - if (!user) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Email or username not found", - }); - } - - if (!compareCodes(input.code, user.code || "")) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "Failed to confirm account, code invalid" - }); - } - - const newUser = await prisma.user.update({ - where: { id: user.id }, - data: { - code: null, - codeGeneratedAt: null, - confirmed: true - } - }) - //@ts-expect-error dynamic - await new Promise((resolve) => ctx.req.login(newUser, () => resolve(null))); - return { status: true } - }), + // askEmailConfirm: publicProcedure.input( + // z.object({ + // email: z.string() + // }), + // ).mutation(async ({ ctx, input }) => { + // const user = await prisma.user.findFirst({ + // select: { ...defaultUserSelect, email: true }, + // where: { + // OR: [{ email: input.email }, { username: input.email, }] + // } + // }); + + // if (!user) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: "Email or username not found", + // }); + // } + // if (!user.email) { + // throw new TRPCError({ + // code: 'NOT_FOUND', + // message: `User account doesn't have email address`, + // }); + // } + + // const otp = generateOtp(); + // await prisma.user.update({ + // where: { id: user.id }, + // data: { + // code: otp, + // codeGeneratedAt: new Date() + // } + // }) + // console.log(" Confirmation code", otp) + + // await sendConfirmationCode({ email: user.email, username: user.username, code: otp }) + // return { status: true } + // }), list: protectedProcedure.query(async () => { // Retrieve users from a datasource, this is an imaginary database @@ -597,11 +551,6 @@ export const userRouter = router({ items: items.reverse(), nextCursor, }; - }), - logout: protectedProcedure - .mutation(async (opts) => { - const { ctx } = opts; - return ctx.logout(); - }), + }) }); diff --git a/packages/trpc/src/trpc.ts b/packages/trpc/src/trpc.ts index e8e96080..9ec999fb 100644 --- a/packages/trpc/src/trpc.ts +++ b/packages/trpc/src/trpc.ts @@ -1,40 +1,25 @@ -import "express-session" -import type { User, UserRole } from '@celluloid/prisma'; import { type inferAsyncReturnType, initTRPC, TRPCError } from '@trpc/server'; import type { CreateExpressContextOptions } from "@trpc/server/adapters/express"; import type { CreateWSSContextFnOptions, } from '@trpc/server/adapters/ws'; -import type { Request, Response } from 'express'; -import type { Session } from "express-session"; import type { OpenApiMeta } from 'trpc-openapi'; - -// export type Context = { -// user: User | null; - -// requirePermissions: (roles: UserRole[]) => boolean; -// logout: () => Promise; -// req: Request; -// res: Response; -// }; - -declare module 'http' { - interface IncomingMessage { - session: Session & { - userId?: string - } - } -} +import { auth } from "@celluloid/auth"; +import { fromNodeHeaders } from "better-auth/node"; export async function createContext(opts: CreateExpressContextOptions | CreateWSSContextFnOptions) { const { req, res } = opts; - const user: User | null = (req as Request).user as User; - const requirePermissions = (roles: UserRole[]) => { - if (!user?.role || !roles.includes(user?.role)) { + const session = await auth.api.getSession({ + headers: fromNodeHeaders(req.headers), + }); + + + const requireRoles = (roles: string[]) => { + if (!session?.user?.role || !roles.includes(session?.user?.role)) { throw new TRPCError({ code: 'UNAUTHORIZED', message: `Missing permission: '${roles.join(",")}'.` @@ -44,22 +29,10 @@ export async function createContext(opts: CreateExpressContextOptions | CreateWS return true; } - const logout = (): Promise => { - return new Promise((resolve) => { - req.session?.destroy((err: Error | null) => { - if (err) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: "Enable to log out" - }) - } - - resolve(true) - }); - }) - } + const user = session?.user; return { - user, requirePermissions, logout, req, + user, requireRoles, + req, res, }; }; diff --git a/packages/types/package.json b/packages/types/package.json index 42dbc247..0bdcaf1c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -9,17 +9,18 @@ "type": "module", "exports": { ".": { - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "default": "./src/index.ts" } }, "scripts": { "build": "tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", "dev": "tsc" }, "devDependencies": { "tsup": "^8.3.0", - "typescript": "^5.6.2", + "typescript": "catalog:", "@celluloid/config": "workspace:*" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 768009ae..a003d82c 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -2,21 +2,28 @@ "name": "@celluloid/utils", "main": "dist/index.js", "version": "3.0.0", + "type": "module", "description": "Common types library for Celluloid client and server", "repository": "http://github.com/celluloid-edu/celluloid", "author": "Younes Benaomar ", "license": "MIT", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./src/index.ts" + } + }, "scripts": { - "build": "tsup", - "dev": "tsup --watch" + "build": "tsc", + "clean": "git clean -xdf .cache .turbo dist node_modules", + "dev": "tsc" }, "devDependencies": { "@celluloid/config": "workspace:*", "@celluloid/types": "workspace:*", "@types/bcryptjs": "^2.4.5", "@types/redis": "^4.0.11", - "tsup": "^8.3.0", - "typescript": "^5.6.2" + "typescript": "catalog:" }, "dependencies": { "@t3-oss/env-core": "^0.7.1", @@ -25,6 +32,6 @@ "pino": "^9.4.0", "redis": "^4.6.10", "unique-slug": "^4.0.0", - "zod": "^3.23.8" + "zod": "catalog:" } } diff --git a/packages/utils/src/env.ts b/packages/utils/src/env.ts deleted file mode 100644 index 6ab922f0..00000000 --- a/packages/utils/src/env.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { createEnv } from "@t3-oss/env-core"; -import { z } from "zod"; - -export function envBoolean(params: { optional: boolean; defaultValue: boolean }) { - type BoolEnum = ['true', 'false']; - let variable: z.ZodCatch> | z.ZodEnum; - - if (params.optional) { - // if undefined assign the defaultValue - variable = z.enum(['true', 'false']).catch(params.defaultValue ? 'true' : 'false'); - } else { - // not optional so "true" or "false" is enforced - variable = z.enum(['true', 'false']); - } - - // convert string to bool - return variable.transform((v) => v === 'true'); -} - -export const env = createEnv({ - server: { - DATABASE_URL: z.string(), - REDIS_URL: z.string().default("redis://localhost"), - - SMTP_HOST: z.string().optional(), - SMTP_PORT: z.coerce.number().optional(), - SMTP_SECURE: envBoolean({ optional: true, defaultValue: false }), - SMTP_EMAIL_FROM: z.string().default("no-reply@celluloid.huma-num.fr"), - - STORAGE_URL: z.string(), - STORAGE_ACCESS_KEY: z.string(), - STORAGE_SECRET_KEY: z.string(), - STORAGE_BUCKET: z.string().default('celluloid'), - - COOKIE_NAME: z.string().optional(), - COOKIE_DOMAIN: z.string().optional(), - COOKIE_SECURE: envBoolean({ optional: true, defaultValue: false }), - COOKIE_SECRET: z.string(), - - - }, - - clientPrefix: 'VITE', - client: { - VITE_COMMIT: z.string().default('dev'), - }, - /** - * What object holds the environment variables at runtime. This is usually - * `process.env` or `import.meta.env`. - */ - runtimeEnv: process.env, - - /** - * By default, this library will feed the environment variables directly to - * the Zod validator. - * - * This means that if you have an empty string for a value that is supposed - * to be a number (e.g. `PORT=` in a ".env" file), Zod will incorrectly flag - * it as a type mismatch violation. Additionally, if you have an empty string - * for a value that is supposed to be a string with a default value (e.g. - * `DOMAIN=` in an ".env" file), the default value will never be applied. - * - * In order to solve these issues, we recommend that all new projects - * explicitly specify this option as true. - */ - emptyStringAsUndefined: true, -}); diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index f5afea58..ed3e0378 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,5 +1,5 @@ export * from "./crypto" -export * from './env' +export * from './zod' export * from "./srt" export * from "./string" export * from "./peertube" diff --git a/packages/utils/src/zod.ts b/packages/utils/src/zod.ts new file mode 100644 index 00000000..047e6d2d --- /dev/null +++ b/packages/utils/src/zod.ts @@ -0,0 +1,17 @@ +import { z } from "zod"; + +export function envBoolean(params: { optional: boolean; defaultValue: boolean }) { + type BoolEnum = ['true', 'false']; + let variable: z.ZodCatch> | z.ZodEnum; + + if (params.optional) { + // if undefined assign the defaultValue + variable = z.enum(['true', 'false']).catch(params.defaultValue ? 'true' : 'false'); + } else { + // not optional so "true" or "false" is enforced + variable = z.enum(['true', 'false']); + } + + // convert string to bool + return variable.transform((v) => v === 'true'); +} diff --git a/packages/utils/tsup.config.ts b/packages/utils/tsup.config.ts deleted file mode 100644 index db41265e..00000000 --- a/packages/utils/tsup.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig } from "tsup"; - -const isProduction = process.env.NODE_ENV === "production"; - -export default defineConfig({ - clean: true, - dts: true, - entry: ["src/index.ts"], - format: ["esm", "cjs"], - minify: isProduction, - sourcemap: true, -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75ac853c..665fadf6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,22 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + typescript: + specifier: ^5.6.3 + version: 5.6.3 + zod: + specifier: ^3.23.8 + version: 3.24.1 + react18: + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0 + importers: .: @@ -26,7 +42,7 @@ importers: devDependencies: '@commitlint/cli': specifier: ^17.7.2 - version: 17.8.1 + version: 17.8.1(@swc/core@1.3.101(@swc/helpers@0.5.13)) '@commitlint/config-conventional': specifier: ^17.7.0 version: 17.8.1 @@ -56,7 +72,7 @@ importers: version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) eslint-plugin-jest: specifier: latest - version: 28.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3) + version: 28.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3) eslint-plugin-prettier: specifier: ^4.2.1 version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) @@ -74,7 +90,7 @@ importers: version: 8.0.3 jest: specifier: ^27.0.1 - version: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + version: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) lint-staged: specifier: ^14.0.1 version: 14.0.1(enquirer@2.3.6) @@ -95,15 +111,15 @@ importers: version: 2.0.8 ts-jest: specifier: ^27.0.1 - version: 27.1.5(@babel/core@7.26.0)(@types/jest@26.0.24)(babel-jest@27.5.1(@babel/core@7.26.0))(jest@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3) + version: 27.1.5(@babel/core@7.26.0)(@types/jest@26.0.24)(babel-jest@27.5.1(@babel/core@7.26.0))(esbuild@0.24.0)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3) tsup: specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) turbo: - specifier: ^2.1.3 - version: 2.2.3 + specifier: ^2.3.3 + version: 2.3.3 typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 wait-port: specifier: ^1.1.0 @@ -112,17 +128,17 @@ importers: apps/frontend: dependencies: '@adminjs/express': - specifier: ^6.1.0 - version: 6.1.0(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(express-formidable@1.2.0)(express-session@1.18.1)(express@4.21.1)(tslib@2.8.1) + specifier: ^6.1.1 + version: 6.1.1(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(express-formidable@1.2.0)(express-session@1.18.1)(express@4.21.2)(tslib@2.8.1) '@adminjs/prisma': specifier: ^5.0.3 - version: 5.0.3(@prisma/client@5.22.0(prisma@5.22.0))(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13)) + version: 5.0.3(@prisma/client@6.0.1(prisma@6.0.1))(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13)) '@adminjs/themes': specifier: ^1.0.1 - version: 1.0.1(@types/babel__core@7.20.5)(@types/node@16.18.119)(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(tslib@2.8.1) - '@celluloid/passport': + version: 1.0.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(@types/node@16.18.119)(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(tslib@2.8.1) + '@celluloid/auth': specifier: workspace:* - version: link:../../packages/passport + version: link:../../packages/auth '@celluloid/prisma': specifier: workspace:* version: link:../../packages/prisma @@ -131,7 +147,7 @@ importers: version: link:../../packages/queue '@celluloid/react-player': specifier: 2.14.0 - version: 2.14.0(react@18.3.1) + version: 2.14.0(react@18.2.0) '@celluloid/trpc': specifier: workspace:* version: link:../../packages/trpc @@ -143,34 +159,37 @@ importers: version: link:../../packages/utils '@cutting/use-get-parent-size': specifier: ^2.1.4 - version: 2.1.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(resize-observer-polyfill@1.5.1)(use-debounce@10.0.4(react@18.3.1)) + version: 2.1.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(resize-observer-polyfill@1.5.1)(use-debounce@10.0.4(react@18.2.0)) '@emotion/react': specifier: ^11.11.1 - version: 11.13.3(@types/react@18.3.12)(react@18.3.1) + version: 11.13.3(@types/react@18.3.12)(react@18.2.0) '@emotion/styled': specifier: ^11.11.0 - version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@mui': specifier: link:@mui version: link:@mui '@mui/icons-material': specifier: ^6.1.2 - version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + version: 6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@mui/lab': specifier: ^5.0.0-alpha.153 - version: 5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/material': specifier: ^6.1.2 - version: 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/styles': specifier: ^6.1.2 - version: 6.1.6(@types/react@18.3.12)(react@18.3.1) + version: 6.1.6(@types/react@18.3.12)(react@18.2.0) + '@t3-oss/env-core': + specifier: ^0.11.1 + version: 0.11.1(typescript@5.6.3)(zod@3.24.1) '@tanstack/react-query': specifier: ^4.36.1 - version: 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/react-query-devtools': specifier: ^5.4.2 - version: 5.59.19(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 5.59.19(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) '@tiptap/extension-text-style': specifier: ^2.9.1 version: 2.9.1(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) @@ -179,7 +198,7 @@ importers: version: 10.45.2(@trpc/server@10.45.2) '@trpc/react-query': specifier: ^10.45.2 - version: 10.45.2(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@trpc/server': specifier: ^10.45.2 version: 10.45.2 @@ -188,10 +207,13 @@ importers: version: 3.1.1 '@uidotdev/usehooks': specifier: ^2.4.1 - version: 2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) adminjs: specifier: ^7.8.13 version: 7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13) + better-auth: + specifier: ^1.0.21 + version: 1.0.21(encoding@0.1.13) change-case: specifier: ^4.1.2 version: 4.1.2 @@ -212,19 +234,16 @@ importers: version: 3.11.0 express: specifier: ^4.21.1 - version: 4.21.1 + version: 4.21.2 express-formidable: specifier: ^1.2.0 version: 1.2.0 - express-session: - specifier: ^1.18.1 - version: 1.18.1 file-saver: specifier: ^2.0.5 version: 2.0.5 formik: specifier: ^2.2.9 - version: 2.4.6(react@18.3.1) + version: 2.4.6(react@18.2.0) get-urls: specifier: ^11.0.0 version: 11.0.0 @@ -242,25 +261,19 @@ importers: version: 4.17.21 material-ui-confirm: specifier: ^3.0.9 - version: 3.0.16(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.0.16(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) material-ui-pickers: specifier: ^2.2.4 - version: 2.2.4(@material-ui/core@3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.2.4(@material-ui/core@3.9.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) moment-duration-format: specifier: ^2.2.2 version: 2.3.2 mui-image: specifier: ^1.0.7 - version: 1.0.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prop-types@15.8.1)(react@18.3.1) + version: 1.0.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prop-types@15.8.1)(react@18.2.0) notistack: specifier: ^3.0.1 - version: 3.0.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - passport: - specifier: ^0.6.0 - version: 0.6.0 - passport-local: - specifier: ^1.0.0 - version: 1.0.0 + version: 3.0.1(csstype@3.1.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) query-string: specifier: ^6.1.0 version: 6.14.1 @@ -271,55 +284,55 @@ importers: specifier: ^0.5.3 version: 0.5.4 react: - specifier: 18.3.1 - version: 18.3.1 + specifier: catalog:react18 + version: 18.2.0 react-dom: - specifier: 18.3.1 - version: 18.3.1(react@18.3.1) + specifier: catalog:react18 + version: 18.2.0(react@18.2.0) react-draggable: specifier: ^4.4.6 - version: 4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-error-boundary: specifier: ^4.0.11 - version: 4.1.2(react@18.3.1) + version: 4.1.2(react@18.2.0) react-i18next: specifier: ^13.2.2 - version: 13.5.0(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 13.5.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-router: specifier: ^6.17.0 - version: 6.27.0(react@18.3.1) + version: 6.27.0(react@18.2.0) react-router-dom: specifier: ^6.26.2 - version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3))(type-fest@2.19.0)(typescript@5.6.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0))(esbuild@0.24.0)(eslint@8.57.1)(react@18.2.0)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3))(type-fest@2.19.0)(typescript@5.6.3) react-transition-group: specifier: ^2.3.1 - version: 2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-use-event: specifier: ^1.1.1 - version: 1.1.1(react@18.3.1) + version: 1.1.1(react@18.2.0) recoil: specifier: ^0.7.7 - version: 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.7.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) resize-observer-polyfill: specifier: ^1.5.1 version: 1.5.1 rooks: specifier: ^7.4.1 - version: 7.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 7.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) serve: specifier: ^14.2.1 version: 14.2.4 shiitake: specifier: ^3.0.2 - version: 3.0.2(react@18.3.1) + version: 3.0.2(react@18.2.0) tsx: specifier: ^4.19.1 version: 4.19.2 typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 vite-express: specifier: ^0.19.0 @@ -339,7 +352,7 @@ importers: version: 5.17.0 '@testing-library/react': specifier: ^13.4.0 - version: 13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 13.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': specifier: ^13.5.0 version: 13.5.0(@testing-library/dom@8.20.1) @@ -355,9 +368,6 @@ importers: '@types/express-formidable': specifier: ^1 version: 1.2.3 - '@types/express-session': - specifier: ^1 - version: 1.18.0 '@types/file-saver': specifier: ^2.0.5 version: 2.0.7 @@ -427,6 +437,9 @@ importers: eslint-plugin-react-refresh: specifier: ^0.3.5 version: 0.3.5(eslint@8.57.1) + nodemon: + specifier: ^3.1.9 + version: 3.1.9 vite: specifier: ^4.5.5 version: 4.5.5(@types/node@16.18.119)(terser@5.36.0) @@ -434,51 +447,35 @@ importers: specifier: ^0.11.7 version: 0.11.7(vite@4.5.5(@types/node@16.18.119)(terser@5.36.0)) - packages/config: - dependencies: - eslint-config-prettier: - specifier: ^8.3.0 - version: 8.10.0(eslint@8.57.1) - eslint-config-turbo: - specifier: latest - version: 2.2.3(eslint@8.57.1) - eslint-plugin-react: - specifier: 7.33.2 - version: 7.33.2(eslint@8.57.1) - devDependencies: - typescript: - specifier: ^5.6.2 - version: 5.6.3 - - packages/passport: + packages/auth: dependencies: '@celluloid/prisma': specifier: workspace:* version: link:../prisma + '@celluloid/queue': + specifier: workspace:* + version: link:../queue '@celluloid/utils': specifier: workspace:* version: link:../utils + '@prisma/client': + specifier: ^5.22.0 + version: 5.22.0(prisma@6.0.1) + '@t3-oss/env-core': + specifier: ^0.11.1 + version: 0.11.1(typescript@5.6.3)(zod@3.24.1) bcryptjs: specifier: ^2.4.3 version: 2.4.3 - connect-redis: - specifier: ^7.1.0 - version: 7.1.1(express-session@1.18.1) + better-auth: + specifier: ^1.0.21 + version: 1.0.21(encoding@0.1.13) express: - specifier: ^4.19.2 - version: 4.21.1 - express-session: - specifier: ^1.17.3 - version: 1.18.1 - passport: - specifier: ^0.6.0 - version: 0.6.0 - passport-local: - specifier: ^1.0.0 - version: 1.0.0 - redis: - specifier: ^4.6.10 - version: 4.7.0 + specifier: ^4.21.2 + version: 4.21.2 + zod: + specifier: 'catalog:' + version: 3.24.1 devDependencies: '@celluloid/config': specifier: workspace:* @@ -489,30 +486,53 @@ importers: '@types/express': specifier: ^5.0.0 version: 5.0.0 - '@types/express-session': - specifier: ^1.17.8 - version: 1.18.0 '@types/node': specifier: ^18.14.2 version: 18.19.64 - '@types/passport': - specifier: ^1.0.14 - version: 1.0.17 - '@types/passport-local': - specifier: ^1.0.37 - version: 1.0.38 tsup: specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + typescript: + specifier: 'catalog:' + version: 5.6.3 + + packages/config: + dependencies: + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.57.1) + eslint-config-turbo: + specifier: latest + version: 2.3.3(eslint@8.57.1) + eslint-plugin-react: + specifier: 7.33.2 + version: 7.33.2(eslint@8.57.1) + devDependencies: + typescript: + specifier: 'catalog:' + version: 5.6.3 + + packages/emails: + dependencies: + '@react-email/components': + specifier: 0.0.31 + version: 0.0.31(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-email: + specifier: 3.0.4 + version: 3.0.4(@playwright/test@1.48.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + devDependencies: + '@celluloid/config': + specifier: workspace:* + version: link:../config typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages/prisma: dependencies: '@prisma/client': - specifier: ^5.22.0 - version: 5.22.0(prisma@5.22.0) + specifier: ^6.0.1 + version: 6.0.1(prisma@6.0.1) randomcolor: specifier: ^0.6.2 version: 0.6.2 @@ -520,8 +540,8 @@ importers: specifier: ^4.19.1 version: 4.19.2 zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: 'catalog:' + version: 3.24.1 devDependencies: '@celluloid/config': specifier: workspace:* @@ -545,16 +565,16 @@ importers: specifier: ^8.50.0 version: 8.57.1 prisma: - specifier: ^5.22.0 - version: 5.22.0 + specifier: ^6.0.1 + version: 6.0.1 rimraf: specifier: ^5.0.1 version: 5.0.10 tsup: specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages/queue: @@ -562,6 +582,9 @@ importers: '@celluloid/config': specifier: workspace:* version: link:../config + '@celluloid/emails': + specifier: workspace:* + version: link:../emails '@celluloid/prisma': specifier: workspace:* version: link:../prisma @@ -573,35 +596,41 @@ importers: version: link:../utils '@mgcrea/prisma-queue': specifier: ^1.11.1 - version: 1.12.0(@prisma/client@5.22.0(prisma@5.22.0)) + version: 1.12.0(@prisma/client@6.0.1(prisma@6.0.1)) + '@react-email/components': + specifier: 0.0.31 + version: 0.0.31(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@t3-oss/env-core': specifier: ^0.11.1 - version: 0.11.1(typescript@5.6.3)(zod@3.23.8) + version: 0.11.1(typescript@5.6.3)(zod@3.24.1) fluent-ffmpeg: specifier: ^2.1.3 version: 2.1.3 minio: specifier: ^7.1.3 version: 7.1.4 + nodemailer: + specifier: ^6.9.9 + version: 6.9.16 zod: specifier: ^3.23.8 - version: 3.23.8 + version: 3.24.1 + zx: + specifier: ^8.2.4 + version: 8.2.4 devDependencies: '@types/fluent-ffmpeg': specifier: ^2 version: 2.1.27 - tsup: - specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages/trpc: dependencies: - '@celluloid/passport': + '@celluloid/auth': specifier: workspace:* - version: link:../passport + version: link:../auth '@celluloid/prisma': specifier: workspace:* version: link:../prisma @@ -613,13 +642,16 @@ importers: version: link:../utils '@t3-oss/env-core': specifier: ^0.11.1 - version: 0.11.1(typescript@5.6.3)(zod@3.23.8) + version: 0.11.1(typescript@5.6.3)(zod@3.24.1) '@trpc/server': specifier: ^10.45.2 version: 10.45.2 bcryptjs: specifier: ^2.4.3 version: 2.4.3 + better-auth: + specifier: ^1.0.3 + version: 1.0.21(encoding@0.1.13) change-case: specifier: ^4.1.2 version: 4.1.2 @@ -628,10 +660,7 @@ importers: version: 16.4.5 express: specifier: ^4.19.2 - version: 4.21.1 - express-session: - specifier: ^1.17.3 - version: 1.18.1 + version: 4.21.2 js2xmlparser: specifier: ^5.0.0 version: 5.0.0 @@ -641,21 +670,12 @@ importers: minio: specifier: ^7.1.3 version: 7.1.4 - mjml: - specifier: ^4.14.1 - version: 4.15.3(encoding@0.1.13) - nodemailer: - specifier: ^6.9.9 - version: 6.9.16 - nodemailer-smtp-transport: - specifier: ^2.7.4 - version: 2.7.4 papaparse: specifier: ^5.4.1 version: 5.4.1 trpc-openapi: specifier: ^1.2.0 - version: 1.2.0(@trpc/server@10.45.2)(@types/express@5.0.0)(@types/node@20.5.1)(zod@3.23.8) + version: 1.2.0(@trpc/server@10.45.2)(@types/express@5.0.0)(@types/node@20.5.1)(zod@3.24.1) uuid: specifier: ^9.0.1 version: 9.0.1 @@ -663,8 +683,8 @@ importers: specifier: ^8.18.0 version: 8.18.0 zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: 'catalog:' + version: 3.24.1 devDependencies: '@celluloid/config': specifier: workspace:* @@ -672,9 +692,6 @@ importers: '@types/express': specifier: ^5.0.0 version: 5.0.0 - '@types/express-session': - specifier: ^1.17.8 - version: 1.18.0 '@types/mjml': specifier: ^4.7.3 version: 4.7.4 @@ -689,9 +706,9 @@ importers: version: 9.0.8 tsup: specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages/types: @@ -701,16 +718,16 @@ importers: version: link:../config tsup: specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages/utils: dependencies: '@t3-oss/env-core': specifier: ^0.7.1 - version: 0.7.3(typescript@5.6.3)(zod@3.23.8) + version: 0.7.3(typescript@5.6.3)(zod@3.24.1) bcryptjs: specifier: ^2.4.3 version: 2.4.3 @@ -727,8 +744,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 zod: - specifier: ^3.23.8 - version: 3.23.8 + specifier: 'catalog:' + version: 3.24.1 devDependencies: '@celluloid/config': specifier: workspace:* @@ -742,11 +759,8 @@ importers: '@types/redis': specifier: ^4.0.11 version: 4.0.11 - tsup: - specifier: ^8.3.0 - version: 8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: - specifier: ^5.6.2 + specifier: 'catalog:' version: 5.6.3 packages: @@ -757,8 +771,8 @@ packages: react: ^18.1.0 react-dom: ^18.1.0 - '@adminjs/express@6.1.0': - resolution: {integrity: sha512-B3yoWGSp8xeqS/geBIKoSnMx46tbYYrbb/EmKD0SqqlVfxtBwgyoTWa6pkxqRc2T4iTMOl84VkMT0axnooAmZA==} + '@adminjs/express@6.1.1': + resolution: {integrity: sha512-Th8Oe9lFkHkfmJb6hUe08zwwZOt5afZ2RRMbMZ1Bq7pzEFnJGnTl8jglYNKdc9Fmxtvbabug0wteQ6qCMZuaVQ==} peerDependencies: adminjs: ^7.4.0 express: '>=4.18.2' @@ -810,6 +824,10 @@ packages: resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} @@ -916,6 +934,11 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.26.2': resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} @@ -1528,6 +1551,9 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@better-fetch/fetch@1.1.12': + resolution: {integrity: sha512-B3bfloI/2UBQWIATRN6qmlORrvx3Mp0kkNjmXLv0b+DtbtR+pP4/I5kQA/rDUv+OReLywCCldf6co4LdDmh8JA==} + '@celluloid/react-player@2.14.0': resolution: {integrity: sha512-f+VTDC8MozDgPI+y2MvDn+FnEW2yX+brURdpMvjzLSA8D2OO5xV5JNGwFj/b2rzfdEZUcXxcSSxHogiyF9AIpg==} peerDependencies: @@ -1710,6 +1736,15 @@ packages: resize-observer-polyfill: '>= ^1.5.x' use-debounce: '>= 10.0.1' + '@emnapi/core@0.45.0': + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + + '@emnapi/runtime@0.45.0': + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emotion/babel-plugin@11.12.0': resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} @@ -1770,6 +1805,12 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} @@ -1788,6 +1829,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} @@ -1806,6 +1853,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} @@ -1824,6 +1877,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} @@ -1842,6 +1901,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} @@ -1860,6 +1925,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} @@ -1878,6 +1949,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} @@ -1896,6 +1973,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} @@ -1914,6 +1997,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} @@ -1932,6 +2021,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} @@ -1950,6 +2045,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} @@ -1968,6 +2069,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} @@ -1986,6 +2093,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} @@ -2004,6 +2117,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} @@ -2022,6 +2141,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} @@ -2040,6 +2165,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} @@ -2058,6 +2189,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} @@ -2076,6 +2213,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -2106,6 +2249,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} @@ -2124,6 +2273,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} @@ -2142,6 +2297,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} @@ -2160,6 +2321,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} @@ -2178,6 +2345,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -2238,6 +2411,9 @@ packages: react: ^16.8.5 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + '@hexagon/base64@1.1.28': + resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -2257,6 +2433,111 @@ packages: prop-types: ^15.0.0 react: '>=0.14.0' + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2370,6 +2651,9 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@levischuck/tiny-cbor@0.2.2': + resolution: {integrity: sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==} + '@material-ui/core@3.9.4': resolution: {integrity: sha512-r8QFLSexcYZbnqy/Hn4v8xzmAJV41yaodUVjmbGLi1iGDLG3+W941hEtEiBmxTRRqv2BdK3r4ijILcqKmDv/Sw==} engines: {node: '>=6.0.0'} @@ -2578,23 +2862,255 @@ packages: '@types/react': optional: true - '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': - resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + '@next/env@15.0.4': + resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@next/swc-darwin-arm64@15.0.4': + resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@next/swc-darwin-x64@15.0.4': + resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@next/swc-linux-arm64-gnu@15.0.4': + resolution: {integrity: sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@next/swc-linux-arm64-musl@15.0.4': + resolution: {integrity: sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.0.4': + resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.0.4': + resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.0.4': + resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.0.4': + resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@noble/ciphers@0.6.0': + resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + + '@node-rs/argon2-android-arm-eabi@1.7.0': + resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/argon2-android-arm64@1.7.0': + resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/argon2-darwin-arm64@1.7.0': + resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/argon2-darwin-x64@1.7.0': + resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/argon2-freebsd-x64@1.7.0': + resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/argon2-linux-arm64-musl@1.7.0': + resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/argon2-linux-x64-gnu@1.7.0': + resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-linux-x64-musl@1.7.0': + resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/argon2-wasm32-wasi@1.7.0': + resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/argon2-win32-x64-msvc@1.7.0': + resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/argon2@1.7.0': + resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} + engines: {node: '>= 10'} + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/bcrypt-android-arm64@1.9.0': + resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/bcrypt-darwin-x64@1.9.0': + resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/bcrypt@1.9.0': + resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} + engines: {node: '>= 10'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@npmcli/agent@2.2.2': resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} @@ -2604,8 +3120,20 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@peculiar/asn1-android@2.3.13': + resolution: {integrity: sha512-0VTNazDGKrLS6a3BwTDZanqq6DR/I3SbvmDMuS8Be+OYpvM6x1SRDh9AGDsHVnaCOIztOspCPc6N1m+iUv1Xxw==} + + '@peculiar/asn1-ecc@2.3.14': + resolution: {integrity: sha512-zWPyI7QZto6rnLv6zPniTqbGaLh6zBpJyI46r1yS/bVHJXT2amdMHCRRnbV5yst2H8+ppXG6uXu/M6lKakiQ8w==} + + '@peculiar/asn1-rsa@2.3.13': + resolution: {integrity: sha512-wBNQqCyRtmqvXkGkL4DR3WxZhHy8fDiYtOjTeCd7SFE5F6GBeafw3EJ94PX/V0OJJrjQ40SkRY2IZu3ZSyBqcg==} + + '@peculiar/asn1-schema@2.3.13': + resolution: {integrity: sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==} + + '@peculiar/asn1-x509@2.3.13': + resolution: {integrity: sha512-PfeLQl2skXmxX2/AFFCVaWU8U6FKW1Db43mgBhShCOFS1bVxqtvusq1hVjfuEcuSQGedrLdCSvTgabluwN/M9A==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -2668,20 +3196,154 @@ packages: prisma: optional: true - '@prisma/debug@5.22.0': - resolution: {integrity: sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==} + '@prisma/client@6.0.1': + resolution: {integrity: sha512-60w7kL6bUxz7M6Gs/V+OWMhwy94FshpngVmOY05TmGD0Lhk+Ac0ZgtjlL6Wll9TD4G03t4Sq1wZekNVy+Xdlbg==} + engines: {node: '>=18.18'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + + '@prisma/debug@6.0.1': + resolution: {integrity: sha512-jQylgSOf7ibTVxqBacnAlVGvek6fQxJIYCQOeX2KexsfypNzXjJQSS2o5s+Mjj2Np93iSOQUaw6TvPj8syhG4w==} + + '@prisma/engines-version@5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e': + resolution: {integrity: sha512-JmIds0Q2/vsOmnuTJYxY4LE+sajqjYKhLtdOT6y4imojqv5d/aeVEfbBGC74t8Be1uSp0OP8lxIj2OqoKbLsfQ==} - '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': - resolution: {integrity: sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==} + '@prisma/engines@6.0.1': + resolution: {integrity: sha512-4hxzI+YQIR2uuDyVsDooFZGu5AtixbvM2psp+iayDZ4hRrAHo/YwgA17N23UWq7G6gRu18NvuNMb48qjP3DPQw==} - '@prisma/engines@5.22.0': - resolution: {integrity: sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==} + '@prisma/fetch-engine@6.0.1': + resolution: {integrity: sha512-T36bWFVGeGYYSyYOj9d+O9G3sBC+pAyMC+jc45iSL63/Haq1GrYjQPgPMxrEj9m739taXrupoysRedQ+VyvM/Q==} - '@prisma/fetch-engine@5.22.0': - resolution: {integrity: sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==} + '@prisma/get-platform@6.0.1': + resolution: {integrity: sha512-zspC9vlxAqx4E6epMPMLLBMED2VD8axDe8sPnquZ8GOsn6tiacWK0oxrGK4UAHYzYUVuMVUApJbdXB2dFpLhvg==} - '@prisma/get-platform@5.22.0': - resolution: {integrity: sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==} + '@react-email/body@0.0.11': + resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/button@0.0.19': + resolution: {integrity: sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-block@0.0.11': + resolution: {integrity: sha512-4D43p+LIMjDzm66gTDrZch0Flkip5je91mAT7iGs6+SbPyalHgIA+lFQoQwhz/VzHHLxuD0LV6gwmU/WUQ2WEg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-inline@0.0.5': + resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/column@0.0.13': + resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/components@0.0.31': + resolution: {integrity: sha512-rQsTY9ajobncix9raexhBjC7O6cXUMc87eNez2gnB1FwtkUO8DqWZcktbtwOJi7GKmuAPTx0o/IOFtiBNXziKA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/container@0.0.15': + resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/font@0.0.9': + resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/head@0.0.12': + resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/heading@0.0.15': + resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/hr@0.0.11': + resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/html@0.0.11': + resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/img@0.0.11': + resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/link@0.0.12': + resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/markdown@0.0.14': + resolution: {integrity: sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview@0.0.12': + resolution: {integrity: sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/render@1.0.3': + resolution: {integrity: sha512-VQ8g4SuIq/jWdfBTdTjb7B8Np0jj+OoD7VebfdHhLTZzVQKesR2aigpYqE/ZXmwj4juVxDm8T2b6WIIu48rPCg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/row@0.0.12': + resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/section@0.0.16': + resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/tailwind@1.0.4': + resolution: {integrity: sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/text@0.0.11': + resolution: {integrity: sha512-a7nl/2KLpRHOYx75YbYZpWspUbX1DFY7JIZbOv5x0QU8SvwDbJt+Hm01vG34PffFyYvHEXrc6Qnip2RTjljNjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc '@redis/bloom@1.2.0': resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} @@ -2955,6 +3617,9 @@ packages: '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -2964,6 +3629,16 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + '@simplewebauthn/browser@10.0.0': + resolution: {integrity: sha512-hG0JMZD+LiLUbpQcAjS4d+t4gbprE/dLYop/CkE01ugU/9sKXflxV5s0DRjdz3uNMFecatRfb4ZLG3XvF8m5zg==} + + '@simplewebauthn/server@10.0.1': + resolution: {integrity: sha512-djNWcRn+H+6zvihBFJSpG3fzb0NQS9c/Mw5dYOtZ9H+oDw8qn9Htqxt4cpqRvSOAfwqP7rOvE9rwqVaoGGc3hg==} + engines: {node: '>=20.0.0'} + + '@simplewebauthn/types@10.0.0': + resolution: {integrity: sha512-SFXke7xkgPRowY2E+8djKbdEznTVnD5R6GO7GPTthpHrokLvNKw8C3lFZypTxLI7KkCfGPfhtqB3d7OVGGa9jQ==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -2973,6 +3648,9 @@ packages: '@sinonjs/fake-timers@8.1.0': resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@styled-system/background@5.1.2': resolution: {integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==} @@ -3071,6 +3749,84 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} + '@swc/core-darwin-arm64@1.3.101': + resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.3.101': + resolution: {integrity: sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.3.101': + resolution: {integrity: sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.3.101': + resolution: {integrity: sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.3.101': + resolution: {integrity: sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.3.101': + resolution: {integrity: sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.3.101': + resolution: {integrity: sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.3.101': + resolution: {integrity: sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.3.101': + resolution: {integrity: sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.3.101': + resolution: {integrity: sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.3.101': + resolution: {integrity: sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@t3-oss/env-core@0.11.1': resolution: {integrity: sha512-MaxOwEoG1ntCFoKJsS7nqwgcxLW1SJw238AJwfJeaz3P/8GtkxXZsPPolsz1AdYvUTbe3XvqZ/VCdfjt+3zmKw==} peerDependencies: @@ -3359,6 +4115,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tybys/wasm-util@0.8.3': + resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -3392,6 +4151,9 @@ packages: '@types/cookie-parser@1.4.7': resolution: {integrity: sha512-Fvuyi354Z+uayxzIGCwYTayFKocfV7TuDYZClCdIP9ckhvAu/ixDtCB6qx2TT0FKjPLf1f3P/J1rgf6lPs64mw==} + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} @@ -3422,9 +4184,6 @@ packages: '@types/express-serve-static-core@5.0.1': resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} - '@types/express-session@1.18.0': - resolution: {integrity: sha512-27JdDRgor6PoYlURY+Y5kCakqp5ulC0kmf7y+QwaY+hv9jEFuQOThgkjyA53RP3jmKuBsH5GR6qEfFmvb8mwOA==} - '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -3440,6 +4199,9 @@ packages: '@types/formidable@3.4.5': resolution: {integrity: sha512-s7YPsNVfnsng5L8sKnG/Gbb2tiwwJTY1conOkJzTMRvJAlLFW1nEua+ADsJQu8N1c0oTHx9+d5nqg10WuT9gHQ==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/get-urls@9.1.3': resolution: {integrity: sha512-mpCCghImYRH5HYQFPNVDmKP+8+JAeh8D86TAPj/PPjfrsablT6W/C2oUrJxjzpwX9GWbDmksXUXVJ73rsl1YDQ==} deprecated: This is a stub types definition. get-urls provides its own type definitions, so you do not need this installed. @@ -3495,6 +4257,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/jss@9.5.8': resolution: {integrity: sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA==} @@ -3559,15 +4324,6 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/passport-local@1.0.38': - resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} - - '@types/passport-strategy@0.2.38': - resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} - - '@types/passport@1.0.17': - resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==} - '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} @@ -3657,6 +4413,9 @@ packages: '@types/webpack-env@1.18.5': resolution: {integrity: sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==} + '@types/webpack@5.28.5': + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -4074,6 +4833,10 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1js@3.0.5: + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -4196,6 +4959,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} @@ -4206,6 +4973,12 @@ packages: bcryptjs@2.4.3: resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + better-auth@1.0.21: + resolution: {integrity: sha512-9cEWJM/J2duAJLeuJUaOo4zIbElJGyzJUqGtQ2eGlBTKUYmLNcHNVpVn0oiCiH/gKeg+ls3nUU0tCVnHFpDW1A==} + + better-call@0.3.3-beta.4: + resolution: {integrity: sha512-txigUTFsjOlE4dfkfhDhu6Gk0I1Xo3S4Nye+nfMKJXknb+WsymcWtqoRUSUGdhOMumM3LT9R3QttTUxwny9lWQ==} + bfj@7.1.0: resolution: {integrity: sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==} engines: {node: '>= 8.0.0'} @@ -4217,6 +4990,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} @@ -4286,6 +5062,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -4299,6 +5078,10 @@ packages: peerDependencies: esbuild: '>=0.18' + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -4323,9 +5106,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} @@ -4420,10 +5200,6 @@ packages: resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} engines: {node: '>=18.17'} - cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -4450,10 +5226,6 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - clean-css@5.3.3: resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} @@ -4466,6 +5238,10 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4482,6 +5258,9 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clipboardy@3.0.0: resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4541,6 +5320,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -4559,6 +5345,10 @@ packages: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@2.15.1: resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} @@ -4617,9 +5407,6 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} @@ -4627,12 +5414,6 @@ packages: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} - connect-redis@7.1.1: - resolution: {integrity: sha512-M+z7alnCJiuzKa8/1qAYdGUXHYfDnLolOGAUjOioB07pP39qxjG+X9ibsud7qUBc4jMV5Mcy3ugGv8eFcgamJQ==} - engines: {node: '>=16'} - peerDependencies: - express-session: '>=1' - consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -4969,6 +5750,10 @@ packages: debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -5003,6 +5788,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -5089,6 +5883,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -5170,10 +5968,6 @@ packages: engines: {node: '>=8'} deprecated: Use your platform's native DOMException instead - domhandler@3.3.0: - resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} - engines: {node: '>= 4'} - domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -5227,11 +6021,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -5275,6 +6064,14 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.2: + resolution: {integrity: sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -5354,6 +6151,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -5420,8 +6222,8 @@ packages: eslint-config-react@1.1.7: resolution: {integrity: sha512-P4Z6u68wf0BvIvZNu+U8uQsk3DcZ1CcCI1XpUkJlG6vOa+iVcSQLgE01f2DB2kXlKRcT8/3dsH+wveLgvEgbkQ==} - eslint-config-turbo@2.2.3: - resolution: {integrity: sha512-/zwNU+G2w0HszXzWILdl6/Catt86ejUG7vsFSdpnFzFAAUbbT2TxgoCFvC1fKtm6+SkQsXwkRRe9tFz0aMftpg==} + eslint-config-turbo@2.3.3: + resolution: {integrity: sha512-cM9wSBYowQIrjx2MPCzFE6jTnG4vpTPJKZ/O+Ps3CqrmGK/wtNOsY6WHGMwLtKY/nNbgRahAJH6jGVF6k2coOg==} peerDependencies: eslint: '>6.6.0' @@ -5538,8 +6340,8 @@ packages: peerDependencies: eslint: ^7.5.0 || ^8.0.0 - eslint-plugin-turbo@2.2.3: - resolution: {integrity: sha512-LHt35VwxthdGVO6hQRfvmFb6ee8/exAzAYWCy4o87Bnp7urltP8qg7xMd4dPSLAhtfnI2xSo1WgeVaR3MeItxw==} + eslint-plugin-turbo@2.3.3: + resolution: {integrity: sha512-j8UEA0Z+NNCsjZep9G5u5soDQHcXq/x4amrwulk6eHF1U91H2qAjp5I4jQcvJewmccCJbVp734PkHHTRnosjpg==} peerDependencies: eslint: '>6.6.0' @@ -5672,13 +6474,16 @@ packages: express-static-gzip@2.1.8: resolution: {integrity: sha512-g8tiJuI9Y9Ffy59ehVXvqb0hhP83JwZiLxzanobPaMbkB5qBWA8nuVgd+rcd5qzH3GkgogTALlc0BaADYwnMbQ==} - express@4.21.1: - resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} extrareqp2@1.0.0: resolution: {integrity: sha512-Gum0g1QYb6wpPJCVypWP3bbIuaibcFiJcpuPM10YSXp/tzqi84x9PJageob+eN4xVRIOto4wjSGNLyMD54D2xA==} + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5982,6 +6787,11 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -6150,11 +6960,6 @@ packages: engines: {node: '>=12'} hasBin: true - html-minifier@4.0.0: - resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} - engines: {node: '>=6'} - hasBin: true - html-parse-stringify@3.0.1: resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} @@ -6162,6 +6967,10 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + html-webpack-plugin@5.6.3: resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} engines: {node: '>=10.13.0'} @@ -6174,9 +6983,6 @@ packages: webpack: optional: true - htmlparser2@5.0.1: - resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} - htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -6224,14 +7030,6 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} - httpntlm@1.6.1: - resolution: {integrity: sha512-Tcz3Ct9efvNqw3QdTl3h6IgRRlIQxwKkJELN/aAIGnzi2xvb3pDHdnMs8BrxWLV6OoT4DlVyhzSVhFt/tk0lIw==} - engines: {node: '>=0.8.0'} - - httpreq@1.1.1: - resolution: {integrity: sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==} - engines: {node: '>= 6.15.1'} - https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6292,6 +7090,9 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -6377,6 +7178,9 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -6443,6 +7247,10 @@ packages: is-in-browser@1.1.3: resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} @@ -6557,6 +7365,10 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -6620,6 +7432,10 @@ packages: resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} engines: {node: '>= 0.4'} + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -6811,19 +7627,13 @@ packages: joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true - - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - js-git@0.7.8: resolution: {integrity: sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA==} @@ -6964,11 +7774,6 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - juice@10.0.1: - resolution: {integrity: sha512-ZhJT1soxJCkOiO55/mz8yeBKTAJhRzX9WBO+16ZTqNTONnnVlUPyVBIzQ7lDRjaBdTbid+bAnyIon/GM3yp4cA==} - engines: {node: '>=10.0.0'} - hasBin: true - jw-paginate@1.0.4: resolution: {integrity: sha512-W0bv782exgCoynUL/egbRpaYwf/r6T6e02H870H5u3hfSgEYrxgz5POwmFF5aApS6iPi6yhZ0VF8IbafNFsntA==} @@ -6987,6 +7792,10 @@ packages: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} + kysely@0.27.4: + resolution: {integrity: sha512-dyNKv2KRvYOQPLCAOCjjQuCk4YFd33BvGdf/o5bC7FiW+BB6snA81Zt+2wT9QDFzKqxKa5rrOmvlK/anehCcgA==} + engines: {node: '>=14.0.0'} + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -7005,6 +7814,9 @@ packages: resolution: {integrity: sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA==} engines: {node: '>=0.2.0'} + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -7150,6 +7962,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + log-symbols@5.1.0: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} @@ -7162,9 +7978,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -7233,6 +8046,11 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + material-ui-confirm@3.0.16: resolution: {integrity: sha512-aJoa/FM/U/86qztoljlk8FWmjSJbAMzDWCdWbDqU5WwB0WzcWPyGrhBvIqihR9uKdHKBf1YrvMjn68uOrfsXAg==} peerDependencies: @@ -7249,6 +8067,11 @@ packages: react: ^16.3.0 react-dom: ^16.3.0 + md-to-react-email@5.0.5: + resolution: {integrity: sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==} + peerDependencies: + react: ^18.0 || ^19.0 + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -7262,6 +8085,9 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + memfs-browser@3.5.10302: + resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} + memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -7272,9 +8098,6 @@ packages: memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - mensch@0.3.4: - resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - meow@8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} @@ -7326,11 +8149,6 @@ packages: engines: {node: '>=4'} hasBin: true - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} @@ -7368,10 +8186,6 @@ packages: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -7428,105 +8242,6 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - mjml-accordion@4.15.3: - resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} - - mjml-body@4.15.3: - resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} - - mjml-button@4.15.3: - resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} - - mjml-carousel@4.15.3: - resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} - - mjml-cli@4.15.3: - resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} - hasBin: true - - mjml-column@4.15.3: - resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} - - mjml-core@4.15.3: - resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} - - mjml-divider@4.15.3: - resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} - - mjml-group@4.15.3: - resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} - - mjml-head-attributes@4.15.3: - resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} - - mjml-head-breakpoint@4.15.3: - resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} - - mjml-head-font@4.15.3: - resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} - - mjml-head-html-attributes@4.15.3: - resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} - - mjml-head-preview@4.15.3: - resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} - - mjml-head-style@4.15.3: - resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} - - mjml-head-title@4.15.3: - resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} - - mjml-head@4.15.3: - resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} - - mjml-hero@4.15.3: - resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} - - mjml-image@4.15.3: - resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} - - mjml-migrate@4.15.3: - resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} - hasBin: true - - mjml-navbar@4.15.3: - resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} - - mjml-parser-xml@4.15.3: - resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} - - mjml-preset-core@4.15.3: - resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} - - mjml-raw@4.15.3: - resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} - - mjml-section@4.15.3: - resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} - - mjml-social@4.15.3: - resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} - - mjml-spacer@4.15.3: - resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} - - mjml-table@4.15.3: - resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} - - mjml-text@4.15.3: - resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} - - mjml-validator@4.15.3: - resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} - - mjml-wrapper@4.15.3: - resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} - - mjml@4.15.3: - resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} - hasBin: true - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -7588,11 +8303,20 @@ packages: nan@2.22.0: resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.0.9: + resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} + engines: {node: ^18 || >=20} + hasBin: true + + nanostores@0.11.3: + resolution: {integrity: sha512-TUes3xKIX33re4QzdxwZ6tdbodjmn3tWXCEc1uokiEmo14sI1EaGYNs2k3bU2pyyGNmBqFGAVl6jAGWd06AVIg==} + engines: {node: ^18.0.0 || >=20.0.0} + natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -7623,8 +8347,26 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} - no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + next@15.0.4: + resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -7671,22 +8413,15 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - nodemailer-fetch@1.6.0: - resolution: {integrity: sha512-P7S5CEVGAmDrrpn351aXOLYs1R/7fD5NamfMCHyi6WIkbjS2eeZUB/TkuvpOQr0bvRZicVqo59+8wbhR3yrJbQ==} - - nodemailer-shared@1.1.0: - resolution: {integrity: sha512-68xW5LSyPWv8R0GLm6veAvm7E+XFXkVgvE3FW0FGxNMMZqMkPFeGDVALfR1DPdSfcoO36PnW7q5AAOgFImEZGg==} - - nodemailer-smtp-transport@2.7.4: - resolution: {integrity: sha512-1e86YhJ633OZWk3OHWS5TpuoYXG/LtY2/RzNiB5+EkFifDdqHCNHBnExd5cobx0ZSHJLNGM8EKnDuHRFIjFi6Q==} - - nodemailer-wellknown@0.1.10: - resolution: {integrity: sha512-/VV4mjAEjfm2fn0loUvrpjvugw5rgurNjPO4WU24CuVSoeumsyLOTgaEWG8WoGdPxh1biOAp5JxDoy1hlA2zsw==} - nodemailer@6.9.16: resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} engines: {node: '>=6.0.0'} + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + nopt@7.2.1: resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7838,6 +8573,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + ora@6.3.1: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7845,6 +8584,9 @@ packages: orderedmap@2.1.1: resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + oslo@1.2.1: + resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -7894,9 +8636,6 @@ packages: papaparse@5.4.1: resolution: {integrity: sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==} - param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -7920,6 +8659,9 @@ packages: parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -7927,18 +8669,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - passport-local@1.0.0: - resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} - engines: {node: '>= 0.4.0'} - - passport-strategy@1.0.0: - resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} - engines: {node: '>= 0.4.0'} - - passport@0.6.0: - resolution: {integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==} - engines: {node: '>= 0.4.0'} - path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} @@ -7972,8 +8702,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} @@ -7988,8 +8718,8 @@ packages: pause-stream@0.0.11: resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - pause@0.0.1: - resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -8543,6 +9273,10 @@ packages: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} @@ -8583,11 +9317,15 @@ packages: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - prisma@5.22.0: - resolution: {integrity: sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==} - engines: {node: '>=16.13'} + prisma@6.0.1: + resolution: {integrity: sha512-CaMNFHkf+DDq8zq3X/JJsQ4Koy7dyWwwtOKibkT/Am9j/tDxcfbg7+lB1Dzhx18G/+RQCMgjPYB61bhRqteNBQ==} + engines: {node: '>=18.18'} hasBin: true + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + proc-log@4.2.0: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -8679,9 +9417,6 @@ packages: prosemirror-view@1.36.0: resolution: {integrity: sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==} - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -8701,6 +9436,9 @@ packages: psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -8709,6 +9447,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.3: + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} + q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -8818,6 +9563,11 @@ packages: typescript: optional: true + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -8829,6 +9579,11 @@ packages: react: '>= 16.3.0' react-dom: '>= 16.3.0' + react-email@3.0.4: + resolution: {integrity: sha512-nXdo9P3V+qYSW6m5yN3XpFGhHb/bflX86m0EDQEqDIgayprj6InmBJoBnMSIyC5EP4tPtoAljlclJns4lJG/MQ==} + engines: {node: '>=18.0.0'} + hasBin: true + react-error-boundary@4.1.2: resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: @@ -8910,6 +9665,9 @@ packages: react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + react-redux@8.1.3: resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} peerDependencies: @@ -8992,6 +9750,10 @@ packages: peerDependencies: react: '*' + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -9178,6 +9940,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -9257,6 +10023,9 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + rou3@0.5.1: + resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + rst-selector-parser@2.2.3: resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==} @@ -9341,6 +10110,9 @@ packages: resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} engines: {node: '>= 12.13.0'} + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -9395,6 +10167,9 @@ packages: engines: {node: '>= 14'} hasBin: true + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -9419,6 +10194,10 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -9449,6 +10228,13 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -9472,9 +10258,6 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - slick@1.12.2: - resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -9482,12 +10265,20 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - smtp-connection@2.12.0: - resolution: {integrity: sha512-UP5jK4s5SGcUcqPN4U9ingqKt9mXYSKa52YhqxPuMecAnUOsVJpOmtgGaOm1urUBJZlzDt1M9WhZZkgbhxQlvg==} - snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.0: + resolution: {integrity: sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==} + engines: {node: '>=10.2.0'} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -9628,6 +10419,10 @@ packages: stream-json@1.9.0: resolution: {integrity: sha512-TqnfW7hRTKje7UobBzXZJ2qOEDJvdcSVgVIK/fopC03xINFuFqQs8RVjyDT4ry7TmOo2ueAXwpXXXG4tNgtvoQ==} + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -9745,6 +10540,19 @@ packages: react-dom: '>= 16.8.0' react-is: '>= 16.8.0' + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + styled-system@5.1.5: resolution: {integrity: sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==} @@ -9938,6 +10746,10 @@ packages: toposort@2.0.2: resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -10055,38 +10867,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.2.3: - resolution: {integrity: sha512-Rcm10CuMKQGcdIBS3R/9PMeuYnv6beYIHqfZFeKWVYEWH69sauj4INs83zKMTUiZJ3/hWGZ4jet9AOwhsssLyg==} + turbo-darwin-64@2.3.3: + resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.2.3: - resolution: {integrity: sha512-+EIMHkuLFqUdJYsA3roj66t9+9IciCajgj+DVek+QezEdOJKcRxlvDOS2BUaeN8kEzVSsNiAGnoysFWYw4K0HA==} + turbo-darwin-arm64@2.3.3: + resolution: {integrity: sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.2.3: - resolution: {integrity: sha512-UBhJCYnqtaeOBQLmLo8BAisWbc9v9daL9G8upLR+XGj6vuN/Nz6qUAhverN4Pyej1g4Nt1BhROnj6GLOPYyqxQ==} + turbo-linux-64@2.3.3: + resolution: {integrity: sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.2.3: - resolution: {integrity: sha512-hJYT9dN06XCQ3jBka/EWvvAETnHRs3xuO/rb5bESmDfG+d9yQjeTMlhRXKrr4eyIMt6cLDt1LBfyi+6CQ+VAwQ==} + turbo-linux-arm64@2.3.3: + resolution: {integrity: sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.2.3: - resolution: {integrity: sha512-NPrjacrZypMBF31b4HE4ROg4P3nhMBPHKS5WTpMwf7wydZ8uvdEHpESVNMOtqhlp857zbnKYgP+yJF30H3N2dQ==} + turbo-windows-64@2.3.3: + resolution: {integrity: sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.2.3: - resolution: {integrity: sha512-fnNrYBCqn6zgKPKLHu4sOkihBI/+0oYFr075duRxqUZ+1aLWTAGfHZLgjVeLh3zR37CVzuerGIPWAEkNhkWEIw==} + turbo-windows-arm64@2.3.3: + resolution: {integrity: sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==} cpu: [arm64] os: [win32] - turbo@2.2.3: - resolution: {integrity: sha512-5lDvSqIxCYJ/BAd6rQGK/AzFRhBkbu4JHVMLmGh/hCb7U3CqSnr5Tjwfy9vc+/5wG2DJ6wttgAaA7MoCgvBKZQ==} + turbo@2.3.3: + resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} hasBin: true tv4@1.3.0: @@ -10178,11 +10990,6 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - uid-safe@2.1.5: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} @@ -10193,12 +11000,12 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - underscore@1.7.0: - resolution: {integrity: sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -10268,9 +11075,6 @@ packages: upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - upper-case@2.0.2: resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} @@ -10345,10 +11149,6 @@ packages: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} - valid-data-url@3.0.1: - resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} - engines: {node: '>=10'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -10444,10 +11244,6 @@ packages: web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - web-resource-inliner@6.0.1: - resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} - engines: {node: '>=10.0.0'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -10663,6 +11459,18 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -10755,8 +11563,13 @@ packages: peerDependencies: zod: ^3.23.3 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + + zx@8.2.4: + resolution: {integrity: sha512-g9wVU+5+M+zVen/3IyAZfsZFmeqb6vDfjqFggakviz5uLK7OAejOirX+jeTOkyvAh/OYRlCgw+SdqzN7F61QVQ==} + engines: {node: '>= 12.17.0'} + hasBin: true snapshots: @@ -10797,7 +11610,7 @@ snapshots: react-phone-input-2: 2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-select: 5.8.2(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-text-mask: 5.5.0(react@18.3.1) - styled-components: 5.3.9(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-components: 5.3.9(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) styled-system: 5.1.5 text-mask-addons: 3.8.0 transitivePeerDependencies: @@ -10807,20 +11620,20 @@ snapshots: - react-is - supports-color - '@adminjs/express@6.1.0(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(express-formidable@1.2.0)(express-session@1.18.1)(express@4.21.1)(tslib@2.8.1)': + '@adminjs/express@6.1.1(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(express-formidable@1.2.0)(express-session@1.18.1)(express@4.21.2)(tslib@2.8.1)': dependencies: adminjs: 7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13) - express: 4.21.1 + express: 4.21.2 express-formidable: 1.2.0 express-session: 1.18.1 tslib: 2.8.1 - '@adminjs/prisma@5.0.3(@prisma/client@5.22.0(prisma@5.22.0))(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))': + '@adminjs/prisma@5.0.3(@prisma/client@6.0.1(prisma@6.0.1))(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))': dependencies: - '@prisma/client': 5.22.0(prisma@5.22.0) + '@prisma/client': 6.0.1(prisma@6.0.1) adminjs: 7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13) - '@adminjs/themes@1.0.1(@types/babel__core@7.20.5)(@types/node@16.18.119)(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(tslib@2.8.1)': + '@adminjs/themes@1.0.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(@types/node@16.18.119)(adminjs@7.8.13(@types/babel__core@7.20.5)(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13))(tslib@2.8.1)': dependencies: '@babel/cli': 7.25.9(@babel/core@7.26.0) '@babel/core': 7.26.0 @@ -10839,7 +11652,7 @@ snapshots: commander: 10.0.1 rimraf: 4.4.1 rollup: 3.29.5 - ts-node: 10.9.2(@types/node@16.18.119)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - '@swc/core' @@ -10887,6 +11700,26 @@ snapshots: '@babel/compat-data@7.26.2': {} + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.24.5) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 @@ -10900,7 +11733,7 @@ snapshots: '@babel/traverse': 7.25.9(supports-color@5.5.0) '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10967,7 +11800,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -10987,6 +11820,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -11053,6 +11895,10 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.26.0 + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.26.0 + '@babel/parser@7.26.2': dependencies: '@babel/types': 7.26.0 @@ -11785,7 +12631,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -11797,20 +12643,22 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@celluloid/react-player@2.14.0(react@18.3.1)': + '@better-fetch/fetch@1.1.12': {} + + '@celluloid/react-player@2.14.0(react@18.2.0)': dependencies: deepmerge: 4.3.1 load-script: 1.0.0 memoize-one: 5.2.1 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 react-fast-compare: 3.2.2 - '@commitlint/cli@17.8.1': + '@commitlint/cli@17.8.1(@swc/core@1.3.101(@swc/helpers@0.5.13))': dependencies: '@commitlint/format': 17.8.1 '@commitlint/lint': 17.8.1 - '@commitlint/load': 17.8.1 + '@commitlint/load': 17.8.1(@swc/core@1.3.101(@swc/helpers@0.5.13)) '@commitlint/read': 17.8.1 '@commitlint/types': 17.8.1 execa: 5.1.1 @@ -11859,7 +12707,7 @@ snapshots: '@commitlint/rules': 17.8.1 '@commitlint/types': 17.8.1 - '@commitlint/load@17.8.1': + '@commitlint/load@17.8.1(@swc/core@1.3.101(@swc/helpers@0.5.13))': dependencies: '@commitlint/config-validator': 17.8.1 '@commitlint/execute-rule': 17.8.1 @@ -11868,12 +12716,12 @@ snapshots: '@types/node': 20.5.1 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.6.3) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - '@swc/core' @@ -12008,13 +12856,28 @@ snapshots: '@cutting/assert@0.1.4': {} - '@cutting/use-get-parent-size@2.1.16(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(resize-observer-polyfill@1.5.1)(use-debounce@10.0.4(react@18.3.1))': + '@cutting/use-get-parent-size@2.1.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(resize-observer-polyfill@1.5.1)(use-debounce@10.0.4(react@18.2.0))': dependencies: '@cutting/assert': 0.1.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) resize-observer-polyfill: 1.5.1 - use-debounce: 10.0.4(react@18.3.1) + use-debounce: 10.0.4(react@18.2.0) + + '@emnapi/core@0.45.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@0.45.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true '@emotion/babel-plugin@11.12.0': dependencies: @@ -12048,6 +12911,22 @@ snapshots: '@emotion/memoize@0.9.0': {} + '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.2.0) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + '@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 @@ -12074,16 +12953,16 @@ snapshots: '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.12.0 '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) '@emotion/serialize': 1.3.2 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.2.0) '@emotion/utils': 1.4.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: '@types/react': 18.3.12 transitivePeerDependencies: @@ -12095,6 +12974,10 @@ snapshots: '@emotion/unitless@0.7.5': {} + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.2.0)': + dependencies: + react: 18.2.0 + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': dependencies: react: 18.3.1 @@ -12103,6 +12986,9 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} + '@esbuild/aix-ppc64@0.19.11': + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true @@ -12112,6 +12998,9 @@ snapshots: '@esbuild/android-arm64@0.18.20': optional: true + '@esbuild/android-arm64@0.19.11': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true @@ -12121,6 +13010,9 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true + '@esbuild/android-arm@0.19.11': + optional: true + '@esbuild/android-arm@0.23.1': optional: true @@ -12130,6 +13022,9 @@ snapshots: '@esbuild/android-x64@0.18.20': optional: true + '@esbuild/android-x64@0.19.11': + optional: true + '@esbuild/android-x64@0.23.1': optional: true @@ -12139,6 +13034,9 @@ snapshots: '@esbuild/darwin-arm64@0.18.20': optional: true + '@esbuild/darwin-arm64@0.19.11': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true @@ -12148,6 +13046,9 @@ snapshots: '@esbuild/darwin-x64@0.18.20': optional: true + '@esbuild/darwin-x64@0.19.11': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true @@ -12157,6 +13058,9 @@ snapshots: '@esbuild/freebsd-arm64@0.18.20': optional: true + '@esbuild/freebsd-arm64@0.19.11': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true @@ -12166,6 +13070,9 @@ snapshots: '@esbuild/freebsd-x64@0.18.20': optional: true + '@esbuild/freebsd-x64@0.19.11': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true @@ -12175,6 +13082,9 @@ snapshots: '@esbuild/linux-arm64@0.18.20': optional: true + '@esbuild/linux-arm64@0.19.11': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true @@ -12184,6 +13094,9 @@ snapshots: '@esbuild/linux-arm@0.18.20': optional: true + '@esbuild/linux-arm@0.19.11': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true @@ -12193,13 +13106,19 @@ snapshots: '@esbuild/linux-ia32@0.18.20': optional: true + '@esbuild/linux-ia32@0.19.11': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-ia32@0.24.0': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.11': optional: true '@esbuild/linux-loong64@0.23.1': @@ -12211,6 +13130,9 @@ snapshots: '@esbuild/linux-mips64el@0.18.20': optional: true + '@esbuild/linux-mips64el@0.19.11': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true @@ -12220,6 +13142,9 @@ snapshots: '@esbuild/linux-ppc64@0.18.20': optional: true + '@esbuild/linux-ppc64@0.19.11': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true @@ -12229,6 +13154,9 @@ snapshots: '@esbuild/linux-riscv64@0.18.20': optional: true + '@esbuild/linux-riscv64@0.19.11': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true @@ -12238,6 +13166,9 @@ snapshots: '@esbuild/linux-s390x@0.18.20': optional: true + '@esbuild/linux-s390x@0.19.11': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true @@ -12247,6 +13178,9 @@ snapshots: '@esbuild/linux-x64@0.18.20': optional: true + '@esbuild/linux-x64@0.19.11': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true @@ -12256,6 +13190,9 @@ snapshots: '@esbuild/netbsd-x64@0.18.20': optional: true + '@esbuild/netbsd-x64@0.19.11': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true @@ -12271,6 +13208,9 @@ snapshots: '@esbuild/openbsd-x64@0.18.20': optional: true + '@esbuild/openbsd-x64@0.19.11': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true @@ -12280,6 +13220,9 @@ snapshots: '@esbuild/sunos-x64@0.18.20': optional: true + '@esbuild/sunos-x64@0.19.11': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true @@ -12289,6 +13232,9 @@ snapshots: '@esbuild/win32-arm64@0.18.20': optional: true + '@esbuild/win32-arm64@0.19.11': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true @@ -12298,6 +13244,9 @@ snapshots: '@esbuild/win32-ia32@0.18.20': optional: true + '@esbuild/win32-ia32@0.19.11': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true @@ -12307,6 +13256,9 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true + '@esbuild/win32-x64@0.19.11': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true @@ -12323,7 +13275,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -12345,11 +13297,11 @@ snapshots: '@floating-ui/core': 1.6.8 '@floating-ui/utils': 0.2.8 - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.12 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@floating-ui/utils@0.2.8': {} @@ -12377,10 +13329,12 @@ snapshots: - '@types/react-dom' - react-native + '@hexagon/base64@1.1.28': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -12396,6 +13350,81 @@ snapshots: react: 18.3.1 warning: 4.0.3 + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -12427,13 +13456,13 @@ snapshots: '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 - '@types/node': 16.18.119 + '@types/node': 18.19.64 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 slash: 3.0.0 - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3))': + '@jest/core@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3))': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -12447,7 +13476,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -12470,7 +13499,7 @@ snapshots: - ts-node - utf-8-validate - '@jest/core@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))': + '@jest/core@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3))': dependencies: '@jest/console': 27.5.1 '@jest/reporters': 27.5.1 @@ -12484,7 +13513,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 27.5.1 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) jest-haste-map: 27.5.1 jest-message-util: 27.5.1 jest-regex-util: 27.5.1 @@ -12633,7 +13662,7 @@ snapshots: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -12666,11 +13695,13 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@material-ui/core@3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@levischuck/tiny-cbor@0.2.2': {} + + '@material-ui/core@3.9.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@material-ui/system': 3.0.0-alpha.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@material-ui/utils': 3.0.0-alpha.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@material-ui/system': 3.0.0-alpha.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@material-ui/utils': 3.0.0-alpha.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/jss': 9.5.8 '@types/react-transition-group': 2.9.2 brcast: 3.0.2 @@ -12691,130 +13722,130 @@ snapshots: normalize-scroll-left: 0.1.2 popper.js: 1.16.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-event-listener: 0.6.6(react@18.3.1) - react-transition-group: 2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - recompose: 0.30.0(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-event-listener: 0.6.6(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + recompose: 0.30.0(react@18.2.0) warning: 4.0.3 - '@material-ui/system@3.0.0-alpha.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@material-ui/system@3.0.0-alpha.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 deepmerge: 3.3.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) warning: 4.0.3 - '@material-ui/utils@3.0.0-alpha.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@material-ui/utils@3.0.0-alpha.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 16.13.1 - '@mgcrea/prisma-queue@1.12.0(@prisma/client@5.22.0(prisma@5.22.0))': + '@mgcrea/prisma-queue@1.12.0(@prisma/client@6.0.1(prisma@6.0.1))': dependencies: - '@prisma/client': 5.22.0(prisma@5.22.0) + '@prisma/client': 6.0.1(prisma@6.0.1) croner: 9.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@mui/base@5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/base@5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.2.0) '@popperjs/core': 2.11.8 clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: '@types/react': 18.3.12 '@mui/core-downloads-tracker@6.1.6': {} - '@mui/icons-material@6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@mui/icons-material@6.1.6(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 + '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 optionalDependencies: '@types/react': 18.3.12 - '@mui/lab@5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/lab@5.0.0-alpha.173(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/base': 5.0.0-beta.40(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@mui/system': 5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.2.0) clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@types/react': 18.3.12 - '@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@mui/core-downloads-tracker': 6.1.6 - '@mui/system': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@mui/system': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.2.0) '@popperjs/core': 2.11.8 '@types/react-transition-group': 4.4.11 clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 18.3.1 - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@types/react': 18.3.12 - '@mui/private-theming@5.16.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/private-theming@5.16.6(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.2.0) prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: '@types/react': 18.3.12 - '@mui/private-theming@6.1.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/private-theming@6.1.6(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.2.0) prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: '@types/react': 18.3.12 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.13.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) - '@mui/styled-engine@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.13.1 @@ -12822,18 +13853,18 @@ snapshots: '@emotion/sheet': 1.4.0 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) - '@mui/styles@6.1.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/styles@6.1.6(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 - '@mui/private-theming': 6.1.6(@types/react@18.3.12)(react@18.3.1) + '@mui/private-theming': 6.1.6(@types/react@18.3.12)(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.2.0) clsx: 2.1.1 csstype: 3.1.3 hoist-non-react-statics: 3.3.2 @@ -12846,70 +13877,96 @@ snapshots: jss-plugin-rule-value-function: 10.10.0 jss-plugin-vendor-prefixer: 10.10.0 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: '@types/react': 18.3.12 - '@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@mui/system@5.16.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 5.16.6(@types/react@18.3.12)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) + '@mui/private-theming': 5.16.6(@types/react@18.3.12)(react@18.2.0) + '@mui/styled-engine': 5.16.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 5.16.6(@types/react@18.3.12)(react@18.2.0) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@types/react': 18.3.12 - '@mui/system@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1)': + '@mui/system@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 - '@mui/private-theming': 6.1.6(@types/react@18.3.12)(react@18.3.1) - '@mui/styled-engine': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(react@18.3.1) + '@mui/private-theming': 6.1.6(@types/react@18.3.12)(react@18.2.0) + '@mui/styled-engine': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(react@18.2.0) '@mui/types': 7.2.19(@types/react@18.3.12) - '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.3.1) + '@mui/utils': 6.1.6(@types/react@18.3.12)(react@18.2.0) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) '@types/react': 18.3.12 '@mui/types@7.2.19(@types/react@18.3.12)': optionalDependencies: '@types/react': 18.3.12 - '@mui/utils@5.16.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/utils@5.16.6(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@mui/types': 7.2.19(@types/react@18.3.12) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 react-is: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@mui/utils@6.1.6(@types/react@18.3.12)(react@18.3.1)': + '@mui/utils@6.1.6(@types/react@18.3.12)(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@mui/types': 7.2.19(@types/react@18.3.12) '@types/prop-types': 15.7.13 clsx: 2.1.1 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 react-is: 18.3.1 optionalDependencies: '@types/react': 18.3.12 + '@next/env@15.0.4': {} + + '@next/swc-darwin-arm64@15.0.4': + optional: true + + '@next/swc-darwin-x64@15.0.4': + optional: true + + '@next/swc-linux-arm64-gnu@15.0.4': + optional: true + + '@next/swc-linux-arm64-musl@15.0.4': + optional: true + + '@next/swc-linux-x64-gnu@15.0.4': + optional: true + + '@next/swc-linux-x64-musl@15.0.4': + optional: true + + '@next/swc-win32-arm64-msvc@15.0.4': + optional: true + + '@next/swc-win32-x64-msvc@15.0.4': + optional: true + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': optional: true @@ -12917,6 +13974,138 @@ snapshots: dependencies: eslint-scope: 5.1.1 + '@noble/ciphers@0.6.0': {} + + '@noble/hashes@1.6.1': {} + + '@node-rs/argon2-android-arm-eabi@1.7.0': + optional: true + + '@node-rs/argon2-android-arm64@1.7.0': + optional: true + + '@node-rs/argon2-darwin-arm64@1.7.0': + optional: true + + '@node-rs/argon2-darwin-x64@1.7.0': + optional: true + + '@node-rs/argon2-freebsd-x64@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + optional: true + + '@node-rs/argon2-linux-arm64-musl@1.7.0': + optional: true + + '@node-rs/argon2-linux-x64-gnu@1.7.0': + optional: true + + '@node-rs/argon2-linux-x64-musl@1.7.0': + optional: true + + '@node-rs/argon2-wasm32-wasi@1.7.0': + dependencies: + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true + + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + optional: true + + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + optional: true + + '@node-rs/argon2-win32-x64-msvc@1.7.0': + optional: true + + '@node-rs/argon2@1.7.0': + optionalDependencies: + '@node-rs/argon2-android-arm-eabi': 1.7.0 + '@node-rs/argon2-android-arm64': 1.7.0 + '@node-rs/argon2-darwin-arm64': 1.7.0 + '@node-rs/argon2-darwin-x64': 1.7.0 + '@node-rs/argon2-freebsd-x64': 1.7.0 + '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 + '@node-rs/argon2-linux-arm64-gnu': 1.7.0 + '@node-rs/argon2-linux-arm64-musl': 1.7.0 + '@node-rs/argon2-linux-x64-gnu': 1.7.0 + '@node-rs/argon2-linux-x64-musl': 1.7.0 + '@node-rs/argon2-wasm32-wasi': 1.7.0 + '@node-rs/argon2-win32-arm64-msvc': 1.7.0 + '@node-rs/argon2-win32-ia32-msvc': 1.7.0 + '@node-rs/argon2-win32-x64-msvc': 1.7.0 + + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + optional: true + + '@node-rs/bcrypt-android-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-arm64@1.9.0': + optional: true + + '@node-rs/bcrypt-darwin-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-freebsd-x64@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + optional: true + + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + optional: true + + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + dependencies: + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 + optional: true + + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + optional: true + + '@node-rs/bcrypt@1.9.0': + optionalDependencies: + '@node-rs/bcrypt-android-arm-eabi': 1.9.0 + '@node-rs/bcrypt-android-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-x64': 1.9.0 + '@node-rs/bcrypt-freebsd-x64': 1.9.0 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 + '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 + '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-x64-musl': 1.9.0 + '@node-rs/bcrypt-wasm32-wasi': 1.9.0 + '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 + '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 + '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12943,7 +14132,39 @@ snapshots: dependencies: semver: 7.6.3 - '@one-ini/wasm@0.1.1': {} + '@peculiar/asn1-android@2.3.13': + dependencies: + '@peculiar/asn1-schema': 2.3.13 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.3.14': + dependencies: + '@peculiar/asn1-schema': 2.3.13 + '@peculiar/asn1-x509': 2.3.13 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.3.13': + dependencies: + '@peculiar/asn1-schema': 2.3.13 + '@peculiar/asn1-x509': 2.3.13 + asn1js: 3.0.5 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.3.13': + dependencies: + asn1js: 3.0.5 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.3.13': + dependencies: + '@peculiar/asn1-schema': 2.3.13 + asn1js: 3.0.5 + ipaddr.js: 2.2.0 + pvtsutils: 1.3.6 + tslib: 2.8.1 '@pkgjs/parseargs@0.11.0': optional: true @@ -12957,7 +14178,7 @@ snapshots: async: 3.2.6 chalk: 3.0.0 dayjs: 1.8.36 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 eventemitter2: 5.0.1 fast-json-patch: 3.1.1 fclone: 1.0.11 @@ -12975,7 +14196,7 @@ snapshots: '@pm2/io@6.0.1': dependencies: async: 2.6.4 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 eventemitter2: 6.4.9 require-in-the-middle: 5.2.0 semver: 7.5.4 @@ -12988,7 +14209,7 @@ snapshots: '@pm2/js-api@0.8.0': dependencies: async: 2.6.4 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 eventemitter2: 6.4.9 extrareqp2: 1.0.0(debug@4.3.7) ws: 7.5.10 @@ -12999,11 +14220,11 @@ snapshots: '@pm2/pm2-version-check@1.0.4': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.96.1))(webpack@5.96.1)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)))(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.39.0 @@ -13013,37 +14234,154 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) optionalDependencies: + '@types/webpack': 5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) type-fest: 2.19.0 - webpack-dev-server: 4.15.2(webpack@5.96.1) + webpack-dev-server: 4.15.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + + '@popperjs/core@2.11.8': {} + + '@prisma/client@5.22.0(prisma@6.0.1)': + optionalDependencies: + prisma: 6.0.1 + + '@prisma/client@6.0.1(prisma@6.0.1)': + optionalDependencies: + prisma: 6.0.1 + + '@prisma/debug@6.0.1': {} + + '@prisma/engines-version@5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e': {} + + '@prisma/engines@6.0.1': + dependencies: + '@prisma/debug': 6.0.1 + '@prisma/engines-version': 5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e + '@prisma/fetch-engine': 6.0.1 + '@prisma/get-platform': 6.0.1 + + '@prisma/fetch-engine@6.0.1': + dependencies: + '@prisma/debug': 6.0.1 + '@prisma/engines-version': 5.23.0-27.5dbef10bdbfb579e07d35cc85fb1518d357cb99e + '@prisma/get-platform': 6.0.1 + + '@prisma/get-platform@6.0.1': + dependencies: + '@prisma/debug': 6.0.1 + + '@react-email/body@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/button@0.0.19(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/code-block@0.0.11(react@18.3.1)': + dependencies: + prismjs: 1.29.0 + react: 18.3.1 + + '@react-email/code-inline@0.0.5(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/column@0.0.13(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/components@0.0.31(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@react-email/body': 0.0.11(react@18.3.1) + '@react-email/button': 0.0.19(react@18.3.1) + '@react-email/code-block': 0.0.11(react@18.3.1) + '@react-email/code-inline': 0.0.5(react@18.3.1) + '@react-email/column': 0.0.13(react@18.3.1) + '@react-email/container': 0.0.15(react@18.3.1) + '@react-email/font': 0.0.9(react@18.3.1) + '@react-email/head': 0.0.12(react@18.3.1) + '@react-email/heading': 0.0.15(react@18.3.1) + '@react-email/hr': 0.0.11(react@18.3.1) + '@react-email/html': 0.0.11(react@18.3.1) + '@react-email/img': 0.0.11(react@18.3.1) + '@react-email/link': 0.0.12(react@18.3.1) + '@react-email/markdown': 0.0.14(react@18.3.1) + '@react-email/preview': 0.0.12(react@18.3.1) + '@react-email/render': 1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-email/row': 0.0.12(react@18.3.1) + '@react-email/section': 0.0.16(react@18.3.1) + '@react-email/tailwind': 1.0.4(react@18.3.1) + '@react-email/text': 0.0.11(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - react-dom + + '@react-email/container@0.0.15(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/font@0.0.9(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/head@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/heading@0.0.15(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/hr@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/html@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/img@0.0.11(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@react-email/link@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 - '@popperjs/core@2.11.8': {} + '@react-email/markdown@0.0.14(react@18.3.1)': + dependencies: + md-to-react-email: 5.0.5(react@18.3.1) + react: 18.3.1 - '@prisma/client@5.22.0(prisma@5.22.0)': - optionalDependencies: - prisma: 5.22.0 + '@react-email/preview@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 - '@prisma/debug@5.22.0': {} + '@react-email/render@1.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + html-to-text: 9.0.5 + prettier: 3.3.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 - '@prisma/engines-version@5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2': {} + '@react-email/row@0.0.12(react@18.3.1)': + dependencies: + react: 18.3.1 - '@prisma/engines@5.22.0': + '@react-email/section@0.0.16(react@18.3.1)': dependencies: - '@prisma/debug': 5.22.0 - '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 - '@prisma/fetch-engine': 5.22.0 - '@prisma/get-platform': 5.22.0 + react: 18.3.1 - '@prisma/fetch-engine@5.22.0': + '@react-email/tailwind@1.0.4(react@18.3.1)': dependencies: - '@prisma/debug': 5.22.0 - '@prisma/engines-version': 5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2 - '@prisma/get-platform': 5.22.0 + react: 18.3.1 - '@prisma/get-platform@5.22.0': + '@react-email/text@0.0.11(react@18.3.1)': dependencies: - '@prisma/debug': 5.22.0 + react: 18.3.1 '@redis/bloom@1.2.0(@redis/client@1.6.0)': dependencies: @@ -13308,6 +14646,11 @@ snapshots: '@rushstack/eslint-patch@1.10.4': {} + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -13316,6 +14659,26 @@ snapshots: '@sideway/pinpoint@2.0.0': {} + '@simplewebauthn/browser@10.0.0': + dependencies: + '@simplewebauthn/types': 10.0.0 + + '@simplewebauthn/server@10.0.1(encoding@0.1.13)': + dependencies: + '@hexagon/base64': 1.1.28 + '@levischuck/tiny-cbor': 0.2.2 + '@peculiar/asn1-android': 2.3.13 + '@peculiar/asn1-ecc': 2.3.14 + '@peculiar/asn1-rsa': 2.3.13 + '@peculiar/asn1-schema': 2.3.13 + '@peculiar/asn1-x509': 2.3.13 + '@simplewebauthn/types': 10.0.0 + cross-fetch: 4.0.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + '@simplewebauthn/types@10.0.0': {} + '@sinclair/typebox@0.24.51': {} '@sinonjs/commons@1.8.6': @@ -13326,6 +14689,8 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 + '@socket.io/component-emitter@3.1.2': {} + '@styled-system/background@5.1.2': dependencies: '@styled-system/core': 5.1.2 @@ -13451,15 +14816,74 @@ snapshots: transitivePeerDependencies: - supports-color - '@t3-oss/env-core@0.11.1(typescript@5.6.3)(zod@3.23.8)': + '@swc/core-darwin-arm64@1.3.101': + optional: true + + '@swc/core-darwin-x64@1.3.101': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.3.101': + optional: true + + '@swc/core-linux-arm64-gnu@1.3.101': + optional: true + + '@swc/core-linux-arm64-musl@1.3.101': + optional: true + + '@swc/core-linux-x64-gnu@1.3.101': + optional: true + + '@swc/core-linux-x64-musl@1.3.101': + optional: true + + '@swc/core-win32-arm64-msvc@1.3.101': + optional: true + + '@swc/core-win32-ia32-msvc@1.3.101': + optional: true + + '@swc/core-win32-x64-msvc@1.3.101': + optional: true + + '@swc/core@1.3.101(@swc/helpers@0.5.13)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.101 + '@swc/core-darwin-x64': 1.3.101 + '@swc/core-linux-arm-gnueabihf': 1.3.101 + '@swc/core-linux-arm64-gnu': 1.3.101 + '@swc/core-linux-arm64-musl': 1.3.101 + '@swc/core-linux-x64-gnu': 1.3.101 + '@swc/core-linux-x64-musl': 1.3.101 + '@swc/core-win32-arm64-msvc': 1.3.101 + '@swc/core-win32-ia32-msvc': 1.3.101 + '@swc/core-win32-x64-msvc': 1.3.101 + '@swc/helpers': 0.5.13 + optional: true + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.13': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.17': + dependencies: + '@swc/counter': 0.1.3 + optional: true + + '@t3-oss/env-core@0.11.1(typescript@5.6.3)(zod@3.24.1)': dependencies: - zod: 3.23.8 + zod: 3.24.1 optionalDependencies: typescript: 5.6.3 - '@t3-oss/env-core@0.7.3(typescript@5.6.3)(zod@3.23.8)': + '@t3-oss/env-core@0.7.3(typescript@5.6.3)(zod@3.24.1)': dependencies: - zod: 3.23.8 + zod: 3.24.1 optionalDependencies: typescript: 5.6.3 @@ -13467,19 +14891,19 @@ snapshots: '@tanstack/query-devtools@5.59.19': {} - '@tanstack/react-query-devtools@5.59.19(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.59.19(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/query-devtools': 5.59.19 - '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 + '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 - '@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/query-core': 4.36.1 - react: 18.3.1 - use-sync-external-store: 1.2.2(react@18.3.1) + react: 18.2.0 + use-sync-external-store: 1.2.2(react@18.2.0) optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 18.2.0(react@18.2.0) '@testing-library/dom@8.20.1': dependencies: @@ -13504,13 +14928,13 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@13.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@13.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.26.0 '@testing-library/dom': 8.20.1 '@types/react-dom': 18.3.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@testing-library/user-event@13.5.0(@testing-library/dom@8.20.1)': dependencies: @@ -13723,13 +15147,13 @@ snapshots: dependencies: '@trpc/server': 10.45.2 - '@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/react-query': 4.36.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@trpc/client': 10.45.2(@trpc/server@10.45.2) '@trpc/server': 10.45.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@trpc/server@10.45.2': {} @@ -13743,6 +15167,11 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tybys/wasm-util@0.8.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -13771,28 +15200,30 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/bonjour@3.5.13': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.1 - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/connect@3.4.38': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/cookie-parser@1.4.7': dependencies: - '@types/express': 4.17.21 + '@types/express': 5.0.0 + + '@types/cookie@0.4.1': {} '@types/cors@2.8.17': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/dotenv@6.1.1': dependencies: @@ -13819,12 +15250,12 @@ snapshots: '@types/express-formidable@1.2.3': dependencies: - '@types/express': 4.17.21 + '@types/express': 5.0.0 '@types/formidable': 3.4.5 '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/qs': 6.9.17 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -13836,10 +15267,6 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express-session@1.18.0': - dependencies: - '@types/express': 4.17.21 - '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 @@ -13862,7 +15289,13 @@ snapshots: '@types/formidable@3.4.5': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 18.19.64 + optional: true '@types/get-urls@9.1.3': dependencies: @@ -13891,7 +15324,7 @@ snapshots: '@types/http-proxy@1.17.15': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/i18next-browser-languagedetector@3.0.0': dependencies: @@ -13925,6 +15358,11 @@ snapshots: '@types/json5@0.0.29': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 18.19.64 + optional: true + '@types/jss@9.5.8': dependencies: csstype: 2.6.21 @@ -13970,7 +15408,7 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/node@16.18.119': {} @@ -13992,21 +15430,6 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/passport-local@1.0.38': - dependencies: - '@types/express': 5.0.0 - '@types/passport': 1.0.17 - '@types/passport-strategy': 0.2.38 - - '@types/passport-strategy@0.2.38': - dependencies: - '@types/express': 5.0.0 - '@types/passport': 1.0.17 - - '@types/passport@1.0.17': - dependencies: - '@types/express': 5.0.0 - '@types/prettier@2.7.3': {} '@types/prop-types@15.7.13': {} @@ -14061,7 +15484,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/resolve@1.20.2': {} @@ -14072,21 +15495,21 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/serve-index@1.9.4': dependencies: - '@types/express': 4.17.21 + '@types/express': 5.0.0 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/stack-utils@2.0.3': {} @@ -14102,9 +15525,21 @@ snapshots: '@types/webpack-env@1.18.5': {} + '@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)': + dependencies: + '@types/node': 18.19.64 + tapable: 2.2.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + optional: true + '@types/ws@8.5.13': dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 '@types/yargs-parser@21.0.3': {} @@ -14127,7 +15562,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -14152,7 +15587,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 @@ -14173,7 +15608,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: @@ -14189,7 +15624,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -14203,7 +15638,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -14250,10 +15685,10 @@ snapshots: '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 - '@uidotdev/usehooks@2.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uidotdev/usehooks@2.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) '@ungap/structured-clone@1.2.0': {} @@ -14453,13 +15888,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14654,6 +16089,12 @@ snapshots: asap@2.0.6: {} + asn1js@3.0.5: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.3 + tslib: 2.8.1 + ast-types-flow@0.0.8: {} ast-types@0.13.4: @@ -14714,14 +16155,14 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@8.4.1(@babel/core@7.26.0)(webpack@5.96.1): + babel-loader@8.4.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@babel/core': 7.26.0 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) babel-plugin-istanbul@6.1.1: dependencies: @@ -14781,7 +16222,7 @@ snapshots: '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.9(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-components: 5.3.9(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -14839,12 +16280,42 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + basic-ftp@5.0.5: {} batch@0.6.1: {} bcryptjs@2.4.3: {} + better-auth@1.0.21(encoding@0.1.13): + dependencies: + '@better-fetch/fetch': 1.1.12 + '@noble/ciphers': 0.6.0 + '@noble/hashes': 1.6.1 + '@simplewebauthn/browser': 10.0.0 + '@simplewebauthn/server': 10.0.1(encoding@0.1.13) + better-call: 0.3.3-beta.4 + consola: 3.2.3 + defu: 6.1.4 + jose: 5.9.6 + kysely: 0.27.4 + nanoid: 5.0.9 + nanostores: 0.11.3 + oslo: 1.2.1 + uncrypto: 0.1.3 + zod: 3.24.1 + transitivePeerDependencies: + - encoding + + better-call@0.3.3-beta.4: + dependencies: + '@better-fetch/fetch': 1.1.12 + rou3: 0.5.1 + set-cookie-parser: 2.7.1 + uncrypto: 0.1.3 + zod: 3.24.1 + bfj@7.1.0: dependencies: bluebird: 3.7.2 @@ -14857,6 +16328,12 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + bl@5.1.0: dependencies: buffer: 6.0.3 @@ -14901,7 +16378,7 @@ snapshots: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 - chalk: 5.0.1 + chalk: 5.3.0 cli-boxes: 3.0.0 string-width: 5.1.2 type-fest: 2.19.0 @@ -14946,6 +16423,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -14958,6 +16440,10 @@ snapshots: esbuild: 0.24.0 load-tsconfig: 0.2.5 + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + bytes@3.0.0: {} bytes@3.1.2: {} @@ -14989,11 +16475,6 @@ snapshots: callsites@3.1.0: {} - camel-case@3.0.0: - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - camel-case@4.1.2: dependencies: pascal-case: 3.1.2 @@ -15106,16 +16587,6 @@ snapshots: undici: 6.20.1 whatwg-mimetype: 4.0.0 - cheerio@1.0.0-rc.12: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.2.1 - parse5-htmlparser2-tree-adapter: 7.1.0 - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -15142,10 +16613,6 @@ snapshots: classnames@2.5.1: {} - clean-css@4.2.4: - dependencies: - source-map: 0.6.1 - clean-css@5.3.3: dependencies: source-map: 0.6.1 @@ -15154,6 +16621,10 @@ snapshots: cli-boxes@3.0.0: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 @@ -15169,6 +16640,8 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 + client-only@0.0.1: {} + clipboardy@3.0.0: dependencies: arch: 2.2.0 @@ -15231,6 +16704,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + colord@2.9.3: {} colorette@2.0.20: {} @@ -15243,6 +16728,8 @@ snapshots: commander@11.0.0: {} + commander@11.1.0: {} + commander@2.15.1: {} commander@2.20.3: {} @@ -15306,19 +16793,10 @@ snapshots: confbox@0.1.8: {} - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - confusing-browser-globals@1.0.11: {} connect-history-api-fallback@2.0.0: {} - connect-redis@7.1.1(express-session@1.18.1): - dependencies: - express-session: 1.18.1 - consola@3.2.3: {} constant-case@3.0.4: @@ -15390,11 +16868,11 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3): + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.3))(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3))(typescript@5.6.3): dependencies: '@types/node': 20.5.1 cosmiconfig: 8.3.6(typescript@5.6.3) - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3) typescript: 5.6.3 cosmiconfig@6.0.0: @@ -15475,7 +16953,7 @@ snapshots: postcss: 8.4.47 postcss-selector-parser: 6.1.2 - css-loader@6.11.0(webpack@5.96.1): + css-loader@6.11.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -15486,9 +16964,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) - css-minimizer-webpack-plugin@3.4.1(webpack@5.96.1): + css-minimizer-webpack-plugin@3.4.1(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: cssnano: 5.1.15(postcss@8.4.47) jest-worker: 27.5.1 @@ -15496,7 +16974,9 @@ snapshots: schema-utils: 4.2.0 serialize-javascript: 6.0.2 source-map: 0.6.1 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) + optionalDependencies: + esbuild: 0.24.0 css-prefers-color-scheme@6.0.3(postcss@8.4.47): dependencies: @@ -15666,6 +17146,8 @@ snapshots: debounce@1.2.1: {} + debounce@2.0.0: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -15678,7 +17160,11 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.7(supports-color@5.5.0): + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: @@ -15768,6 +17254,9 @@ snapshots: destroy@1.2.0: {} + detect-libc@2.0.3: + optional: true + detect-newline@3.1.0: {} detect-node@2.1.0: {} @@ -15847,10 +17336,6 @@ snapshots: dependencies: webidl-conversions: 5.0.0 - domhandler@3.3.0: - dependencies: - domelementtype: 2.3.0 - domhandler@4.3.1: dependencies: domelementtype: 2.3.0 @@ -15906,13 +17391,6 @@ snapshots: eastasianwidth@0.2.0: {} - editorconfig@1.0.4: - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.6.3 - ee-first@1.1.1: {} ejs@3.1.10: @@ -15944,6 +17422,25 @@ snapshots: dependencies: iconv-lite: 0.6.3 + engine.io-parser@5.2.3: {} + + engine.io@6.6.2: + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 18.19.64 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -16133,6 +17630,32 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 + esbuild@0.19.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -16222,7 +17745,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3): dependencies: '@babel/core': 7.26.0 '@babel/eslint-parser': 7.25.9(@babel/core@7.26.0)(eslint@8.57.1) @@ -16234,7 +17757,7 @@ snapshots: eslint: 8.57.1 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.33.2(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -16251,10 +17774,10 @@ snapshots: eslint-config-react@1.1.7: {} - eslint-config-turbo@2.2.3(eslint@8.57.1): + eslint-config-turbo@2.3.3(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-turbo: 2.2.3(eslint@8.57.1) + eslint-plugin-turbo: 2.3.3(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -16311,24 +17834,24 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3): + eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3): dependencies: '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - jest: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3): + eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3): dependencies: '@typescript-eslint/utils': 8.13.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - jest: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) transitivePeerDependencies: - supports-color - typescript @@ -16400,7 +17923,7 @@ snapshots: - supports-color - typescript - eslint-plugin-turbo@2.2.3(eslint@8.57.1): + eslint-plugin-turbo@2.3.3(eslint@8.57.1): dependencies: dotenv: 16.0.3 eslint: 8.57.1 @@ -16419,7 +17942,7 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.96.1): + eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -16427,7 +17950,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.2.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) eslint@8.57.1: dependencies: @@ -16442,7 +17965,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -16584,7 +18107,7 @@ snapshots: transitivePeerDependencies: - supports-color - express@4.21.1: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -16605,7 +18128,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 qs: 6.13.0 range-parser: 1.2.1 @@ -16626,6 +18149,8 @@ snapshots: transitivePeerDependencies: - debug + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -16684,11 +18209,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.96.1): + file-loader@6.2.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) file-saver@2.0.5: {} @@ -16761,7 +18286,7 @@ snapshots: follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 for-each@0.3.3: dependencies: @@ -16772,7 +18297,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@babel/code-frame': 7.26.2 '@types/json-schema': 7.0.15 @@ -16788,7 +18313,7 @@ snapshots: semver: 7.6.3 tapable: 1.1.3 typescript: 5.6.3 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) optionalDependencies: eslint: 8.57.1 @@ -16806,14 +18331,14 @@ snapshots: formidable@1.2.6: {} - formik@2.4.6(react@18.3.1): + formik@2.4.6(react@18.2.0): dependencies: '@types/hoist-non-react-statics': 3.3.5 deepmerge: 2.2.1 hoist-non-react-statics: 3.3.2 lodash: 4.17.21 lodash-es: 4.17.21 - react: 18.3.1 + react: 18.2.0 react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.8.1 @@ -16910,7 +18435,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -16947,6 +18472,14 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@10.3.4: + dependencies: + foreground-child: 3.3.0 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + glob@10.4.5: dependencies: foreground-child: 3.3.0 @@ -17134,23 +18667,21 @@ snapshots: relateurl: 0.2.7 terser: 5.36.0 - html-minifier@4.0.0: - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.20.3 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.19.3 - html-parse-stringify@3.0.1: dependencies: void-elements: 3.1.0 html-tags@3.3.1: {} - html-webpack-plugin@5.6.3(webpack@5.96.1): + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + + html-webpack-plugin@5.6.3(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -17158,14 +18689,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.96.1 - - htmlparser2@5.0.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 3.3.0 - domutils: 2.8.0 - entities: 2.2.0 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) htmlparser2@6.1.0: dependencies: @@ -17213,14 +18737,14 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17244,24 +18768,17 @@ snapshots: transitivePeerDependencies: - debug - httpntlm@1.6.1: - dependencies: - httpreq: 1.1.1 - underscore: 1.7.0 - - httpreq@1.1.1: {} - https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -17311,6 +18828,8 @@ snapshots: ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} + ignore@5.3.2: {} immer@9.0.21: {} @@ -17381,6 +18900,9 @@ snapshots: is-arrayish@0.2.1: {} + is-arrayish@0.3.2: + optional: true + is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 @@ -17436,6 +18958,8 @@ snapshots: is-in-browser@1.1.3: {} + is-interactive@1.0.0: {} + is-interactive@2.0.0: {} is-lambda@1.0.1: {} @@ -17515,6 +19039,8 @@ snapshots: is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} is-weakmap@2.0.2: {} @@ -17567,7 +19093,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -17586,6 +19112,12 @@ snapshots: reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -17629,16 +19161,16 @@ snapshots: transitivePeerDependencies: - supports-color - jest-cli@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)): + jest-cli@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -17650,16 +19182,16 @@ snapshots: - ts-node - utf-8-validate - jest-cli@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-cli@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.2.0 - jest-config: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-config: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 @@ -17671,7 +19203,7 @@ snapshots: - ts-node - utf-8-validate - jest-config@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)): + jest-config@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 27.5.1 @@ -17698,14 +19230,14 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@types/node@16.18.119)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3) transitivePeerDependencies: - bufferutil - canvas - supports-color - utf-8-validate - jest-config@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-config@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 27.5.1 @@ -17732,7 +19264,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3) transitivePeerDependencies: - bufferutil - canvas @@ -18002,7 +19534,7 @@ snapshots: jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 16.18.119 + '@types/node': 18.19.64 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -18017,11 +19549,11 @@ snapshots: leven: 3.1.0 pretty-format: 27.5.1 - jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3))): + jest-watch-typeahead@1.1.0(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3))): dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 - jest: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) jest-regex-util: 28.0.2 jest-watcher: 28.1.3 slash: 4.0.0 @@ -18042,7 +19574,7 @@ snapshots: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 16.18.119 + '@types/node': 18.19.64 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -18051,27 +19583,27 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@28.1.3: dependencies: - '@types/node': 16.18.119 + '@types/node': 18.19.64 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)): + jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest-cli: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) transitivePeerDependencies: - bufferutil - canvas @@ -18079,11 +19611,11 @@ snapshots: - ts-node - utf-8-validate - jest@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)): dependencies: - '@jest/core': 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + '@jest/core': 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) import-local: 3.2.0 - jest-cli: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-cli: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) transitivePeerDependencies: - bufferutil - canvas @@ -18101,17 +19633,9 @@ snapshots: '@sideway/formula': 3.0.1 '@sideway/pinpoint': 2.0.0 - joycon@3.1.1: {} - - js-beautify@1.15.1: - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 10.4.5 - js-cookie: 3.0.5 - nopt: 7.2.1 + jose@5.9.6: {} - js-cookie@3.0.5: {} + joycon@3.1.1: {} js-git@0.7.8: dependencies: @@ -18296,16 +19820,6 @@ snapshots: object.assign: 4.1.5 object.values: 1.2.0 - juice@10.0.1(encoding@0.1.13): - dependencies: - cheerio: 1.0.0-rc.12 - commander: 6.2.1 - mensch: 0.3.4 - slick: 1.12.2 - web-resource-inliner: 6.0.1(encoding@0.1.13) - transitivePeerDependencies: - - encoding - jw-paginate@1.0.4: {} keyv@4.5.4: @@ -18318,6 +19832,8 @@ snapshots: klona@2.0.6: {} + kysely@0.27.4: {} + language-subtag-registry@0.3.23: {} language-tags@1.0.9: @@ -18333,6 +19849,8 @@ snapshots: lazy@1.0.11: {} + leac@0.6.0: {} + leven@3.1.0: {} levn@0.3.0: @@ -18462,6 +19980,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + log-symbols@5.1.0: dependencies: chalk: 5.3.0 @@ -18479,8 +20002,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lower-case@1.1.4: {} - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -18562,25 +20083,32 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - material-ui-confirm@3.0.16(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + marked@7.0.4: {} + + material-ui-confirm@3.0.16(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) - material-ui-pickers@2.2.4(@material-ui/core@3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + material-ui-pickers@2.2.4(@material-ui/core@3.9.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@material-ui/core': 3.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@material-ui/core': 3.9.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/react-text-mask': 5.4.14 clsx: 1.2.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-event-listener: 0.6.6(react@18.3.1) - react-text-mask: 5.5.0(react@18.3.1) - react-transition-group: 2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-event-listener: 0.6.6(react@18.2.0) + react-text-mask: 5.5.0(react@18.2.0) + react-transition-group: 2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) tslib: 1.14.1 + md-to-react-email@5.0.5(react@18.3.1): + dependencies: + marked: 7.0.4 + react: 18.3.1 + mdn-data@2.0.14: {} mdn-data@2.0.4: {} @@ -18589,6 +20117,11 @@ snapshots: media-typer@0.3.0: {} + memfs-browser@3.5.10302: + dependencies: + memfs: 3.5.3 + optional: true + memfs@3.5.3: dependencies: fs-monkey: 1.0.6 @@ -18597,8 +20130,6 @@ snapshots: memoize-one@6.0.0: {} - mensch@0.3.4: {} - meow@8.1.2: dependencies: '@types/minimist': 1.2.5 @@ -18647,8 +20178,6 @@ snapshots: mime@1.6.0: {} - mime@2.6.0: {} - mime@3.0.0: {} mimic-fn@2.1.0: {} @@ -18657,11 +20186,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.2(webpack@5.96.1): + mini-css-extract-plugin@2.9.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) minimalistic-assert@1.0.1: {} @@ -18677,374 +20206,73 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.1: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minio@7.1.4: - dependencies: - async: 3.2.6 - block-stream2: 2.1.0 - browser-or-node: 2.1.1 - buffer-crc32: 1.0.0 - eventemitter3: 5.0.1 - fast-xml-parser: 4.5.0 - ipaddr.js: 2.2.0 - lodash: 4.17.21 - mime-types: 2.1.35 - query-string: 7.1.3 - stream-json: 1.9.0 - through2: 4.0.2 - web-encoding: 1.1.5 - xml2js: 0.5.0 - - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.2 - - minipass-fetch@3.0.5: - dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@4.2.8: {} - - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mjml-accordion@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-body@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-button@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-carousel@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-cli@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - chokidar: 3.6.0 - glob: 10.4.5 - html-minifier: 4.0.0 - js-beautify: 1.15.1 - lodash: 4.17.21 - minimatch: 9.0.5 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - mjml-validator: 4.15.3 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - mjml-column@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-core@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - cheerio: 1.0.0-rc.12 - detect-node: 2.1.0 - html-minifier: 4.0.0 - js-beautify: 1.15.1 - juice: 10.0.1(encoding@0.1.13) - lodash: 4.17.21 - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - mjml-validator: 4.15.3 - transitivePeerDependencies: - - encoding - - mjml-divider@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-group@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-attributes@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-breakpoint@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-font@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-html-attributes@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-preview@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-style@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head-title@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-head@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-hero@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-image@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-migrate@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - js-beautify: 1.15.1 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-parser-xml: 4.15.3 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - mjml-navbar@4.15.3(encoding@0.1.13): - dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - mjml-parser-xml@4.15.3: - dependencies: - '@babel/runtime': 7.26.0 - detect-node: 2.1.0 - htmlparser2: 9.1.0 - lodash: 4.17.21 - - mjml-preset-core@4.15.3(encoding@0.1.13): + minimatch@9.0.5: dependencies: - '@babel/runtime': 7.26.0 - mjml-accordion: 4.15.3(encoding@0.1.13) - mjml-body: 4.15.3(encoding@0.1.13) - mjml-button: 4.15.3(encoding@0.1.13) - mjml-carousel: 4.15.3(encoding@0.1.13) - mjml-column: 4.15.3(encoding@0.1.13) - mjml-divider: 4.15.3(encoding@0.1.13) - mjml-group: 4.15.3(encoding@0.1.13) - mjml-head: 4.15.3(encoding@0.1.13) - mjml-head-attributes: 4.15.3(encoding@0.1.13) - mjml-head-breakpoint: 4.15.3(encoding@0.1.13) - mjml-head-font: 4.15.3(encoding@0.1.13) - mjml-head-html-attributes: 4.15.3(encoding@0.1.13) - mjml-head-preview: 4.15.3(encoding@0.1.13) - mjml-head-style: 4.15.3(encoding@0.1.13) - mjml-head-title: 4.15.3(encoding@0.1.13) - mjml-hero: 4.15.3(encoding@0.1.13) - mjml-image: 4.15.3(encoding@0.1.13) - mjml-navbar: 4.15.3(encoding@0.1.13) - mjml-raw: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) - mjml-social: 4.15.3(encoding@0.1.13) - mjml-spacer: 4.15.3(encoding@0.1.13) - mjml-table: 4.15.3(encoding@0.1.13) - mjml-text: 4.15.3(encoding@0.1.13) - mjml-wrapper: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + brace-expansion: 2.0.1 - mjml-raw@4.15.3(encoding@0.1.13): + minimist-options@4.1.0: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} - mjml-section@4.15.3(encoding@0.1.13): + minio@7.1.4: dependencies: - '@babel/runtime': 7.26.0 + async: 3.2.6 + block-stream2: 2.1.0 + browser-or-node: 2.1.1 + buffer-crc32: 1.0.0 + eventemitter3: 5.0.1 + fast-xml-parser: 4.5.0 + ipaddr.js: 2.2.0 lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + mime-types: 2.1.35 + query-string: 7.1.3 + stream-json: 1.9.0 + through2: 4.0.2 + web-encoding: 1.1.5 + xml2js: 0.5.0 - mjml-social@4.15.3(encoding@0.1.13): + minipass-collect@2.0.1: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 7.1.2 - mjml-spacer@4.15.3(encoding@0.1.13): + minipass-fetch@3.0.5: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 - mjml-table@4.15.3(encoding@0.1.13): + minipass-flush@1.0.5: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 - mjml-text@4.15.3(encoding@0.1.13): + minipass-pipeline@1.2.4: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + minipass: 3.3.6 - mjml-validator@4.15.3: + minipass-sized@1.0.3: dependencies: - '@babel/runtime': 7.26.0 + minipass: 3.3.6 - mjml-wrapper@4.15.3(encoding@0.1.13): + minipass@3.3.6: dependencies: - '@babel/runtime': 7.26.0 - lodash: 4.17.21 - mjml-core: 4.15.3(encoding@0.1.13) - mjml-section: 4.15.3(encoding@0.1.13) - transitivePeerDependencies: - - encoding + yallist: 4.0.0 + + minipass@4.2.8: {} + + minipass@5.0.0: {} + + minipass@7.1.2: {} - mjml@4.15.3(encoding@0.1.13): + minizlib@2.1.2: dependencies: - '@babel/runtime': 7.26.0 - mjml-cli: 4.15.3(encoding@0.1.13) - mjml-core: 4.15.3(encoding@0.1.13) - mjml-migrate: 4.15.3(encoding@0.1.13) - mjml-preset-core: 4.15.3(encoding@0.1.13) - mjml-validator: 4.15.3 - transitivePeerDependencies: - - encoding + minipass: 3.3.6 + yallist: 4.0.0 mkdirp@0.5.6: dependencies: @@ -19077,13 +20305,13 @@ snapshots: ms@2.1.3: {} - mui-image@1.0.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(prop-types@15.8.1)(react@18.3.1): + mui-image@1.0.7(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@mui/material@6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(prop-types@15.8.1)(react@18.2.0): dependencies: - '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1) - '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.13.3(@types/react@18.3.12)(react@18.2.0) + '@emotion/styled': 11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0) + '@mui/material': 6.1.6(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@emotion/styled@11.13.0(@emotion/react@11.13.3(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react@18.2.0))(@types/react@18.3.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 multicast-dns@7.2.5: dependencies: @@ -19100,7 +20328,11 @@ snapshots: nan@2.22.0: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} + + nanoid@5.0.9: {} + + nanostores@0.11.3: {} natural-compare-lite@1.4.0: {} @@ -19129,9 +20361,31 @@ snapshots: netmask@2.0.2: {} - no-case@2.3.2: + next@15.0.4(@babel/core@7.24.5)(@playwright/test@1.48.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - lower-case: 1.1.4 + '@next/env': 15.0.4 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001677 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.4 + '@next/swc-darwin-x64': 15.0.4 + '@next/swc-linux-arm64-gnu': 15.0.4 + '@next/swc-linux-arm64-musl': 15.0.4 + '@next/swc-linux-x64-gnu': 15.0.4 + '@next/swc-linux-x64-musl': 15.0.4 + '@next/swc-win32-arm64-msvc': 15.0.4 + '@next/swc-win32-x64-msvc': 15.0.4 + '@playwright/test': 1.48.2 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros no-case@3.0.4: dependencies: @@ -19188,21 +20442,20 @@ snapshots: node-releases@2.0.18: {} - nodemailer-fetch@1.6.0: {} - - nodemailer-shared@1.1.0: - dependencies: - nodemailer-fetch: 1.6.0 + nodemailer@6.9.16: {} - nodemailer-smtp-transport@2.7.4: + nodemon@3.1.9: dependencies: - nodemailer-shared: 1.1.0 - nodemailer-wellknown: 0.1.10 - smtp-connection: 2.12.0 - - nodemailer-wellknown@0.1.10: {} - - nodemailer@6.9.16: {} + chokidar: 3.6.0 + debug: 4.4.0(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.6.3 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 nopt@7.2.1: dependencies: @@ -19232,12 +20485,12 @@ snapshots: normalize-url@7.2.0: {} - notistack@3.0.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + notistack@3.0.1(csstype@3.1.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: clsx: 1.2.1 goober: 2.1.16(csstype@3.1.3) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - csstype @@ -19375,6 +20628,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + ora@6.3.1: dependencies: chalk: 5.3.0 @@ -19389,6 +20654,11 @@ snapshots: orderedmap@2.1.1: {} + oslo@1.2.1: + dependencies: + '@node-rs/argon2': 1.7.0 + '@node-rs/bcrypt': 1.9.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -19424,7 +20694,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) get-uri: 6.0.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 @@ -19444,10 +20714,6 @@ snapshots: papaparse@5.4.1: {} - param-case@2.1.1: - dependencies: - no-case: 2.3.2 - param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -19479,6 +20745,11 @@ snapshots: dependencies: entities: 4.5.0 + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + parseurl@1.3.3: {} pascal-case@3.1.2: @@ -19486,18 +20757,6 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - passport-local@1.0.0: - dependencies: - passport-strategy: 1.0.0 - - passport-strategy@1.0.0: {} - - passport@0.6.0: - dependencies: - passport-strategy: 1.0.0 - pause: 0.0.1 - utils-merge: 1.0.1 - path-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -19522,7 +20781,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.10: {} + path-to-regexp@0.1.12: {} path-to-regexp@3.3.0: {} @@ -19534,7 +20793,7 @@ snapshots: dependencies: through: 2.3.8 - pause@0.0.1: {} + peberminta@0.9.0: {} performance-now@2.1.0: {} @@ -19611,7 +20870,7 @@ snapshots: pm2-axon-rpc@0.7.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -19619,7 +20878,7 @@ snapshots: dependencies: amp: 0.3.1 amp-message: 0.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) escape-string-regexp: 4.0.0 transitivePeerDependencies: - supports-color @@ -19636,7 +20895,7 @@ snapshots: pm2-sysmonit@1.2.8: dependencies: async: 3.2.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) pidusage: 2.0.21 systeminformation: 5.23.5 tx2: 1.0.5 @@ -19658,7 +20917,7 @@ snapshots: commander: 2.15.1 croner: 4.1.97 dayjs: 1.11.13 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) enquirer: 2.3.6 eventemitter2: 5.0.1 fclone: 1.0.11 @@ -19836,13 +21095,13 @@ snapshots: postcss: 8.4.47 postcss-value-parser: 4.2.0 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)): dependencies: lilconfig: 3.1.2 yaml: 2.6.0 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@16.18.119)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3) postcss-load-config@6.0.1(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0): dependencies: @@ -19853,13 +21112,13 @@ snapshots: tsx: 4.19.2 yaml: 2.6.0 - postcss-loader@6.2.1(postcss@8.4.47)(webpack@5.96.1): + postcss-loader@6.2.1(postcss@8.4.47)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) postcss-logical@5.0.4(postcss@8.4.47): dependencies: @@ -20118,9 +21377,15 @@ snapshots: picocolors: 0.2.1 source-map: 0.6.1 + postcss@8.4.31: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.4.47: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -20161,12 +21426,14 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@5.22.0: + prisma@6.0.1: dependencies: - '@prisma/engines': 5.22.0 + '@prisma/engines': 6.0.1 optionalDependencies: fsevents: 2.3.3 + prismjs@1.29.0: {} + proc-log@4.2.0: {} process-nextick-args@2.0.1: {} @@ -20306,8 +21573,6 @@ snapshots: prosemirror-state: 1.4.3 prosemirror-transform: 1.10.2 - proto-list@1.2.4: {} - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -20316,7 +21581,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 7.18.3 @@ -20334,10 +21599,18 @@ snapshots: psl@1.9.0: {} + pstree.remy@1.1.8: {} + punycode.js@2.3.1: {} punycode@2.3.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.3: {} + q@1.5.1: {} qs@6.13.0: @@ -20443,7 +21716,7 @@ snapshots: react-onclickoutside: 6.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@babel/code-frame': 7.26.2 address: 1.2.2 @@ -20454,7 +21727,7 @@ snapshots: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -20469,7 +21742,7 @@ snapshots: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -20477,31 +21750,65 @@ snapshots: - supports-color - vue-template-compiler + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.2 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - react-draggable@4.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-draggable@4.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: clsx: 1.2.1 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + react-email@3.0.4(@playwright/test@1.48.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + chalk: 4.1.2 + chokidar: 4.0.1 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.19.11 + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 15.0.4(@babel/core@7.24.5)(@playwright/test@1.48.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + normalize-path: 3.0.0 + ora: 5.4.1 + socket.io: 4.8.0 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - babel-plugin-react-compiler + - bufferutil + - react + - react-dom + - sass + - supports-color + - utf-8-validate - react-error-boundary@4.1.2(react@18.3.1): + react-error-boundary@4.1.2(react@18.2.0): dependencies: '@babel/runtime': 7.26.0 - react: 18.3.1 + react: 18.2.0 react-error-overlay@6.0.11: {} - react-event-listener@0.6.6(react@18.3.1): + react-event-listener@0.6.6(react@18.2.0): dependencies: '@babel/runtime': 7.26.0 prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 warning: 4.0.3 react-fast-compare@2.0.4: {} @@ -20522,14 +21829,14 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-i18next@13.5.0(i18next@23.16.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-i18next@13.5.0(i18next@23.16.4)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.26.0 html-parse-stringify: 3.0.1 i18next: 23.16.4 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 18.2.0(react@18.2.0) react-is@16.13.1: {} @@ -20563,6 +21870,10 @@ snapshots: react-fast-compare: 3.2.2 warning: 4.0.3 + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + react-redux@8.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): dependencies: '@babel/runtime': 7.26.0 @@ -20582,6 +21893,13 @@ snapshots: react-refresh@0.14.2: {} + react-router-dom@6.27.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@remix-run/router': 1.20.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.27.0(react@18.2.0) + react-router-dom@6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.20.0 @@ -20589,61 +21907,66 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-router: 6.27.0(react@18.3.1) + react-router@6.27.0(react@18.2.0): + dependencies: + '@remix-run/router': 1.20.0 + react: 18.2.0 + react-router@6.27.0(react@18.3.1): dependencies: '@remix-run/router': 1.20.0 react: 18.3.1 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3))(type-fest@2.19.0)(typescript@5.6.3): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/babel__core@7.20.5)(@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0))(esbuild@0.24.0)(eslint@8.57.1)(react@18.2.0)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3))(type-fest@2.19.0)(typescript@5.6.3): dependencies: '@babel/core': 7.26.0 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.96.1))(webpack@5.96.1) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(@types/webpack@5.28.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0))(react-refresh@0.11.0)(type-fest@2.19.0)(webpack-dev-server@4.15.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)))(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.26.0) - babel-loader: 8.4.1(@babel/core@7.26.0)(webpack@5.96.1) + babel-loader: 8.4.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.26.0) babel-preset-react-app: 10.0.1 bfj: 7.1.0 browserslist: 4.24.2 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.96.1) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.96.1) + css-loader: 6.11.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + css-minimizer-webpack-plugin: 3.4.1(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.96.1) - file-loader: 6.2.0(webpack@5.96.1) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)))(typescript@5.6.3) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + file-loader: 6.2.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) fs-extra: 10.1.0 - html-webpack-plugin: 5.6.3(webpack@5.96.1) + html-webpack-plugin: 5.6.3(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) identity-obj-proxy: 3.0.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) jest-resolve: 27.5.1 - jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3))) - mini-css-extract-plugin: 2.9.2(webpack@5.96.1) + jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3))) + mini-css-extract-plugin: 2.9.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) postcss: 8.4.47 postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.96.1) + postcss-loader: 6.2.1(postcss@8.4.47)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) postcss-normalize: 10.0.1(browserslist@4.24.2)(postcss@8.4.47) postcss-preset-env: 7.8.3(postcss@8.4.47) prompts: 2.4.2 - react: 18.3.1 + react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) react-refresh: 0.11.0 resolve: 1.22.8 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.96.1) + sass-loader: 12.6.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) semver: 7.6.3 - source-map-loader: 3.0.2(webpack@5.96.1) - style-loader: 3.3.4(webpack@5.96.1) - tailwindcss: 3.4.14(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) - terser-webpack-plugin: 5.3.10(webpack@5.96.1) - webpack: 5.96.1 - webpack-dev-server: 4.15.2(webpack@5.96.1) - webpack-manifest-plugin: 4.1.1(webpack@5.96.1) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1) + source-map-loader: 3.0.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + style-loader: 3.3.4(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + tailwindcss: 3.4.14(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) + webpack-dev-server: 4.15.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + webpack-manifest-plugin: 4.1.1(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) optionalDependencies: fsevents: 2.3.3 typescript: 5.6.3 @@ -20698,20 +22021,34 @@ snapshots: - '@types/react' - supports-color + react-text-mask@5.5.0(react@18.2.0): + dependencies: + prop-types: 15.8.1 + react: 18.2.0 + react-text-mask@5.5.0(react@18.3.1): dependencies: prop-types: 15.8.1 react: 18.3.1 - react-transition-group@2.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-transition-group@2.9.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: dom-helpers: 3.4.0 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-lifecycles-compat: 3.0.4 + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@babel/runtime': 7.26.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.26.0 @@ -20721,9 +22058,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-use-event@1.1.1(react@18.3.1): + react-use-event@1.1.1(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 react@18.3.1: dependencies: @@ -20774,20 +22115,20 @@ snapshots: real-require@0.2.0: {} - recoil@0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + recoil@0.7.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: hamt_plus: 1.0.2 - react: 18.3.1 + react: 18.2.0 optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + react-dom: 18.2.0(react@18.2.0) - recompose@0.30.0(react@18.3.1): + recompose@0.30.0(react@18.2.0): dependencies: '@babel/runtime': 7.26.0 change-emitter: 0.1.6 fbjs: 0.8.18 hoist-non-react-statics: 2.5.5 - react: 18.3.1 + react: 18.2.0 react-lifecycles-compat: 3.0.4 symbol-observable: 1.2.0 @@ -20888,7 +22229,7 @@ snapshots: require-in-the-middle@5.2.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -20934,6 +22275,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 @@ -21011,17 +22357,19 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.4 fsevents: 2.3.3 - rooks@7.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + rooks@7.14.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: fast-deep-equal: 3.1.3 lodash.debounce: 4.0.8 raf: 3.4.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-sync-external-store: 1.2.2(react@18.2.0) rope-sequence@1.3.4: {} + rou3@0.5.1: {} + rst-selector-parser@2.2.3: dependencies: lodash.flattendeep: 4.4.0 @@ -21060,11 +22408,11 @@ snapshots: sanitize.css@13.0.0: {} - sass-loader@12.6.0(webpack@5.96.1): + sass-loader@12.6.0(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) sax@1.2.4: {} @@ -21103,6 +22451,10 @@ snapshots: ajv-formats: 2.1.1(ajv@8.17.1) ajv-keywords: 5.1.0(ajv@8.17.1) + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + select-hose@2.0.0: {} selfsigned@2.4.1: @@ -21199,6 +22551,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -21227,6 +22581,33 @@ snapshots: shallowequal@1.1.0: {} + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -21235,10 +22616,10 @@ snapshots: shell-quote@1.8.1: {} - shiitake@3.0.2(react@18.3.1): + shiitake@3.0.2(react@18.2.0): dependencies: prop-types: 15.8.1 - react: 18.3.1 + react: 18.2.0 shimmer@1.2.1: {} @@ -21253,6 +22634,15 @@ snapshots: signal-exit@4.1.0: {} + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.6.3 + sisteransi@1.0.5: {} slash@2.0.0: {} @@ -21268,22 +22658,45 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - slick@1.12.2: {} - smart-buffer@4.2.0: {} smob@1.5.0: {} - smtp-connection@2.12.0: - dependencies: - httpntlm: 1.6.1 - nodemailer-shared: 1.1.0 - snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.8.1 + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.0: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.2 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -21293,7 +22706,7 @@ snapshots: socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -21311,12 +22724,12 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@3.0.2(webpack@5.96.1): + source-map-loader@3.0.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) source-map-support@0.5.21: dependencies: @@ -21351,7 +22764,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -21362,7 +22775,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -21405,7 +22818,7 @@ snapshots: arg: 5.0.2 bluebird: 3.7.2 check-more-types: 2.24.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7 execa: 5.1.1 lazy-ass: 1.6.0 ps-tree: 1.2.0 @@ -21439,6 +22852,8 @@ snapshots: dependencies: stream-chain: 2.2.5 + streamsearch@1.1.0: {} + strict-uri-encode@2.0.0: {} string-argv@0.3.2: {} @@ -21553,11 +22968,11 @@ snapshots: strnum@1.0.5: {} - style-loader@3.3.4(webpack@5.96.1): + style-loader@3.3.4(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) - styled-components@5.3.9(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): + styled-components@5.3.9(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0): dependencies: '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) '@babel/traverse': 7.25.9(supports-color@5.5.0) @@ -21567,14 +22982,21 @@ snapshots: babel-plugin-styled-components: 2.1.4(@babel/core@7.26.0)(styled-components@5.3.9(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) react-is: 18.3.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: - '@babel/core' + styled-jsx@5.1.6(@babel/core@7.24.5)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 + styled-system@5.1.5: dependencies: '@styled-system/background': 5.1.2 @@ -21663,7 +23085,7 @@ snapshots: systeminformation@5.23.5: optional: true - tailwindcss@3.4.14(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)): + tailwindcss@3.4.14(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -21682,7 +23104,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -21717,14 +23139,17 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.10(webpack@5.96.1): + terser-webpack-plugin@5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.13) + esbuild: 0.24.0 terser@5.36.0: dependencies: @@ -21800,6 +23225,8 @@ snapshots: toposort@2.0.2: {} + touch@3.1.1: {} + tough-cookie@4.1.4: dependencies: psl: 1.9.0 @@ -21821,7 +23248,7 @@ snapshots: trim-newlines@3.0.1: {} - trpc-openapi@1.2.0(@trpc/server@10.45.2)(@types/express@5.0.0)(@types/node@20.5.1)(zod@3.23.8): + trpc-openapi@1.2.0(@trpc/server@10.45.2)(@types/express@5.0.0)(@types/node@20.5.1)(zod@3.24.1): dependencies: '@trpc/server': 10.45.2 co-body: 6.2.0 @@ -21829,8 +23256,8 @@ snapshots: lodash.clonedeep: 4.5.0 node-mocks-http: 1.16.1(@types/express@5.0.0)(@types/node@20.5.1) openapi-types: 12.1.3 - zod: 3.23.8 - zod-to-json-schema: 3.23.5(zod@3.23.8) + zod: 3.24.1 + zod-to-json-schema: 3.23.5(zod@3.24.1) transitivePeerDependencies: - '@types/express' - '@types/node' @@ -21843,11 +23270,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@27.1.5(@babel/core@7.26.0)(@types/jest@26.0.24)(babel-jest@27.5.1(@babel/core@7.26.0))(jest@27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3): + ts-jest@27.1.5(@babel/core@7.26.0)(@types/jest@26.0.24)(babel-jest@27.5.1(@babel/core@7.26.0))(esbuild@0.24.0)(jest@27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 27.5.1(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest: 27.5.1(ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3)) jest-util: 27.5.1 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -21859,8 +23286,9 @@ snapshots: '@babel/core': 7.26.0 '@types/jest': 26.0.24 babel-jest: 27.5.1(@babel/core@7.26.0) + esbuild: 0.24.0 - ts-node@10.9.2(@types/node@16.18.119)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@16.18.119)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -21877,8 +23305,10 @@ snapshots: typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.13) - ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.3.101(@swc/helpers@0.5.13))(@types/node@20.5.1)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -21895,6 +23325,8 @@ snapshots: typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.13) tsconfig-paths@3.15.0: dependencies: @@ -21909,13 +23341,13 @@ snapshots: tslib@2.8.1: {} - tsup@8.3.5(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): + tsup@8.3.5(@swc/core@1.3.101(@swc/helpers@0.5.13))(jiti@1.21.6)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -21928,6 +23360,7 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: + '@swc/core': 1.3.101(@swc/helpers@0.5.13) postcss: 8.4.47 typescript: 5.6.3 transitivePeerDependencies: @@ -21948,32 +23381,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.2.3: + turbo-darwin-64@2.3.3: optional: true - turbo-darwin-arm64@2.2.3: + turbo-darwin-arm64@2.3.3: optional: true - turbo-linux-64@2.2.3: + turbo-linux-64@2.3.3: optional: true - turbo-linux-arm64@2.2.3: + turbo-linux-arm64@2.3.3: optional: true - turbo-windows-64@2.2.3: + turbo-windows-64@2.3.3: optional: true - turbo-windows-arm64@2.2.3: + turbo-windows-arm64@2.3.3: optional: true - turbo@2.2.3: + turbo@2.3.3: optionalDependencies: - turbo-darwin-64: 2.2.3 - turbo-darwin-arm64: 2.2.3 - turbo-linux-64: 2.2.3 - turbo-linux-arm64: 2.2.3 - turbo-windows-64: 2.2.3 - turbo-windows-arm64: 2.2.3 + turbo-darwin-64: 2.3.3 + turbo-darwin-arm64: 2.3.3 + turbo-linux-64: 2.3.3 + turbo-linux-arm64: 2.3.3 + turbo-windows-64: 2.3.3 + turbo-windows-arm64: 2.3.3 tv4@1.3.0: {} @@ -22057,8 +23490,6 @@ snapshots: ufo@1.5.4: {} - uglify-js@3.19.3: {} - uid-safe@2.1.5: dependencies: random-bytes: 1.0.0 @@ -22072,9 +23503,9 @@ snapshots: uncrypto@0.1.3: {} - underscore@1.12.1: {} + undefsafe@2.0.5: {} - underscore@1.7.0: {} + underscore@1.12.1: {} undici-types@5.26.5: {} @@ -22136,8 +23567,6 @@ snapshots: dependencies: tslib: 2.8.1 - upper-case@1.1.3: {} - upper-case@2.0.2: dependencies: tslib: 2.8.1 @@ -22158,9 +23587,9 @@ snapshots: optionalDependencies: re2: 1.21.4 - use-debounce@10.0.4(react@18.3.1): + use-debounce@10.0.4(react@18.2.0): dependencies: - react: 18.3.1 + react: 18.2.0 use-isomorphic-layout-effect@1.1.2(@types/react@18.3.12)(react@18.3.1): dependencies: @@ -22172,6 +23601,10 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.2.2(react@18.2.0): + dependencies: + react: 18.2.0 + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -22209,8 +23642,6 @@ snapshots: convert-source-map: 1.9.0 source-map: 0.7.4 - valid-data-url@3.0.1: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -22277,7 +23708,7 @@ snapshots: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -22312,17 +23743,6 @@ snapshots: optionalDependencies: '@zxing/text-encoding': 0.9.0 - web-resource-inliner@6.0.1(encoding@0.1.13): - dependencies: - ansi-colors: 4.1.3 - escape-goat: 3.0.0 - htmlparser2: 5.0.1 - mime: 2.6.0 - node-fetch: 2.7.0(encoding@0.1.13) - valid-data-url: 3.0.1 - transitivePeerDependencies: - - encoding - webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} @@ -22331,16 +23751,16 @@ snapshots: webidl-conversions@6.1.0: {} - webpack-dev-middleware@5.3.4(webpack@5.96.1): + webpack-dev-middleware@5.3.4(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) - webpack-dev-server@4.15.2(webpack@5.96.1): + webpack-dev-server@4.15.2(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -22356,7 +23776,7 @@ snapshots: compression: 1.7.5 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.21.1 + express: 4.21.2 graceful-fs: 4.2.11 html-entities: 2.5.2 http-proxy-middleware: 2.0.7(@types/express@4.17.21) @@ -22370,20 +23790,20 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.96.1) + webpack-dev-middleware: 5.3.4(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) ws: 8.18.0 optionalDependencies: - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.96.1): + webpack-manifest-plugin@4.1.1(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: tapable: 2.2.1 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) webpack-sources: 2.3.1 webpack-sources@1.4.3: @@ -22398,7 +23818,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.96.1: + webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -22420,7 +23840,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.96.1) + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -22631,12 +24051,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.96.1 + webpack: 5.96.1(@swc/core@1.3.101(@swc/helpers@0.5.13))(esbuild@0.24.0) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -22671,6 +24091,8 @@ snapshots: ws@7.5.10: {} + ws@8.17.1: {} + ws@8.18.0: {} xml-name-validator@3.0.0: {} @@ -22740,8 +24162,13 @@ snapshots: toposort: 2.0.2 type-fest: 2.19.0 - zod-to-json-schema@3.23.5(zod@3.23.8): + zod-to-json-schema@3.23.5(zod@3.24.1): dependencies: - zod: 3.23.8 + zod: 3.24.1 + + zod@3.24.1: {} - zod@3.23.8: {} + zx@8.2.4: + optionalDependencies: + '@types/fs-extra': 11.0.4 + '@types/node': 20.5.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 286cf7f5..d0274024 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,14 @@ packages: - apps/* - packages/* + +catalog: + typescript: ^5.6.3 + zod: ^3.23.8 + +catalogs: + react18: + react: 18.2.0 + react-dom: 18.2.0 + "@types/react": ^18.3.11 + "@types/react-dom": ^18.3.1 diff --git a/turbo.json b/turbo.json index 632c9f3b..d3404a50 100644 --- a/turbo.json +++ b/turbo.json @@ -12,25 +12,33 @@ }, "lint": {}, "dev": { + "dependsOn": [ + "^dev" + ], "cache": false, - "persistent": true + "persistent": false }, "clean": { "cache": false } }, "globalEnv": [ + "BASE_URL", "NODE_ENV", "DATABASE_URL", "REDIS_URL", - "COOKIE_SECRET", - "COOKIE_DOMAIN", - "COOKIE_NAME", - "COOKIE_SECURE", "STORAGE_URL", "STORAGE_BUCKET", "STORAGE_ACCESS_KEY", - "STORAGE_SECRET_KEY" + "STORAGE_SECRET_KEY", + "BETTER_AUTH_SECRET", + "BETTER_AUTH_URL", + "SMTP_HOST", + "SMTP_PORT", + "SMTP_SECURE", + "SMTP_USER", + "SMTP_PASSWORD", + "SMTP_EMAIL_FROM" ], "globalPassThroughEnv": [ "NODE_ENV",