From b4f1a5abce095f818d1319caf3f468d569e767ed Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 16 Nov 2023 07:10:13 +0000 Subject: [PATCH 01/51] feat: handle download file error with toast --- .../documents/data-table-action-button.tsx | 67 +++++++++++-------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index 17b577c13..0d767d388 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -12,6 +12,7 @@ import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { Button } from '@documenso/ui/primitives/button'; +import { toast } from '@documenso/ui/primitives/use-toast'; export type DataTableActionButtonProps = { row: Document & { @@ -37,38 +38,48 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; const onDownloadClick = async () => { - let document: DocumentWithData | null = null; + try { + let document: DocumentWithData | null = null; - if (!recipient) { - document = await trpcClient.document.getDocumentById.query({ - id: row.id, + if (!recipient) { + document = await trpcClient.document.getDocumentById.query({ + id: row.id, + }); + } else { + document = await trpcClient.document.getDocumentByToken.query({ + token: recipient.token, + }); + } + + const documentData = document?.documentData; + + console.log(documentData); + + if (!documentData) { + return; + } + + const documentBytes = await getFile({ data: documentData.data, type: documentData.type }); + + const blob = new Blob([documentBytes], { + type: 'application/pdf', }); - } else { - document = await trpcClient.document.getDocumentByToken.query({ - token: recipient.token, + + const link = window.document.createElement('a'); + + link.href = window.URL.createObjectURL(blob); + link.download = row.title || 'document.pdf'; + + link.click(); + + window.URL.revokeObjectURL(link.href); + } catch (error) { + toast({ + title: 'Something went wrong', + description: 'An error occurred while trying to download file.', + variant: 'destructive', }); } - - const documentData = document?.documentData; - - if (!documentData) { - return; - } - - const documentBytes = await getFile(documentData); - - const blob = new Blob([documentBytes], { - type: 'application/pdf', - }); - - const link = window.document.createElement('a'); - - link.href = window.URL.createObjectURL(blob); - link.download = row.title || 'document.pdf'; - - link.click(); - - window.URL.revokeObjectURL(link.href); }; return match({ From a8d49bb8b832e812bb8a53162034b78f7e19ad44 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Mon, 20 Nov 2023 10:01:34 +0200 Subject: [PATCH 02/51] chore: added Documenso video walkthrough (#665) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e6f050d8d..96dfbd603 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,12 @@ git clone https://github.com/documenso/documenso We support DevContainers for VSCode. [Click here to get started.](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/documenso/documenso) +### Video walkthrough + +If you're a visual learner and prefer to watch a video walkthrough of setting up Documenso locally, check out this video: + +[![Watch the video](https://img.youtube.com/vi/Y0ppIQrEnZs/hqdefault.jpg)](https://youtu.be/Y0ppIQrEnZs) + ## Docker 🚧 Docker containers and images are current in progress. We are actively working on bringing a simple Docker build and publish pipeline for Documenso. From 17eeaa2d2548dfd77e594b2b155bf09ada223d47 Mon Sep 17 00:00:00 2001 From: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> Date: Mon, 20 Nov 2023 15:53:27 +0530 Subject: [PATCH 03/51] fix: improve the validation message for documenso app (#640) * fix: improve the validation message * fix: improve the validation message --------- Co-authored-by: Catalin Pit --- apps/web/src/components/forms/password.tsx | 15 ++++++++++++--- apps/web/src/components/forms/signin.tsx | 2 +- apps/web/src/components/forms/signup.tsx | 6 +++++- .../primitives/document-flow/add-signers.types.ts | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/forms/password.tsx b/apps/web/src/components/forms/password.tsx index 5df5005f1..47cba1e88 100644 --- a/apps/web/src/components/forms/password.tsx +++ b/apps/web/src/components/forms/password.tsx @@ -20,9 +20,18 @@ import { FormErrorMessage } from '../form/form-error-message'; export const ZPasswordFormSchema = z .object({ - currentPassword: z.string().min(6).max(72), - password: z.string().min(6).max(72), - repeatedPassword: z.string().min(6).max(72), + currentPassword: z + .string() + .min(6, { message: 'Password should contain at least 6 characters' }) + .max(72, { message: 'Password should not contain more than 72 characters' }), + password: z + .string() + .min(6, { message: 'Password should contain at least 6 characters' }) + .max(72, { message: 'Password should not contain more than 72 characters' }), + repeatedPassword: z + .string() + .min(6, { message: 'Password should contain at least 6 characters' }) + .max(72, { message: 'Password should not contain more than 72 characters' }), }) .refine((data) => data.password === data.repeatedPassword, { message: 'Passwords do not match', diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index 43801038d..abdc1efe6 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -28,7 +28,7 @@ const LOGIN_REDIRECT_PATH = '/documents'; export const ZSignInFormSchema = z.object({ email: z.string().email().min(1), - password: z.string().min(6).max(72), + password: z.string().min(6, { message: 'Invalid password' }).max(72), }); export type TSignInFormSchema = z.infer; diff --git a/apps/web/src/components/forms/signup.tsx b/apps/web/src/components/forms/signup.tsx index fc85510f3..11068ac68 100644 --- a/apps/web/src/components/forms/signup.tsx +++ b/apps/web/src/components/forms/signup.tsx @@ -21,7 +21,10 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; export const ZSignUpFormSchema = z.object({ name: z.string().trim().min(1, { message: 'Please enter a valid name.' }), email: z.string().email().min(1), - password: z.string().min(6).max(72), + password: z + .string() + .min(6, { message: 'Password should contain at least 6 characters' }) + .max(72, { message: 'Password should not contain more than 72 characters' }), signature: z.string().min(1, { message: 'We need your signature to sign documents' }), }); @@ -134,6 +137,7 @@ export const SignUpForm = ({ className }: SignUpFormProps) => { )} +
diff --git a/packages/ui/primitives/document-flow/add-signers.types.ts b/packages/ui/primitives/document-flow/add-signers.types.ts index 3dabd67e5..fc063ea3c 100644 --- a/packages/ui/primitives/document-flow/add-signers.types.ts +++ b/packages/ui/primitives/document-flow/add-signers.types.ts @@ -6,7 +6,7 @@ export const ZAddSignersFormSchema = z z.object({ formId: z.string().min(1), nativeId: z.number().optional(), - email: z.string().min(1).email(), + email: z.string().email().min(1), name: z.string(), }), ), From 6c73453542eb6e90607824e01c0e77b65c2f18e5 Mon Sep 17 00:00:00 2001 From: Bilal Ahmad Bhat Date: Mon, 20 Nov 2023 16:23:57 +0530 Subject: [PATCH 04/51] #666 feat: disabled resend button for recipients (#667) --- .../(dashboard)/documents/_action-items/resend-document.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx index 056d6f3b0..7fabeef95 100644 --- a/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/_action-items/resend-document.tsx @@ -4,6 +4,7 @@ import { useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { History } from 'lucide-react'; +import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import * as z from 'zod'; @@ -54,11 +55,14 @@ export const ResendDocumentActionItem = ({ document, recipients, }: ResendDocumentActionItemProps) => { + const { data: session } = useSession(); const { toast } = useToast(); const [isOpen, setIsOpen] = useState(false); + const isOwner = document.userId === session?.user?.id; const isDisabled = + !isOwner || document.status !== 'PENDING' || !recipients.some((r) => r.signingStatus === SigningStatus.NOT_SIGNED); From fbbc3b89c3eceef2129b03a86ed66be7b316a32a Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Tue, 21 Nov 2023 06:42:29 +0200 Subject: [PATCH 05/51] feat: email verification for registration (#599) --- .../(dashboard)/documents/upload-document.tsx | 4 +- apps/web/src/app/(dashboard)/layout.tsx | 2 + .../verify-email/[token]/page.tsx | 97 ++ .../(unauthenticated)/verify-email/page.tsx | 28 + .../layout/verify-email-banner.tsx | 123 +++ package-lock.json | 935 +++++++----------- package.json | 4 +- packages/email/package.json | 8 +- .../template-confirmation-email.tsx | 52 + packages/email/templates/confirm-email.tsx | 69 ++ packages/lib/next-auth/auth-options.ts | 4 + .../auth/send-confirmation-email.ts | 56 ++ .../user/generate-confirmation-token.ts | 41 + .../user/send-confirmation-token.ts | 41 + packages/lib/server-only/user/verify-email.ts | 70 ++ .../migration.sql | 17 + .../migration.sql | 3 + packages/prisma/schema.prisma | 13 +- packages/trpc/server/auth-router/router.ts | 7 +- packages/trpc/server/profile-router/router.ts | 23 + packages/trpc/server/profile-router/schema.ts | 5 + 21 files changed, 1004 insertions(+), 598 deletions(-) create mode 100644 apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx create mode 100644 apps/web/src/app/(unauthenticated)/verify-email/page.tsx create mode 100644 apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx create mode 100644 packages/email/template-components/template-confirmation-email.tsx create mode 100644 packages/email/templates/confirm-email.tsx create mode 100644 packages/lib/server-only/auth/send-confirmation-email.ts create mode 100644 packages/lib/server-only/user/generate-confirmation-token.ts create mode 100644 packages/lib/server-only/user/send-confirmation-token.ts create mode 100644 packages/lib/server-only/user/verify-email.ts create mode 100644 packages/prisma/migrations/20231025074705_add_email_confirmation_registration/migration.sql create mode 100644 packages/prisma/migrations/20231031072857_verify_existing_users/migration.sql diff --git a/apps/web/src/app/(dashboard)/documents/upload-document.tsx b/apps/web/src/app/(dashboard)/documents/upload-document.tsx index 644c9017a..9963d072a 100644 --- a/apps/web/src/app/(dashboard)/documents/upload-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/upload-document.tsx @@ -6,6 +6,7 @@ import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { Loader } from 'lucide-react'; +import { useSession } from 'next-auth/react'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { createDocumentData } from '@documenso/lib/server-only/document-data/create-document-data'; @@ -22,6 +23,7 @@ export type UploadDocumentProps = { export const UploadDocument = ({ className }: UploadDocumentProps) => { const router = useRouter(); + const { data: session } = useSession(); const { toast } = useToast(); @@ -79,7 +81,7 @@ export const UploadDocument = ({ className }: UploadDocumentProps) => {
diff --git a/apps/web/src/app/(dashboard)/layout.tsx b/apps/web/src/app/(dashboard)/layout.tsx index a65211b2e..433aeb18c 100644 --- a/apps/web/src/app/(dashboard)/layout.tsx +++ b/apps/web/src/app/(dashboard)/layout.tsx @@ -9,6 +9,7 @@ import { NEXT_AUTH_OPTIONS } from '@documenso/lib/next-auth/auth-options'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { Header } from '~/components/(dashboard)/layout/header'; +import { VerifyEmailBanner } from '~/components/(dashboard)/layout/verify-email-banner'; import { RefreshOnFocus } from '~/components/(dashboard)/refresh-on-focus/refresh-on-focus'; import { NextAuthProvider } from '~/providers/next-auth'; @@ -30,6 +31,7 @@ export default async function AuthenticatedDashboardLayout({ return ( + {!user.emailVerified && }
{children}
diff --git a/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx b/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx new file mode 100644 index 000000000..f671fb101 --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx @@ -0,0 +1,97 @@ +import Link from 'next/link'; + +import { AlertTriangle, CheckCircle2, XCircle, XOctagon } from 'lucide-react'; + +import { verifyEmail } from '@documenso/lib/server-only/user/verify-email'; +import { Button } from '@documenso/ui/primitives/button'; + +export type PageProps = { + params: { + token: string; + }; +}; + +export default async function VerifyEmailPage({ params: { token } }: PageProps) { + if (!token) { + return ( +
+
+ +
+ +

No token provided

+

+ It seems that there is no token provided. Please check your email and try again. +

+
+ ); + } + + const verified = await verifyEmail({ token }); + + if (verified === null) { + return ( +
+
+ +
+ +
+

Something went wrong

+ +

+ We were unable to verify your email. If your email is not verified already, please try + again. +

+ + +
+
+ ); + } + + if (!verified) { + return ( +
+
+ +
+ +
+

Your token has expired!

+ +

+ It seems that the provided token has expired. We've just sent you another token, please + check your email and try again. +

+ + +
+
+ ); + } + + return ( +
+
+ +
+ +
+

Email Confirmed!

+ +

+ Your email has been successfully confirmed! You can now use all features of Documenso. +

+ + +
+
+ ); +} diff --git a/apps/web/src/app/(unauthenticated)/verify-email/page.tsx b/apps/web/src/app/(unauthenticated)/verify-email/page.tsx new file mode 100644 index 000000000..04202d19b --- /dev/null +++ b/apps/web/src/app/(unauthenticated)/verify-email/page.tsx @@ -0,0 +1,28 @@ +import Link from 'next/link'; + +import { XCircle } from 'lucide-react'; + +import { Button } from '@documenso/ui/primitives/button'; + +export default function EmailVerificationWithoutTokenPage() { + return ( +
+
+ +
+ +
+

Uh oh! Looks like you're missing a token

+ +

+ It seems that there is no token provided, if you are trying to verify your email please + follow the link in your email. +

+ + +
+
+ ); +} diff --git a/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx new file mode 100644 index 000000000..24e47c186 --- /dev/null +++ b/apps/web/src/components/(dashboard)/layout/verify-email-banner.tsx @@ -0,0 +1,123 @@ +'use client'; + +import { useEffect, useState } from 'react'; + +import { AlertTriangle } from 'lucide-react'; + +import { ONE_SECOND } from '@documenso/lib/constants/time'; +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type VerifyEmailBannerProps = { + email: string; +}; + +const RESEND_CONFIRMATION_EMAIL_TIMEOUT = 20 * ONE_SECOND; + +export const VerifyEmailBanner = ({ email }: VerifyEmailBannerProps) => { + const { toast } = useToast(); + const [isOpen, setIsOpen] = useState(false); + + const [isButtonDisabled, setIsButtonDisabled] = useState(false); + + const { mutateAsync: sendConfirmationEmail, isLoading } = + trpc.profile.sendConfirmationEmail.useMutation(); + + const onResendConfirmationEmail = async () => { + try { + setIsButtonDisabled(true); + + await sendConfirmationEmail({ email: email }); + + toast({ + title: 'Success', + description: 'Verification email sent successfully.', + }); + + setIsOpen(false); + setTimeout(() => setIsButtonDisabled(false), RESEND_CONFIRMATION_EMAIL_TIMEOUT); + } catch (err) { + setIsButtonDisabled(false); + + toast({ + title: 'Error', + description: 'Something went wrong while sending the confirmation email.', + variant: 'destructive', + }); + } + }; + + useEffect(() => { + // Check localStorage to see if we've recently automatically displayed the dialog + // if it was within the past 24 hours, don't show it again + // otherwise, show it again and update the localStorage timestamp + const emailVerificationDialogLastShown = localStorage.getItem( + 'emailVerificationDialogLastShown', + ); + + if (emailVerificationDialogLastShown) { + const lastShownTimestamp = parseInt(emailVerificationDialogLastShown); + + if (Date.now() - lastShownTimestamp < 24 * 60 * 60 * 1000) { + return; + } + } + + setIsOpen(true); + + localStorage.setItem('emailVerificationDialogLastShown', Date.now().toString()); + }, []); + + return ( + <> +
+
+
+ + Verify your email address to unlock all features. +
+ +
+ +
+
+
+ + + + Verify your email address + + + We've sent a confirmation email to {email}. Please check your inbox and + click the link in the email to verify your account. + + +
+ +
+
+
+ + ); +}; diff --git a/package-lock.json b/package-lock.json index 72aa53273..17fa736b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1710,11 +1710,11 @@ "link": true }, "node_modules/@documenso/nodemailer-resend": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@documenso/nodemailer-resend/-/nodemailer-resend-1.0.0.tgz", - "integrity": "sha512-rG+jBbBEsVJUBU6v/2hb+OQD1m3Lhn49TOzQjln73zzL1B/sZsHhYOKpNPlTX0/FafCP7P9fKerndEeIKn54Vw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@documenso/nodemailer-resend/-/nodemailer-resend-2.0.0.tgz", + "integrity": "sha512-fbcRrJ9cWJ7/GQIXe8j5HKPpu5TB29jEvpG3H2OZWYlTF3kWoVPixd9wQ9uZNyilyYxqSYxJ4r4WVnAmxNseYA==", "dependencies": { - "resend": "^1.1.0" + "resend": "^2.0.0" }, "peerDependencies": { "nodemailer": "^6.9.3" @@ -5110,237 +5110,18 @@ "@babel/runtime": "^7.13.10" } }, - "node_modules/@react-email/body": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.2.tgz", - "integrity": "sha512-SqZrZdxZlH7viwnrLvrMnVzOKpiofVAtho09bmm2siDzy0VMDGItXRzUPLcpg9vcbVJCHZRCIKoNXqA+PtokzQ==", - "dependencies": { - "react": "18.2.0" - } - }, - "node_modules/@react-email/button": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.9.tgz", - "integrity": "sha512-eYWQ1X4RFlkKYYSPgSrT6rk98wuLOieEAGENrp9j37t1v/1C+jMmBu0UjZvwHsHWdbOMRjbVDFeMI/+MxWKSEg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/column": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.7.tgz", - "integrity": "sha512-B29wVXyIcuVprgGpLkR23waPh/twlqmugZQsCKk05JlMCQ80/Puv4Lgj4dRsIJzgyTLMwG6xq17+Uxc5iGfuaQ==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/components": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.7.tgz", - "integrity": "sha512-GpRKV8E7EvK9OPf61f5Z8hliB3p0hTot8tslmEUVCTtX7tdL0wM2YEcZiDWU4PJcudJ/QWHJ7Y5wGzNEARcooA==", - "dependencies": { - "@react-email/body": "0.0.2", - "@react-email/button": "0.0.9", - "@react-email/column": "0.0.7", - "@react-email/container": "0.0.8", - "@react-email/font": "0.0.2", - "@react-email/head": "0.0.5", - "@react-email/heading": "0.0.8", - "@react-email/hr": "0.0.5", - "@react-email/html": "0.0.4", - "@react-email/img": "0.0.5", - "@react-email/link": "0.0.5", - "@react-email/preview": "0.0.6", - "@react-email/render": "0.0.7", - "@react-email/row": "0.0.5", - "@react-email/section": "0.0.9", - "@react-email/tailwind": "0.0.8", - "@react-email/text": "0.0.5", - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/container": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.8.tgz", - "integrity": "sha512-MQZQxvTOoLWjJR+Jm689jltm0I/mtZbEaDnwZbNkkHKgccr++wwb9kOKMgXG777Y7tGa1JATAsZpvFYiCITwUg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/font": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.2.tgz", - "integrity": "sha512-mmkyOCAcbgytE7DfIuOBVG1YVDUZY9rPCor4o7pUEzGJiU2y/TNuV8CgNPSU/VgXeBKL/94QDjB62OrGHlFNMQ==", - "dependencies": { - "react": "18.2.0" - } - }, - "node_modules/@react-email/head": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.5.tgz", - "integrity": "sha512-s84OxJxZMee2z5b1a+RVwY1NOSUNNf1ecjPf6n64aZmMNcNUyn4gOl7RO6xbfBrZko7TigBwsFB1Cgjxtn/ydg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/heading": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.8.tgz", - "integrity": "sha512-7atATmoHBHTk7hFYFsFFzOIBV3u1zPpsSOWkLBojdjSUdenpk2SbX8GP8/3aBhWl/tuFX9RBGcu1Xes+ZijFLg==", - "dependencies": { - "@radix-ui/react-slot": "1.0.0", - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/heading/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@react-email/heading/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/@react-email/hr": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.5.tgz", - "integrity": "sha512-nwB8GmSdvPlR/bWjDS07yHtgdfJqtvCaPXee3SVUY69YYP7NeDO/VACJlgrS9V2l79bj1lUpH0MJMU6MNAk5FQ==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/html": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.4.tgz", - "integrity": "sha512-7tRYSnudYAWez+NkPWOM8yLZH7EuYFtYdiLPnzpD+pf4cdk16Gz4up531DaIX6dNBbfbyEFpQxhXZxGeJ5ZkfQ==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/img": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.5.tgz", - "integrity": "sha512-9ziFgBfrIAL+DpVlsraFcd2KwsTRyobLpqTnoiBYCcVZGod59xbYkmsmB3CbUosmLwPYg6AeD7Q7e+hCiwkWgg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/link": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.5.tgz", - "integrity": "sha512-z+QW9f4gXBdyfhl7iYMY3td+rXKeZYK/2AGElEMsxVoywn5D0b6cF8m5w2jbf0U2V3enT+zy9yc1R6AyT59NOg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/preview": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.6.tgz", - "integrity": "sha512-mXDCc3NGpm/4W7gowBtjsTxYXowLNOLsJsYhIfrsjNJWGlVhVFB9uEHm55LjBLpxSG020g6/8LIrpJU6g22qvg==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@react-email/render": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.7.tgz", - "integrity": "sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.9.tgz", + "integrity": "sha512-nrim7wiACnaXsGtL7GF6jp3Qmml8J6vAjAH88jkC8lIbfNZaCyuPQHANjyYIXlvQeAbsWADQJFZgOHUqFqjh/A==", "dependencies": { - "html-to-text": "9.0.3", + "html-to-text": "9.0.5", "pretty": "2.0.0", "react": "18.2.0", "react-dom": "18.2.0" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/row": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.5.tgz", - "integrity": "sha512-dir5l1M7Z/1BQqQkUrKUPIIDPt6ueEf6ScMGoBOcUh+VNNqmnqJE2Q2CH5X3w2uo6a5X7tnVhoJHGa2KTKe8Sw==", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/section": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.9.tgz", - "integrity": "sha512-3EbcWJ1jUZrzquWSvXrv8Hbk9V+BGvLcMWQIli4NdIpQlddmlGKUYfXU2mB2d2pf+5ojqkGcFZZ9fWxycB84jQ==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/tailwind": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.8.tgz", - "integrity": "sha512-0BLjD5GpiyBK7YDlaDrjHIpj9eTrrZrMJud3f1UPoCZhS+0S/M8LcR8WMbQsR+8/aLGmiy4F4TGZuRQcsJEsFw==", - "dependencies": { - "html-react-parser": "3.0.9", - "react": "18.2.0", - "react-dom": "18.2.0", - "tw-to-css": "0.0.11" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@react-email/text": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.5.tgz", - "integrity": "sha512-LXhHiaC6oRRsNAfOzJDos4wQA22eIdVJvR6G7uu4QzUvYNOAatDMf89jRQcKGrxX7InkS640v8sHd9jl5ztM5w==", - "dependencies": { - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@rushstack/eslint-patch": { @@ -5357,12 +5138,12 @@ } }, "node_modules/@selderee/plugin-htmlparser2": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz", - "integrity": "sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", "dependencies": { "domhandler": "^5.0.3", - "selderee": "^0.10.0" + "selderee": "^0.11.0" }, "funding": { "url": "https://ko-fi.com/killymxi" @@ -6770,35 +6551,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -8787,14 +8539,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8853,22 +8597,6 @@ "node": ">=12" } }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -11185,57 +10913,25 @@ "node": ">=10" } }, - "node_modules/html-dom-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-3.1.3.tgz", - "integrity": "sha512-fI0yyNlIeSboxU+jnrA4v8qj4+M8SI9/q6AKYdwCY2qki22UtKCDTxvagHniECu7sa5/o2zFRdLleA67035lsA==", - "dependencies": { - "domhandler": "5.0.3", - "htmlparser2": "8.0.1" - } - }, - "node_modules/html-react-parser": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-3.0.9.tgz", - "integrity": "sha512-gOPZmaCMXNYu7Y9+58k2tLhTMXQ+QN8ctNFijzLuBxJaLZ6TsN+tUpN+MhbI+6nGaBCRGT2rpw6y/AqkTFZckg==", - "dependencies": { - "domhandler": "5.0.3", - "html-dom-parser": "3.1.3", - "react-property": "2.0.0", - "style-to-js": "1.1.3" - }, - "peerDependencies": { - "react": "0.14 || 15 || 16 || 17 || 18" - } - }, "node_modules/html-to-text": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.3.tgz", - "integrity": "sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", "dependencies": { - "@selderee/plugin-htmlparser2": "^0.10.0", - "deepmerge": "^4.2.2", + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", - "htmlparser2": "^8.0.1", - "selderee": "^0.10.0" + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" }, "engines": { "node": ">=14" } }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "node_modules/html-to-text/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -11245,9 +10941,18 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/http-errors": { @@ -14657,12 +14362,12 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "node_modules/parseley": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz", - "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", "dependencies": { "leac": "^0.6.0", - "peberminta": "^0.8.0" + "peberminta": "^0.9.0" }, "funding": { "url": "https://ko-fi.com/killymxi" @@ -14772,9 +14477,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/peberminta": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", - "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", "funding": { "url": "https://ko-fi.com/killymxi" } @@ -15972,20 +15677,6 @@ "node": ">=12" } }, - "node_modules/react-email/node_modules/@react-email/render": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.6.tgz", - "integrity": "sha512-6zs7WZbd37TcPT1OmMPH/kcBpv0QSi+k3om7LyDnbdIcrbwOO/OstVwUaa/6zgvDvnq9Y2wOosbru7j5kUrW9A==", - "dependencies": { - "html-to-text": "9.0.3", - "pretty": "2.0.0", - "react": "18.2.0", - "react-dom": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/react-email/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -16109,11 +15800,6 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/react-property": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", - "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" - }, "node_modules/react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -16692,28 +16378,16 @@ } }, "node_modules/resend": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resend/-/resend-1.1.0.tgz", - "integrity": "sha512-it8TIDVT+/gAiJsUlv2tdHuvzwCCv4Zwu+udDqIm/dIuByQwe68TtFDcPccxqpSVVrNCBxxXLzsdT1tsV+P3GA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resend/-/resend-2.0.0.tgz", + "integrity": "sha512-jAh0DN84ZjjmzGM2vMjJ1hphPBg1mG98dzopF7kJzmin62v8ESg4og2iCKWdkAboGOT2SeO5exbr/8Xh8gLddw==", "dependencies": { - "@react-email/render": "0.0.7", - "type-fest": "3.13.0" + "@react-email/render": "0.0.9" }, "engines": { "node": ">=18" } }, - "node_modules/resend/node_modules/type-fest": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.0.tgz", - "integrity": "sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -17021,11 +16695,11 @@ } }, "node_modules/selderee": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz", - "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", "dependencies": { - "parseley": "^0.11.0" + "parseley": "^0.12.0" }, "funding": { "url": "https://ko-fi.com/killymxi" @@ -17689,22 +17363,6 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "node_modules/style-to-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz", - "integrity": "sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==", - "dependencies": { - "style-to-object": "0.4.1" - } - }, - "node_modules/style-to-js/node_modules/style-to-object": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", - "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -18413,199 +18071,6 @@ "win32" ] }, - "node_modules/tw-to-css": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.11.tgz", - "integrity": "sha512-uIJuEBIwyHzZg9xyGyEgDWHIkbAwEC4bhEHQ4THPuN5SToR7Zlhes5ffMjqtrv+WdtTmudTHTdc9VwUldy0FxQ==", - "dependencies": { - "postcss": "8.4.21", - "postcss-css-variables": "0.18.0", - "tailwindcss": "3.2.7" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/tw-to-css/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/tw-to-css/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tw-to-css/node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/tw-to-css/node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/tw-to-css/node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/tw-to-css/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/tw-to-css/node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/tw-to-css/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tw-to-css/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tw-to-css/node_modules/tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tw-to-css/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -19616,11 +19081,11 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@documenso/nodemailer-resend": "1.0.0", - "@react-email/components": "^0.0.7", + "@documenso/nodemailer-resend": "2.0.0", + "@react-email/components": "^0.0.11", "nodemailer": "^6.9.3", - "react-email": "^1.9.4", - "resend": "^1.1.0" + "react-email": "^1.9.5", + "resend": "^2.0.0" }, "devDependencies": { "@documenso/tailwind-config": "*", @@ -19629,6 +19094,298 @@ "tsup": "^7.1.0" } }, + "packages/email/node_modules/@react-email/body": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.4.tgz", + "integrity": "sha512-NmHOumdmyjWvOXomqhQt06KbgRxhHrVznxQp/oWiPWes8nAJo2Y4L27aPHR9nTcs7JF7NmcJe9YSN42pswK+GQ==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/button": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.11.tgz", + "integrity": "sha512-mB5ySfZifwE5ybtIWwXGbmKk1uKkH4655gftL4+mMxZAZCkINVa2KXTi5pO+xZhMtJI9xtAsikOrOEU1gTDoww==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/column": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.8.tgz", + "integrity": "sha512-blChqGU8e/L6KZiB5EPww8bkZfdyHDuS0vKIvU+iS14uK+xfAw+5P5CU9BYXccEuJh2Gftfngu1bWMFp2Sc6ag==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/components": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.11.tgz", + "integrity": "sha512-wj9Sra/AGQvadb3ZABz44ll9Fb9FvXPEmODXRWbNRSc8pJTFGWorrsm4M/yj8dnewd4HtnbLkV1eDOvuiLAVLA==", + "dependencies": { + "@react-email/body": "0.0.4", + "@react-email/button": "0.0.11", + "@react-email/column": "0.0.8", + "@react-email/container": "0.0.10", + "@react-email/font": "0.0.4", + "@react-email/head": "0.0.6", + "@react-email/heading": "0.0.9", + "@react-email/hr": "0.0.6", + "@react-email/html": "0.0.6", + "@react-email/img": "0.0.6", + "@react-email/link": "0.0.6", + "@react-email/preview": "0.0.7", + "@react-email/render": "0.0.9", + "@react-email/row": "0.0.6", + "@react-email/section": "0.0.10", + "@react-email/tailwind": "0.0.12", + "@react-email/text": "0.0.6" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/container": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.10.tgz", + "integrity": "sha512-goishY7ocq+lord0043/LZK268bqvMFW/sxpUt/dSCPJyrrZZNCbpW2t8w8HztU38cYj0qGQLxO5Qvpn/RER3w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/font": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.4.tgz", + "integrity": "sha512-rN/pFlAcDNmfYFxpufT/rFRrM5KYBJM4nTA2uylTehlVOro6fb/q6n0zUwLF6OmQ4QIuRbqdEy7DI9mmJiNHxA==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/head": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.6.tgz", + "integrity": "sha512-9BrBDalb34nBOmmQVQc7/pjJotcuAeC3rhBl4G88Ohiipuv15vPIKqwy8vPJcFNi4l7yGlitfG3EESIjkLkoIw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/heading": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.9.tgz", + "integrity": "sha512-xzkcGlm+/aFrNlJZBKzxRKkRYJ2cRx92IqmSKAuGnwuKQ/uMKomXzPsHPu3Dclmnhn3wVKj4uprkgQOoxP6uXQ==", + "dependencies": { + "@radix-ui/react-slot": "1.0.2", + "react": "18.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/email/node_modules/@react-email/hr": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.6.tgz", + "integrity": "sha512-W+wINBz7z7BRv3i9GS+QoJBae1PESNhv6ZY6eLnEpqtBI/2++suuRNJOU/KpZzE6pykeTp6I/Z7UcL0LEYKgyg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/html": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.6.tgz", + "integrity": "sha512-8Fo20VOqxqc087gGEPjT8uos06fTXIC8NSoiJxpiwAkwiKtQnQH/jOdoLv6XaWh5Zt2clj1uokaoklnaM5rY1w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/img": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.6.tgz", + "integrity": "sha512-Wd7xKI3b1Jvb2ZEHyVpJ9D98u0GHrRl+578b8LV24PavM/65V61Q5LN5Fr9sAhj+4VGqnHDIVeXIYEzVbWaa3Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/link": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.6.tgz", + "integrity": "sha512-bYYHroWGS//nDl9yhh8V6K2BrNwAsyX7N/XClSCRku3x56NrZ6D0nBKWewYDPlJ9rW9TIaJm1jDYtO9XBzLlkQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/preview": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.7.tgz", + "integrity": "sha512-YLfIwHdexPi8IgP1pSuVXdAmKzMQ8ctCCLEjkMttT2vkSFqT6m/e6UFWK2l30rKm2dDsLvQyEvo923mPXjnNzg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/row": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.6.tgz", + "integrity": "sha512-msJ2TnDJNwpgDfDzUO63CvhusJHeaGLMM+8Zz86VPvxzwe/DkT7N48QKRWRCkt8urxVz5U+EgivORA9Dum9p3Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/section": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.10.tgz", + "integrity": "sha512-x9B2KYFqj+d8I1fK9bgeVm/3mLE4Qgn4mm/GbDtcJeSzKU/G7bTb7/3+BMDk9SARPGkg5XAuZm1XgcqQQutt2A==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/tailwind": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.12.tgz", + "integrity": "sha512-s8Ch7GL30qRKScn9NWwItMqxjtzbyUtCnXfC6sL2YTVtulbfvZZ06W+aA0S6f7fdrVlOOlQzZuK/sVaQCHhcSw==", + "dependencies": { + "react": "18.2.0", + "react-dom": "18.2.0", + "tw-to-css": "0.0.12" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/@react-email/text": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.6.tgz", + "integrity": "sha512-PDUTAD1PjlzXFOIUrR1zuV2xxguL62yne5YLcn1k+u/dVUyzn6iU/5lFShxCfzuh3QDWCf4+JRNnXN9rmV6jzw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "packages/email/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "packages/email/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "packages/email/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "packages/email/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "packages/email/node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "packages/email/node_modules/tw-to-css": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.12.tgz", + "integrity": "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==", + "dependencies": { + "postcss": "8.4.31", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.3.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", diff --git a/package.json b/package.json index 1b4690e18..d21af733e 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "packages/*" ], "dependencies": { - "react-hotkeys-hook": "^4.4.1", - "recharts": "^2.7.2" + "recharts": "^2.7.2", + "react-hotkeys-hook": "^4.4.1" } } diff --git a/packages/email/package.json b/packages/email/package.json index 4b23512ce..6366c67ed 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -17,11 +17,11 @@ "worker:test": "tsup worker/index.ts --format esm" }, "dependencies": { - "@documenso/nodemailer-resend": "1.0.0", - "@react-email/components": "^0.0.7", + "@documenso/nodemailer-resend": "2.0.0", + "@react-email/components": "^0.0.11", "nodemailer": "^6.9.3", - "react-email": "^1.9.4", - "resend": "^1.1.0" + "react-email": "^1.9.5", + "resend": "^2.0.0" }, "devDependencies": { "@documenso/tailwind-config": "*", diff --git a/packages/email/template-components/template-confirmation-email.tsx b/packages/email/template-components/template-confirmation-email.tsx new file mode 100644 index 000000000..e46582f54 --- /dev/null +++ b/packages/email/template-components/template-confirmation-email.tsx @@ -0,0 +1,52 @@ +import { Button, Section, Tailwind, Text } from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +import { TemplateDocumentImage } from './template-document-image'; + +export type TemplateConfirmationEmailProps = { + confirmationLink: string; + assetBaseUrl: string; +}; + +export const TemplateConfirmationEmail = ({ + confirmationLink, + assetBaseUrl, +}: TemplateConfirmationEmailProps) => { + return ( + + + +
+ + Welcome to Documenso! + + + + Before you get started, please confirm your email address by clicking the button below: + + +
+ + + You can also copy and paste this link into your browser: {confirmationLink} (link + expires in 1 hour) + +
+
+
+ ); +}; diff --git a/packages/email/templates/confirm-email.tsx b/packages/email/templates/confirm-email.tsx new file mode 100644 index 000000000..5e917f0a3 --- /dev/null +++ b/packages/email/templates/confirm-email.tsx @@ -0,0 +1,69 @@ +import { + Body, + Container, + Head, + Html, + Img, + Preview, + Section, + Tailwind, +} from '@react-email/components'; + +import config from '@documenso/tailwind-config'; + +import { + TemplateConfirmationEmail, + TemplateConfirmationEmailProps, +} from '../template-components/template-confirmation-email'; +import { TemplateFooter } from '../template-components/template-footer'; + +export const ConfirmEmailTemplate = ({ + confirmationLink, + assetBaseUrl, +}: TemplateConfirmationEmailProps) => { + const previewText = `Please confirm your email address`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + +
+ +
+ Documenso Logo + + +
+
+
+ + + + +
+ +
+ + ); +}; diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index cd7692e52..216962293 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -88,6 +88,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { merged.id = retrieved.id; merged.name = retrieved.name; merged.email = retrieved.email; + merged.emailVerified = retrieved.emailVerified; } if ( @@ -112,6 +113,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { name: merged.name, email: merged.email, lastSignedIn: merged.lastSignedIn, + emailVerified: merged.emailVerified, }; }, @@ -123,6 +125,8 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { id: Number(token.id), name: token.name, email: token.email, + emailVerified: + typeof token.emailVerified === 'string' ? new Date(token.emailVerified) : null, }, } satisfies Session; } diff --git a/packages/lib/server-only/auth/send-confirmation-email.ts b/packages/lib/server-only/auth/send-confirmation-email.ts new file mode 100644 index 000000000..7defdb1bd --- /dev/null +++ b/packages/lib/server-only/auth/send-confirmation-email.ts @@ -0,0 +1,56 @@ +import { createElement } from 'react'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import { ConfirmEmailTemplate } from '@documenso/email/templates/confirm-email'; +import { prisma } from '@documenso/prisma'; + +export interface SendConfirmationEmailProps { + userId: number; +} + +export const sendConfirmationEmail = async ({ userId }: SendConfirmationEmailProps) => { + const user = await prisma.user.findFirstOrThrow({ + where: { + id: userId, + }, + include: { + VerificationToken: { + orderBy: { + createdAt: 'desc', + }, + take: 1, + }, + }, + }); + + const [verificationToken] = user.VerificationToken; + + if (!verificationToken?.token) { + throw new Error('Verification token not found for the user'); + } + + const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000'; + const confirmationLink = `${assetBaseUrl}/verify-email/${verificationToken.token}`; + const senderName = process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso'; + const senderAdress = process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com'; + + const confirmationTemplate = createElement(ConfirmEmailTemplate, { + assetBaseUrl, + confirmationLink, + }); + + return mailer.sendMail({ + to: { + address: user.email, + name: user.name || '', + }, + from: { + name: senderName, + address: senderAdress, + }, + subject: 'Please confirm your email', + html: render(confirmationTemplate), + text: render(confirmationTemplate, { plainText: true }), + }); +}; diff --git a/packages/lib/server-only/user/generate-confirmation-token.ts b/packages/lib/server-only/user/generate-confirmation-token.ts new file mode 100644 index 000000000..5676890ec --- /dev/null +++ b/packages/lib/server-only/user/generate-confirmation-token.ts @@ -0,0 +1,41 @@ +import crypto from 'crypto'; + +import { prisma } from '@documenso/prisma'; + +import { ONE_HOUR } from '../../constants/time'; +import { sendConfirmationEmail } from '../auth/send-confirmation-email'; + +const IDENTIFIER = 'confirmation-email'; + +export const generateConfirmationToken = async ({ email }: { email: string }) => { + const token = crypto.randomBytes(20).toString('hex'); + + const user = await prisma.user.findFirst({ + where: { + email: email, + }, + }); + + if (!user) { + throw new Error('User not found'); + } + + const createdToken = await prisma.verificationToken.create({ + data: { + identifier: IDENTIFIER, + token: token, + expires: new Date(Date.now() + ONE_HOUR), + user: { + connect: { + id: user.id, + }, + }, + }, + }); + + if (!createdToken) { + throw new Error(`Failed to create the verification token`); + } + + return sendConfirmationEmail({ userId: user.id }); +}; diff --git a/packages/lib/server-only/user/send-confirmation-token.ts b/packages/lib/server-only/user/send-confirmation-token.ts new file mode 100644 index 000000000..5206d202e --- /dev/null +++ b/packages/lib/server-only/user/send-confirmation-token.ts @@ -0,0 +1,41 @@ +import crypto from 'crypto'; + +import { prisma } from '@documenso/prisma'; + +import { ONE_HOUR } from '../../constants/time'; +import { sendConfirmationEmail } from '../auth/send-confirmation-email'; + +const IDENTIFIER = 'confirmation-email'; + +export const sendConfirmationToken = async ({ email }: { email: string }) => { + const token = crypto.randomBytes(20).toString('hex'); + + const user = await prisma.user.findFirst({ + where: { + email: email, + }, + }); + + if (!user) { + throw new Error('User not found'); + } + + const createdToken = await prisma.verificationToken.create({ + data: { + identifier: IDENTIFIER, + token: token, + expires: new Date(Date.now() + ONE_HOUR), + user: { + connect: { + id: user.id, + }, + }, + }, + }); + + if (!createdToken) { + throw new Error(`Failed to create the verification token`); + } + + return sendConfirmationEmail({ userId: user.id }); +}; diff --git a/packages/lib/server-only/user/verify-email.ts b/packages/lib/server-only/user/verify-email.ts new file mode 100644 index 000000000..e954df1f8 --- /dev/null +++ b/packages/lib/server-only/user/verify-email.ts @@ -0,0 +1,70 @@ +import { DateTime } from 'luxon'; + +import { prisma } from '@documenso/prisma'; + +import { sendConfirmationToken } from './send-confirmation-token'; + +export type VerifyEmailProps = { + token: string; +}; + +export const verifyEmail = async ({ token }: VerifyEmailProps) => { + const verificationToken = await prisma.verificationToken.findFirst({ + include: { + user: true, + }, + where: { + token, + }, + }); + + if (!verificationToken) { + return null; + } + + // check if the token is valid or expired + const valid = verificationToken.expires > new Date(); + + if (!valid) { + const mostRecentToken = await prisma.verificationToken.findFirst({ + where: { + userId: verificationToken.userId, + }, + orderBy: { + createdAt: 'desc', + }, + }); + + // If there isn't a recent token or it's older than 1 hour, send a new token + if ( + !mostRecentToken || + DateTime.now().minus({ hours: 1 }).toJSDate() > mostRecentToken.createdAt + ) { + await sendConfirmationToken({ email: verificationToken.user.email }); + } + + return valid; + } + + const [updatedUser, deletedToken] = await prisma.$transaction([ + prisma.user.update({ + where: { + id: verificationToken.userId, + }, + data: { + emailVerified: new Date(), + }, + }), + prisma.verificationToken.deleteMany({ + where: { + userId: verificationToken.userId, + }, + }), + ]); + + if (!updatedUser || !deletedToken) { + throw new Error('Something went wrong while verifying your email. Please try again.'); + } + + return !!updatedUser && !!deletedToken; +}; diff --git a/packages/prisma/migrations/20231025074705_add_email_confirmation_registration/migration.sql b/packages/prisma/migrations/20231025074705_add_email_confirmation_registration/migration.sql new file mode 100644 index 000000000..95e64a744 --- /dev/null +++ b/packages/prisma/migrations/20231025074705_add_email_confirmation_registration/migration.sql @@ -0,0 +1,17 @@ +-- CreateTable +CREATE TABLE "VerificationToken" ( + "id" SERIAL NOT NULL, + "identifier" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" INTEGER NOT NULL, + + CONSTRAINT "VerificationToken_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token"); + +-- AddForeignKey +ALTER TABLE "VerificationToken" ADD CONSTRAINT "VerificationToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/packages/prisma/migrations/20231031072857_verify_existing_users/migration.sql b/packages/prisma/migrations/20231031072857_verify_existing_users/migration.sql new file mode 100644 index 000000000..5b082c233 --- /dev/null +++ b/packages/prisma/migrations/20231031072857_verify_existing_users/migration.sql @@ -0,0 +1,3 @@ +UPDATE "User" +SET "emailVerified" = CURRENT_TIMESTAMP +WHERE "emailVerified" IS NULL; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 8cf4152c4..02807e4a0 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -36,7 +36,8 @@ model User { Document Document[] Subscription Subscription? PasswordResetToken PasswordResetToken[] - + VerificationToken VerificationToken[] + @@index([email]) } @@ -49,6 +50,16 @@ model PasswordResetToken { User User @relation(fields: [userId], references: [id]) } +model VerificationToken { + id Int @id @default(autoincrement()) + identifier String + token String @unique + expires DateTime + createdAt DateTime @default(now()) + userId Int + user User @relation(fields: [userId], references: [id]) +} + enum SubscriptionStatus { ACTIVE PAST_DUE diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts index f66f44325..dfabd9da9 100644 --- a/packages/trpc/server/auth-router/router.ts +++ b/packages/trpc/server/auth-router/router.ts @@ -1,6 +1,7 @@ import { TRPCError } from '@trpc/server'; import { createUser } from '@documenso/lib/server-only/user/create-user'; +import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; import { procedure, router } from '../trpc'; import { ZSignUpMutationSchema } from './schema'; @@ -10,7 +11,11 @@ export const authRouter = router({ try { const { name, email, password, signature } = input; - return await createUser({ name, email, password, signature }); + const user = await createUser({ name, email, password, signature }); + + await sendConfirmationToken({ email: user.email }); + + return user; } catch (err) { let message = 'We were unable to create your account. Please review the information you provided and try again.'; diff --git a/packages/trpc/server/profile-router/router.ts b/packages/trpc/server/profile-router/router.ts index 0f6636650..4dcf4ca93 100644 --- a/packages/trpc/server/profile-router/router.ts +++ b/packages/trpc/server/profile-router/router.ts @@ -3,11 +3,13 @@ import { TRPCError } from '@trpc/server'; import { forgotPassword } from '@documenso/lib/server-only/user/forgot-password'; import { getUserById } from '@documenso/lib/server-only/user/get-user-by-id'; import { resetPassword } from '@documenso/lib/server-only/user/reset-password'; +import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; import { updatePassword } from '@documenso/lib/server-only/user/update-password'; import { updateProfile } from '@documenso/lib/server-only/user/update-profile'; import { adminProcedure, authenticatedProcedure, procedure, router } from '../trpc'; import { + ZConfirmEmailMutationSchema, ZForgotPasswordFormSchema, ZResetPasswordFormSchema, ZRetrieveUserByIdQuerySchema, @@ -110,4 +112,25 @@ export const profileRouter = router({ }); } }), + + sendConfirmationEmail: procedure + .input(ZConfirmEmailMutationSchema) + .mutation(async ({ input }) => { + try { + const { email } = input; + + return sendConfirmationToken({ email }); + } catch (err) { + let message = 'We were unable to send a confirmation email. Please try again.'; + + if (err instanceof Error) { + message = err.message; + } + + throw new TRPCError({ + code: 'BAD_REQUEST', + message, + }); + } + }), }); diff --git a/packages/trpc/server/profile-router/schema.ts b/packages/trpc/server/profile-router/schema.ts index 44a8a451c..ef9ca2a14 100644 --- a/packages/trpc/server/profile-router/schema.ts +++ b/packages/trpc/server/profile-router/schema.ts @@ -23,8 +23,13 @@ export const ZResetPasswordFormSchema = z.object({ token: z.string().min(1), }); +export const ZConfirmEmailMutationSchema = z.object({ + email: z.string().email().min(1), +}); + export type TRetrieveUserByIdQuerySchema = z.infer; export type TUpdateProfileMutationSchema = z.infer; export type TUpdatePasswordMutationSchema = z.infer; export type TForgotPasswordFormSchema = z.infer; export type TResetPasswordFormSchema = z.infer; +export type TConfirmEmailMutationSchema = z.infer; From be0fe079a39f479e29d1274ff0b37495ebe3ca40 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Wed, 22 Nov 2023 15:46:21 +1100 Subject: [PATCH 06/51] fix: add healthcheck endpoint (#671) --- apps/web/src/pages/api/health.ts | 21 +++++++++++++++++++++ packages/trpc/server/router.ts | 5 +---- 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 apps/web/src/pages/api/health.ts diff --git a/apps/web/src/pages/api/health.ts b/apps/web/src/pages/api/health.ts new file mode 100644 index 000000000..8fd17aba1 --- /dev/null +++ b/apps/web/src/pages/api/health.ts @@ -0,0 +1,21 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; + +import { prisma } from '@documenso/prisma'; + +export default async function handler(_req: NextApiRequest, res: NextApiResponse) { + try { + await prisma.$queryRaw`SELECT 1`; + + return res.json({ + status: 'ok', + message: 'All systems operational', + }); + } catch (err) { + console.error(err); + + return res.status(500).json({ + status: 'error', + message: err.message, + }); + } +} diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index 519096da9..b20d5bc3f 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -4,12 +4,9 @@ import { documentRouter } from './document-router/router'; import { fieldRouter } from './field-router/router'; import { profileRouter } from './profile-router/router'; import { shareLinkRouter } from './share-link-router/router'; -import { procedure, router } from './trpc'; +import { router } from './trpc'; export const appRouter = router({ - health: procedure.query(() => { - return { status: 'ok' }; - }), auth: authRouter, profile: profileRouter, document: documentRouter, From 9444e0cc67c67e3759d52cf91135aabee0c716d9 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Wed, 22 Nov 2023 16:26:39 +1100 Subject: [PATCH 07/51] fix: docker build requires smtp host (#672) set a default for smtp host and add an action for testing docker builds on each pull request --- .github/workflows/ci.yml | 17 +++++++++++++++-- apps/marketing/package.json | 1 + apps/web/package.json | 1 + .../(dashboard)/layout/desktop-nav.tsx | 4 +++- package-lock.json | 2 ++ packages/email/mailer.ts | 6 +----- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 725bdac93..fa29ae591 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,8 @@ env: HUSKY: 0 jobs: - build: - name: Build + build_app: + name: Build App runs-on: ubuntu-latest steps: - name: Checkout @@ -37,3 +37,16 @@ jobs: - name: Build run: npm run build + + build_docker: + name: Build Docker Image + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Build Docker Image + run: ./docker/build.sh + diff --git a/apps/marketing/package.json b/apps/marketing/package.json index cc49f85a4..ab72ce6c8 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -13,6 +13,7 @@ "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" }, "dependencies": { + "@documenso/assets": "*", "@documenso/lib": "*", "@documenso/tailwind-config": "*", "@documenso/trpc": "*", diff --git a/apps/web/package.json b/apps/web/package.json index d96fc6a9c..aed5aef06 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,6 +13,7 @@ "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" }, "dependencies": { + "@documenso/assets": "*", "@documenso/ee": "*", "@documenso/lib": "*", "@documenso/prisma": "*", diff --git a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx index a78c69704..01bdec657 100644 --- a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx @@ -16,7 +16,9 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { // const pathname = usePathname(); const [open, setOpen] = useState(false); - const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(navigator?.userAgent || 'unknown'); + const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown'; + + const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent); const modifierKey = isMacOS ? '⌘' : 'Ctrl'; return ( diff --git a/package-lock.json b/package-lock.json index 17fa736b2..f7d0e2a5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "version": "0.1.0", "license": "AGPL-3.0", "dependencies": { + "@documenso/assets": "*", "@documenso/lib": "*", "@documenso/tailwind-config": "*", "@documenso/trpc": "*", @@ -79,6 +80,7 @@ "version": "0.1.0", "license": "AGPL-3.0", "dependencies": { + "@documenso/assets": "*", "@documenso/ee": "*", "@documenso/lib": "*", "@documenso/prisma": "*", diff --git a/packages/email/mailer.ts b/packages/email/mailer.ts index 92a30522c..3956e6a2b 100644 --- a/packages/email/mailer.ts +++ b/packages/email/mailer.ts @@ -42,12 +42,8 @@ const getTransport = () => { }); } - if (!process.env.NEXT_PRIVATE_SMTP_HOST) { - throw new Error('SMTP transport requires NEXT_PRIVATE_SMTP_HOST'); - } - return createTransport({ - host: process.env.NEXT_PRIVATE_SMTP_HOST, + host: process.env.NEXT_PRIVATE_SMTP_HOST ?? 'localhost:2500', port: Number(process.env.NEXT_PRIVATE_SMTP_PORT) || 587, secure: process.env.NEXT_PRIVATE_SMTP_SECURE === 'true', auth: { From 5de0c464f08d28c26e2e3db66b05d8296f00a893 Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 23 Nov 2023 13:57:08 +1100 Subject: [PATCH 08/51] fix: hydration errors for modifier key --- .../components/(dashboard)/layout/desktop-nav.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx index 01bdec657..76077cb04 100644 --- a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx @@ -1,7 +1,7 @@ 'use client'; import type { HTMLAttributes } from 'react'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { Search } from 'lucide-react'; @@ -15,11 +15,14 @@ export type DesktopNavProps = HTMLAttributes; export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { // const pathname = usePathname(); const [open, setOpen] = useState(false); + const [modifierKey, setModifierKey] = useState(() => 'Ctrl'); - const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown'; + useEffect(() => { + const userAgent = typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown'; + const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent); - const isMacOS = /Macintosh|Mac\s+OS\s+X/i.test(userAgent); - const modifierKey = isMacOS ? '⌘' : 'Ctrl'; + setModifierKey(isMacOS ? '⌘' : 'Ctrl'); + }, []); return (
{
-
+
{modifierKey}+K
From c054fc78a490302c7b05224a8b459ff8c1cdc019 Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 23 Nov 2023 15:11:37 +1100 Subject: [PATCH 09/51] fix: resolve issues with emailVerified jwt property --- packages/lib/next-auth/auth-options.ts | 25 ++++++++++++++++--------- packages/lib/types/next-auth.d.ts | 5 +++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 216962293..57a37d7fe 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -1,9 +1,12 @@ +/// import { PrismaAdapter } from '@next-auth/prisma-adapter'; import { compare } from 'bcrypt'; import { DateTime } from 'luxon'; -import { AuthOptions, Session, User } from 'next-auth'; +import type { AuthOptions, Session, User } from 'next-auth'; +import type { JWT } from 'next-auth/jwt'; import CredentialsProvider from 'next-auth/providers/credentials'; -import GoogleProvider, { GoogleProfile } from 'next-auth/providers/google'; +import type { GoogleProfile } from 'next-auth/providers/google'; +import GoogleProvider from 'next-auth/providers/google'; import { prisma } from '@documenso/prisma'; @@ -48,6 +51,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { id: Number(user.id), email: user.email, name: user.name, + emailVerified: user.emailVerified?.toISOString() ?? null, } satisfies User; }, }), @@ -61,6 +65,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { id: Number(profile.sub), name: profile.name || `${profile.given_name} ${profile.family_name}`.trim(), email: profile.email, + emailVerified: profile.email_verified ? new Date().toISOString() : null, }; }, }), @@ -70,9 +75,10 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { const merged = { ...token, ...user, - }; + emailVerified: user?.emailVerified ? new Date(user.emailVerified).toISOString() : null, + } satisfies JWT; - if (!merged.email) { + if (!merged.email || typeof merged.emailVerified !== 'string') { const userId = Number(merged.id ?? token.sub); const retrieved = await prisma.user.findFirst({ @@ -88,7 +94,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { merged.id = retrieved.id; merged.name = retrieved.name; merged.email = retrieved.email; - merged.emailVerified = retrieved.emailVerified; + merged.emailVerified = retrieved.emailVerified?.toISOString() ?? null; } if ( @@ -98,7 +104,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { ) { merged.lastSignedIn = new Date().toISOString(); - await prisma.user.update({ + const user = await prisma.user.update({ where: { id: Number(merged.id), }, @@ -106,6 +112,8 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { lastSignedIn: merged.lastSignedIn, }, }); + + merged.emailVerified = user.emailVerified?.toISOString() ?? null; } return { @@ -114,7 +122,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { email: merged.email, lastSignedIn: merged.lastSignedIn, emailVerified: merged.emailVerified, - }; + } satisfies JWT; }, session({ token, session }) { @@ -125,8 +133,7 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { id: Number(token.id), name: token.name, email: token.email, - emailVerified: - typeof token.emailVerified === 'string' ? new Date(token.emailVerified) : null, + emailVerified: token.emailVerified ?? null, }, } satisfies Session; } diff --git a/packages/lib/types/next-auth.d.ts b/packages/lib/types/next-auth.d.ts index 102678ef5..edc05ccc4 100644 --- a/packages/lib/types/next-auth.d.ts +++ b/packages/lib/types/next-auth.d.ts @@ -6,11 +6,11 @@ declare module 'next-auth' { user: User; } - interface User extends Omit { + interface User extends Omit { id: PrismaUser['id']; name?: PrismaUser['name']; email?: PrismaUser['email']; - emailVerified?: PrismaUser['emailVerified']; + emailVerified?: string | null; } } @@ -19,6 +19,7 @@ declare module 'next-auth/jwt' { id: string | number; name?: string | null; email: string | null; + emailVerified?: string | null; lastSignedIn?: string | null; } } From 823034911487d5785473ca8aef9bfe46e271be88 Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 24 Nov 2023 16:17:54 +1100 Subject: [PATCH 10/51] fix: unable to load font for signing --- apps/marketing/next.config.js | 16 +++++++++++++++- apps/web/next.config.js | 12 +++++++++++- package-lock.json | 1 + package.json | 2 +- packages/lib/package.json | 1 + .../lib/server-only/pdf/insert-field-in-pdf.ts | 9 ++++----- packages/tsconfig/process-env.d.ts | 1 + turbo.json | 1 + 8 files changed, 35 insertions(+), 8 deletions(-) diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index d2b20fbb9..41a80c12c 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require('fs'); const path = require('path'); const { withContentlayer } = require('next-contentlayer'); @@ -10,6 +11,12 @@ ENV_FILES.forEach((file) => { }); }); +// !: This is a temp hack to get caveat working without placing it back in the public directory. +// !: By inlining this at build time we should be able to sign faster. +const FONT_CAVEAT_BYTES = fs.readFileSync( + path.join(__dirname, '../../packages/assets/fonts/caveat.ttf'), +); + /** @type {import('next').NextConfig} */ const config = { experimental: { @@ -17,9 +24,16 @@ const config = { outputFileTracingRoot: path.join(__dirname, '../../'), }, reactStrictMode: true, - transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + transpilePackages: [ + '@documenso/assets', + '@documenso/lib', + '@documenso/tailwind-config', + '@documenso/trpc', + '@documenso/ui', + ], env: { NEXT_PUBLIC_PROJECT: 'marketing', + FONT_CAVEAT_URI: `data:font/ttf;base64,${FONT_CAVEAT_BYTES.toString('base64')}`, }, modularizeImports: { 'lucide-react': { diff --git a/apps/web/next.config.js b/apps/web/next.config.js index ed1136d91..97af05ab5 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require('fs'); const path = require('path'); const { version } = require('./package.json'); @@ -10,6 +11,12 @@ ENV_FILES.forEach((file) => { }); }); +// !: This is a temp hack to get caveat working without placing it back in the public directory. +// !: By inlining this at build time we should be able to sign faster. +const FONT_CAVEAT_BYTES = fs.readFileSync( + path.join(__dirname, '../../packages/assets/fonts/caveat.ttf'), +); + /** @type {import('next').NextConfig} */ const config = { output: process.env.DOCKER_OUTPUT ? 'standalone' : undefined, @@ -19,15 +26,18 @@ const config = { }, reactStrictMode: true, transpilePackages: [ + '@documenso/assets', + '@documenso/ee', '@documenso/lib', '@documenso/prisma', + '@documenso/tailwind-config', '@documenso/trpc', '@documenso/ui', - '@documenso/email', ], env: { APP_VERSION: version, NEXT_PUBLIC_PROJECT: 'web', + FONT_CAVEAT_URI: `data:font/ttf;base64,${FONT_CAVEAT_BYTES.toString('base64')}`, }, modularizeImports: { 'lucide-react': { diff --git a/package-lock.json b/package-lock.json index f7d0e2a5d..c11ccd14d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19715,6 +19715,7 @@ "@aws-sdk/cloudfront-signer": "^3.410.0", "@aws-sdk/s3-request-presigner": "^3.410.0", "@aws-sdk/signature-v4-crt": "^3.410.0", + "@documenso/assets": "*", "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", diff --git a/package.json b/package.json index d21af733e..8c154401c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "build": "turbo run build", "build:web": "turbo run build --filter=@documenso/web", "dev": "turbo run dev --filter=@documenso/web --filter=@documenso/marketing", - "start": "cd apps && cd web && next start", + "start": "turbo run start --filter=@documenso/web --filter=@documenso/marketing", "lint": "turbo run lint", "lint:fix": "turbo run lint:fix", "format": "prettier --write \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\"", diff --git a/packages/lib/package.json b/packages/lib/package.json index 482866d63..56be5a7f0 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -20,6 +20,7 @@ "@aws-sdk/cloudfront-signer": "^3.410.0", "@aws-sdk/s3-request-presigner": "^3.410.0", "@aws-sdk/signature-v4-crt": "^3.410.0", + "@documenso/assets": "*", "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", diff --git a/packages/lib/server-only/pdf/insert-field-in-pdf.ts b/packages/lib/server-only/pdf/insert-field-in-pdf.ts index 9da0e0bf1..dde46ba6b 100644 --- a/packages/lib/server-only/pdf/insert-field-in-pdf.ts +++ b/packages/lib/server-only/pdf/insert-field-in-pdf.ts @@ -2,7 +2,6 @@ import fontkit from '@pdf-lib/fontkit'; import { PDFDocument, StandardFonts } from 'pdf-lib'; import { - CAVEAT_FONT_PATH, DEFAULT_HANDWRITING_FONT_SIZE, DEFAULT_STANDARD_FONT_SIZE, MIN_HANDWRITING_FONT_SIZE, @@ -10,12 +9,12 @@ import { } from '@documenso/lib/constants/pdf'; import { FieldType } from '@documenso/prisma/client'; import { isSignatureFieldType } from '@documenso/prisma/guards/is-signature-field'; -import { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; +import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; export const insertFieldInPDF = async (pdf: PDFDocument, field: FieldWithSignature) => { - // Fetch the font file from the public URL. - const fontResponse = await fetch(CAVEAT_FONT_PATH); - const fontCaveat = await fontResponse.arrayBuffer(); + const fontCaveat = await fetch(process.env.FONT_CAVEAT_URI).then(async (res) => + res.arrayBuffer(), + ); const isSignatureField = isSignatureFieldType(field.type); diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index 491b84012..749cfcc43 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -62,6 +62,7 @@ declare namespace NodeJS { VERCEL_URL?: string; DEPLOYMENT_TARGET?: 'webapp' | 'marketing'; + FONT_CAVEAT_URI: string; POSTGRES_URL?: string; DATABASE_URL?: string; diff --git a/turbo.json b/turbo.json index 0dac59203..0f0038887 100644 --- a/turbo.json +++ b/turbo.json @@ -85,6 +85,7 @@ "VERCEL_ENV", "VERCEL_URL", "DEPLOYMENT_TARGET", + "FONT_CAVEAT_URI", "POSTGRES_URL", "DATABASE_URL", "POSTGRES_PRISMA_URL", From d8688692f75406cb1401c001415fdb61904eaedb Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 24 Nov 2023 16:58:18 +1100 Subject: [PATCH 11/51] fix: move singleplayer create to trpc --- .../app/(marketing)/singleplayer/client.tsx | 15 +- .../create-single-player-document.action.ts | 233 ------------------ apps/marketing/src/pages/api/trpc/[trpc].ts | 4 + apps/web/src/pages/api/trpc/[trpc].ts | 4 + package-lock.json | 2 + packages/trpc/package.json | 2 + packages/trpc/server/router.ts | 2 + .../trpc/server/singleplayer-router/helper.ts | 37 +++ .../trpc/server/singleplayer-router/router.ts | 172 +++++++++++++ .../trpc/server/singleplayer-router/schema.ts | 30 +++ 10 files changed, 262 insertions(+), 239 deletions(-) delete mode 100644 apps/marketing/src/components/(marketing)/single-player-mode/create-single-player-document.action.ts create mode 100644 packages/trpc/server/singleplayer-router/helper.ts create mode 100644 packages/trpc/server/singleplayer-router/router.ts create mode 100644 packages/trpc/server/singleplayer-router/schema.ts diff --git a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx index 7b500d295..1dcb2d76b 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx @@ -8,23 +8,23 @@ import { useRouter } from 'next/navigation'; import { useAnalytics } from '@documenso/lib/client-only/hooks/use-analytics'; import { base64 } from '@documenso/lib/universal/base64'; import { putFile } from '@documenso/lib/universal/upload/put-file'; -import { DocumentDataType, Field, Prisma, Recipient } from '@documenso/prisma/client'; +import type { Field, Recipient } from '@documenso/prisma/client'; +import { DocumentDataType, Prisma } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { DocumentDropzone } from '@documenso/ui/primitives/document-dropzone'; import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add-fields'; -import { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; +import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; import { AddSignatureFormPartial } from '@documenso/ui/primitives/document-flow/add-signature'; -import { TAddSignatureFormSchema } from '@documenso/ui/primitives/document-flow/add-signature.types'; +import type { TAddSignatureFormSchema } from '@documenso/ui/primitives/document-flow/add-signature.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerHeader, } from '@documenso/ui/primitives/document-flow/document-flow-root'; -import { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; +import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { createSinglePlayerDocument } from '~/components/(marketing)/single-player-mode/create-single-player-document.action'; - type SinglePlayerModeStep = 'fields' | 'sign'; // !: This entire file is a hack to get around failed prerendering of @@ -41,6 +41,9 @@ export const SinglePlayerClient = () => { const [step, setStep] = useState('fields'); const [fields, setFields] = useState([]); + const { mutateAsync: createSinglePlayerDocument } = + trpc.singleplayer.createSinglePlayerDocument.useMutation(); + const documentFlow: Record = { fields: { title: 'Add document', diff --git a/apps/marketing/src/components/(marketing)/single-player-mode/create-single-player-document.action.ts b/apps/marketing/src/components/(marketing)/single-player-mode/create-single-player-document.action.ts deleted file mode 100644 index 29321f31e..000000000 --- a/apps/marketing/src/components/(marketing)/single-player-mode/create-single-player-document.action.ts +++ /dev/null @@ -1,233 +0,0 @@ -'use server'; - -import { createElement } from 'react'; - -import { DateTime } from 'luxon'; -import { PDFDocument } from 'pdf-lib'; -import { match } from 'ts-pattern'; -import { z } from 'zod'; - -import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; -import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed'; -import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email'; -import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in-pdf'; -import { alphaid } from '@documenso/lib/universal/id'; -import { getFile } from '@documenso/lib/universal/upload/get-file'; -import { putFile } from '@documenso/lib/universal/upload/put-file'; -import { prisma } from '@documenso/prisma'; -import { - DocumentDataType, - DocumentStatus, - FieldType, - Prisma, - ReadStatus, - SendStatus, - SigningStatus, -} from '@documenso/prisma/client'; -import { signPdf } from '@documenso/signing'; - -const ZCreateSinglePlayerDocumentSchema = z.object({ - documentData: z.object({ - data: z.string(), - type: z.nativeEnum(DocumentDataType), - }), - documentName: z.string(), - signer: z.object({ - email: z.string().email().min(1), - name: z.string(), - signature: z.string(), - }), - fields: z.array( - z.object({ - page: z.number(), - type: z.nativeEnum(FieldType), - positionX: z.number(), - positionY: z.number(), - width: z.number(), - height: z.number(), - }), - ), -}); - -export type TCreateSinglePlayerDocumentSchema = z.infer; - -/** - * Create and self signs a document. - * - * Returns the document token. - */ -export const createSinglePlayerDocument = async ( - value: TCreateSinglePlayerDocumentSchema, -): Promise => { - const { signer, fields, documentData, documentName } = - ZCreateSinglePlayerDocumentSchema.parse(value); - - const document = await getFile({ - data: documentData.data, - type: documentData.type, - }); - - const doc = await PDFDocument.load(document); - const createdAt = new Date(); - - const isBase64 = signer.signature.startsWith('data:image/png;base64,'); - const signatureImageAsBase64 = isBase64 ? signer.signature : null; - const typedSignature = !isBase64 ? signer.signature : null; - - // Update the document with the fields inserted. - for (const field of fields) { - const isSignatureField = field.type === FieldType.SIGNATURE; - - await insertFieldInPDF(doc, { - ...mapField(field, signer), - Signature: isSignatureField - ? { - created: createdAt, - signatureImageAsBase64, - typedSignature, - // Dummy data. - id: -1, - recipientId: -1, - fieldId: -1, - } - : null, - // Dummy data. - id: -1, - documentId: -1, - recipientId: -1, - }); - } - - const unsignedPdfBytes = await doc.save(); - - const signedPdfBuffer = await signPdf({ pdf: Buffer.from(unsignedPdfBytes) }); - - const { token } = await prisma.$transaction( - async (tx) => { - const token = alphaid(); - - // Fetch service user who will be the owner of the document. - const serviceUser = await tx.user.findFirstOrThrow({ - where: { - email: SERVICE_USER_EMAIL, - }, - }); - - const { id: documentDataId } = await putFile({ - name: `${documentName}.pdf`, - type: 'application/pdf', - arrayBuffer: async () => Promise.resolve(signedPdfBuffer), - }); - - // Create document. - const document = await tx.document.create({ - data: { - title: documentName, - status: DocumentStatus.COMPLETED, - documentDataId, - userId: serviceUser.id, - createdAt, - }, - }); - - // Create recipient. - const recipient = await tx.recipient.create({ - data: { - documentId: document.id, - name: signer.name, - email: signer.email, - token, - signedAt: createdAt, - readStatus: ReadStatus.OPENED, - signingStatus: SigningStatus.SIGNED, - sendStatus: SendStatus.SENT, - }, - }); - - // Create fields and signatures. - await Promise.all( - fields.map(async (field) => { - const insertedField = await tx.field.create({ - data: { - documentId: document.id, - recipientId: recipient.id, - ...mapField(field, signer), - }, - }); - - if (field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE) { - await tx.signature.create({ - data: { - fieldId: insertedField.id, - signatureImageAsBase64, - typedSignature, - recipientId: recipient.id, - }, - }); - } - }), - ); - - return { document, token }; - }, - { - maxWait: 5000, - timeout: 30000, - }, - ); - - const template = createElement(DocumentSelfSignedEmailTemplate, { - documentName: documentName, - assetBaseUrl: process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', - }); - - // Send email to signer. - await mailer.sendMail({ - to: { - address: signer.email, - name: signer.name, - }, - from: { - name: FROM_NAME, - address: FROM_ADDRESS, - }, - subject: 'Document signed', - html: render(template), - text: render(template, { plainText: true }), - attachments: [{ content: signedPdfBuffer, filename: documentName }], - }); - - return token; -}; - -/** - * Map the fields provided by the user to fields compatible with Prisma. - * - * Signature fields are handled separately. - * - * @param field The field passed in by the user. - * @param signer The details of the person who is signing this document. - * @returns A field compatible with Prisma. - */ -const mapField = ( - field: TCreateSinglePlayerDocumentSchema['fields'][number], - signer: TCreateSinglePlayerDocumentSchema['signer'], -) => { - const customText = match(field.type) - .with(FieldType.DATE, () => DateTime.now().toFormat('yyyy-MM-dd hh:mm a')) - .with(FieldType.EMAIL, () => signer.email) - .with(FieldType.NAME, () => signer.name) - .otherwise(() => ''); - - return { - type: field.type, - page: field.page, - positionX: new Prisma.Decimal(field.positionX), - positionY: new Prisma.Decimal(field.positionY), - width: new Prisma.Decimal(field.width), - height: new Prisma.Decimal(field.height), - customText, - inserted: true, - }; -}; diff --git a/apps/marketing/src/pages/api/trpc/[trpc].ts b/apps/marketing/src/pages/api/trpc/[trpc].ts index a42844904..0bc991a98 100644 --- a/apps/marketing/src/pages/api/trpc/[trpc].ts +++ b/apps/marketing/src/pages/api/trpc/[trpc].ts @@ -2,6 +2,10 @@ import * as trpcNext from '@documenso/trpc/server/adapters/next'; import { createTrpcContext } from '@documenso/trpc/server/context'; import { appRouter } from '@documenso/trpc/server/router'; +export const config = { + maxDuration: 60, +}; + export default trpcNext.createNextApiHandler({ router: appRouter, createContext: async ({ req, res }) => createTrpcContext({ req, res }), diff --git a/apps/web/src/pages/api/trpc/[trpc].ts b/apps/web/src/pages/api/trpc/[trpc].ts index a42844904..0bc991a98 100644 --- a/apps/web/src/pages/api/trpc/[trpc].ts +++ b/apps/web/src/pages/api/trpc/[trpc].ts @@ -2,6 +2,10 @@ import * as trpcNext from '@documenso/trpc/server/adapters/next'; import { createTrpcContext } from '@documenso/trpc/server/context'; import { appRouter } from '@documenso/trpc/server/router'; +export const config = { + maxDuration: 60, +}; + export default trpcNext.createNextApiHandler({ router: appRouter, createContext: async ({ req, res }) => createTrpcContext({ req, res }), diff --git a/package-lock.json b/package-lock.json index c11ccd14d..9a9b98df0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19826,7 +19826,9 @@ "@trpc/next": "^10.36.0", "@trpc/react-query": "^10.36.0", "@trpc/server": "^10.36.0", + "luxon": "^3.4.0", "superjson": "^1.13.1", + "ts-pattern": "^5.0.5", "zod": "^3.22.4" } }, diff --git a/packages/trpc/package.json b/packages/trpc/package.json index b003509aa..05aed3147 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -17,7 +17,9 @@ "@trpc/next": "^10.36.0", "@trpc/react-query": "^10.36.0", "@trpc/server": "^10.36.0", + "luxon": "^3.4.0", "superjson": "^1.13.1", + "ts-pattern": "^5.0.5", "zod": "^3.22.4" } } diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index b20d5bc3f..dbf6ca03d 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -4,6 +4,7 @@ import { documentRouter } from './document-router/router'; import { fieldRouter } from './field-router/router'; import { profileRouter } from './profile-router/router'; import { shareLinkRouter } from './share-link-router/router'; +import { singleplayerRouter } from './singleplayer-router/router'; import { router } from './trpc'; export const appRouter = router({ @@ -13,6 +14,7 @@ export const appRouter = router({ field: fieldRouter, admin: adminRouter, shareLink: shareLinkRouter, + singleplayer: singleplayerRouter, }); export type AppRouter = typeof appRouter; diff --git a/packages/trpc/server/singleplayer-router/helper.ts b/packages/trpc/server/singleplayer-router/helper.ts new file mode 100644 index 000000000..0ec0ba42d --- /dev/null +++ b/packages/trpc/server/singleplayer-router/helper.ts @@ -0,0 +1,37 @@ +import { DateTime } from 'luxon'; +import { match } from 'ts-pattern'; + +import { FieldType, Prisma } from '@documenso/prisma/client'; + +import type { TCreateSinglePlayerDocumentMutationSchema } from './schema'; + +/** + * Map the fields provided by the user to fields compatible with Prisma. + * + * Signature fields are handled separately. + * + * @param field The field passed in by the user. + * @param signer The details of the person who is signing this document. + * @returns A field compatible with Prisma. + */ +export const mapField = ( + field: TCreateSinglePlayerDocumentMutationSchema['fields'][number], + signer: TCreateSinglePlayerDocumentMutationSchema['signer'], +) => { + const customText = match(field.type) + .with(FieldType.DATE, () => DateTime.now().toFormat('yyyy-MM-dd hh:mm a')) + .with(FieldType.EMAIL, () => signer.email) + .with(FieldType.NAME, () => signer.name) + .otherwise(() => ''); + + return { + type: field.type, + page: field.page, + positionX: new Prisma.Decimal(field.positionX), + positionY: new Prisma.Decimal(field.positionY), + width: new Prisma.Decimal(field.width), + height: new Prisma.Decimal(field.height), + customText, + inserted: true, + }; +}; diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts new file mode 100644 index 000000000..36e41f9e1 --- /dev/null +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -0,0 +1,172 @@ +'use server'; + +import { createElement } from 'react'; + +import { PDFDocument } from 'pdf-lib'; + +import { mailer } from '@documenso/email/mailer'; +import { render } from '@documenso/email/render'; +import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed'; +import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email'; +import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in-pdf'; +import { alphaid } from '@documenso/lib/universal/id'; +import { getFile } from '@documenso/lib/universal/upload/get-file'; +import { putFile } from '@documenso/lib/universal/upload/put-file'; +import { prisma } from '@documenso/prisma'; +import { + DocumentStatus, + FieldType, + ReadStatus, + SendStatus, + SigningStatus, +} from '@documenso/prisma/client'; +import { signPdf } from '@documenso/signing'; + +import { procedure, router } from '../trpc'; +import { mapField } from './helper'; +import { ZCreateSinglePlayerDocumentMutationSchema } from './schema'; + +export const singleplayerRouter = router({ + createSinglePlayerDocument: procedure + .input(ZCreateSinglePlayerDocumentMutationSchema) + .mutation(async ({ input }) => { + const { signer, fields, documentData, documentName } = input; + + const document = await getFile({ + data: documentData.data, + type: documentData.type, + }); + + const doc = await PDFDocument.load(document); + const createdAt = new Date(); + + const isBase64 = signer.signature.startsWith('data:image/png;base64,'); + const signatureImageAsBase64 = isBase64 ? signer.signature : null; + const typedSignature = !isBase64 ? signer.signature : null; + + // Update the document with the fields inserted. + for (const field of fields) { + const isSignatureField = field.type === FieldType.SIGNATURE; + + await insertFieldInPDF(doc, { + ...mapField(field, signer), + Signature: isSignatureField + ? { + created: createdAt, + signatureImageAsBase64, + typedSignature, + // Dummy data. + id: -1, + recipientId: -1, + fieldId: -1, + } + : null, + // Dummy data. + id: -1, + documentId: -1, + recipientId: -1, + }); + } + + const unsignedPdfBytes = await doc.save(); + + const signedPdfBuffer = await signPdf({ pdf: Buffer.from(unsignedPdfBytes) }); + + const { token } = await prisma.$transaction( + async (tx) => { + const token = alphaid(); + + // Fetch service user who will be the owner of the document. + const serviceUser = await tx.user.findFirstOrThrow({ + where: { + email: SERVICE_USER_EMAIL, + }, + }); + + const { id: documentDataId } = await putFile({ + name: `${documentName}.pdf`, + type: 'application/pdf', + arrayBuffer: async () => Promise.resolve(signedPdfBuffer), + }); + + // Create document. + const document = await tx.document.create({ + data: { + title: documentName, + status: DocumentStatus.COMPLETED, + documentDataId, + userId: serviceUser.id, + createdAt, + }, + }); + + // Create recipient. + const recipient = await tx.recipient.create({ + data: { + documentId: document.id, + name: signer.name, + email: signer.email, + token, + signedAt: createdAt, + readStatus: ReadStatus.OPENED, + signingStatus: SigningStatus.SIGNED, + sendStatus: SendStatus.SENT, + }, + }); + + // Create fields and signatures. + await Promise.all( + fields.map(async (field) => { + const insertedField = await tx.field.create({ + data: { + documentId: document.id, + recipientId: recipient.id, + ...mapField(field, signer), + }, + }); + + if (field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE) { + await tx.signature.create({ + data: { + fieldId: insertedField.id, + signatureImageAsBase64, + typedSignature, + recipientId: recipient.id, + }, + }); + } + }), + ); + + return { document, token }; + }, + { + maxWait: 5000, + timeout: 30000, + }, + ); + + const template = createElement(DocumentSelfSignedEmailTemplate, { + documentName: documentName, + assetBaseUrl: process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', + }); + + // Send email to signer. + await mailer.sendMail({ + to: { + address: signer.email, + name: signer.name, + }, + from: { + name: FROM_NAME, + address: FROM_ADDRESS, + }, + subject: 'Document signed', + html: render(template), + text: render(template, { plainText: true }), + attachments: [{ content: signedPdfBuffer, filename: documentName }], + }); + + return token; + }), +}); diff --git a/packages/trpc/server/singleplayer-router/schema.ts b/packages/trpc/server/singleplayer-router/schema.ts new file mode 100644 index 000000000..9fa56e7b1 --- /dev/null +++ b/packages/trpc/server/singleplayer-router/schema.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +import { DocumentDataType, FieldType } from '@documenso/prisma/client'; + +export const ZCreateSinglePlayerDocumentMutationSchema = z.object({ + documentData: z.object({ + data: z.string(), + type: z.nativeEnum(DocumentDataType), + }), + documentName: z.string(), + signer: z.object({ + email: z.string().email().min(1), + name: z.string(), + signature: z.string(), + }), + fields: z.array( + z.object({ + page: z.number(), + type: z.nativeEnum(FieldType), + positionX: z.number(), + positionY: z.number(), + width: z.number(), + height: z.number(), + }), + ), +}); + +export type TCreateSinglePlayerDocumentMutationSchema = z.infer< + typeof ZCreateSinglePlayerDocumentMutationSchema +>; From 84b958d5b7a173d4b45981af80ac80b17e10fb24 Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 24 Nov 2023 20:06:47 +1100 Subject: [PATCH 12/51] fix: universal upload hitting cache --- .../lib/universal/upload/server-actions.ts | 22 +++++++++++++++---- .../trpc/server/singleplayer-router/router.ts | 2 -- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/lib/universal/upload/server-actions.ts b/packages/lib/universal/upload/server-actions.ts index ec0bde59a..69274c30c 100644 --- a/packages/lib/universal/upload/server-actions.ts +++ b/packages/lib/universal/upload/server-actions.ts @@ -1,5 +1,8 @@ 'use server'; +import { headers } from 'next/headers'; +import { NextRequest } from 'next/server'; + import { DeleteObjectCommand, GetObjectCommand, @@ -7,10 +10,11 @@ import { S3Client, } from '@aws-sdk/client-s3'; import slugify from '@sindresorhus/slugify'; +import { type JWT, getToken } from 'next-auth/jwt'; import path from 'node:path'; +import { APP_BASE_URL } from '../../constants/app'; import { ONE_HOUR, ONE_SECOND } from '../../constants/time'; -import { getServerComponentSession } from '../../next-auth/get-server-component-session'; import { alphaid } from '../id'; export const getPresignPostUrl = async (fileName: string, contentType: string) => { @@ -18,15 +22,25 @@ export const getPresignPostUrl = async (fileName: string, contentType: string) = const { getSignedUrl } = await import('@aws-sdk/s3-request-presigner'); - const { user } = await getServerComponentSession(); + let token: JWT | null = null; + + try { + token = await getToken({ + req: new NextRequest(APP_BASE_URL ?? 'http://localhost:3000', { + headers: headers(), + }), + }); + } catch (err) { + // Non server-component environment + } // Get the basename and extension for the file const { name, ext } = path.parse(fileName); let key = `${alphaid(12)}/${slugify(name)}${ext}`; - if (user) { - key = `${user.id}/${key}`; + if (token) { + key = `${token.id}/${key}`; } const putObjectCommand = new PutObjectCommand({ diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index 36e41f9e1..8ac885bff 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -1,5 +1,3 @@ -'use server'; - import { createElement } from 'react'; import { PDFDocument } from 'pdf-lib'; From 8048c29480050eff7494d53466252d44473ebe51 Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 24 Nov 2023 23:57:34 +1100 Subject: [PATCH 13/51] fix: override @react-email/tailwind to avoid perf regression --- package-lock.json | 77 +++++++++++++++++++++++++++++++++---- packages/email/package.json | 4 ++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a9b98df0..6f5a6d6a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10915,6 +10915,29 @@ "node": ">=10" } }, + "node_modules/html-dom-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-4.0.0.tgz", + "integrity": "sha512-TUa3wIwi80f5NF8CVWzkopBVqVAtlawUzJoLwVLHns0XSJGynss4jiY0mTWpiDOsuyw+afP+ujjMgRh9CoZcXw==", + "dependencies": { + "domhandler": "5.0.3", + "htmlparser2": "9.0.0" + } + }, + "node_modules/html-react-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.0.0.tgz", + "integrity": "sha512-OzlOavs9lLyBxoRiXbXfODIX/nSShukMtdx3+WSMjon/FF1gJZRq0rBELoR5OswfbN56C0oKpAii7i3yzO/uVQ==", + "dependencies": { + "domhandler": "5.0.3", + "html-dom-parser": "4.0.0", + "react-property": "2.0.0", + "style-to-js": "1.1.3" + }, + "peerDependencies": { + "react": "0.14 || 15 || 16 || 17 || 18" + } + }, "node_modules/html-to-text": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", @@ -10957,6 +10980,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, "node_modules/http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -15802,6 +15843,11 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "node_modules/react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, "node_modules/react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -17365,6 +17411,22 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, + "node_modules/style-to-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz", + "integrity": "sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==", + "dependencies": { + "style-to-object": "0.4.1" + } + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -19085,6 +19147,7 @@ "dependencies": { "@documenso/nodemailer-resend": "2.0.0", "@react-email/components": "^0.0.11", + "@react-email/tailwind": "0.0.9", "nodemailer": "^6.9.3", "react-email": "^1.9.5", "resend": "^2.0.0" @@ -19276,19 +19339,17 @@ } }, "packages/email/node_modules/@react-email/tailwind": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.12.tgz", - "integrity": "sha512-s8Ch7GL30qRKScn9NWwItMqxjtzbyUtCnXfC6sL2YTVtulbfvZZ06W+aA0S6f7fdrVlOOlQzZuK/sVaQCHhcSw==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.9.tgz", + "integrity": "sha512-hVGMTVjg2u51TU8dMInc8l3R6+O2t54sx0mzQnJ2mOLwJQkfibh3HA4lmEa0V1qlv8mT/nti0vzC6QshdCxqjg==", "dependencies": { + "html-react-parser": "4.0.0", "react": "18.2.0", "react-dom": "18.2.0", - "tw-to-css": "0.0.12" + "tw-to-css": "0.0.11" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" + "node": ">=16.0.0" } }, "packages/email/node_modules/@react-email/text": { diff --git a/packages/email/package.json b/packages/email/package.json index 6366c67ed..adc98e3ff 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -19,6 +19,7 @@ "dependencies": { "@documenso/nodemailer-resend": "2.0.0", "@react-email/components": "^0.0.11", + "@react-email/tailwind": "0.0.9", "nodemailer": "^6.9.3", "react-email": "^1.9.5", "resend": "^2.0.0" @@ -28,5 +29,8 @@ "@documenso/tsconfig": "*", "@types/nodemailer": "^6.4.8", "tsup": "^7.1.0" + }, + "overrides": { + "@react-email/tailwind": "0.0.9" } } From d347359d2fc10d20cbd14190a804b21442b67d2e Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sat, 25 Nov 2023 22:09:52 +0000 Subject: [PATCH 14/51] chore: changes from code review --- .../app/(dashboard)/documents/data-table-action-button.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index 0d767d388..e0a56f83d 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -12,7 +12,7 @@ import { DocumentStatus, SigningStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc as trpcClient } from '@documenso/trpc/client'; import { Button } from '@documenso/ui/primitives/button'; -import { toast } from '@documenso/ui/primitives/use-toast'; +import { useToast } from '@documenso/ui/primitives/use-toast'; export type DataTableActionButtonProps = { row: Document & { @@ -23,6 +23,7 @@ export type DataTableActionButtonProps = { export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { const { data: session } = useSession(); + const toast = useToast(); if (!session) { return null; @@ -53,8 +54,6 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { const documentData = document?.documentData; - console.log(documentData); - if (!documentData) { return; } From adc97802ea9134b0f948acb944c522895ff30225 Mon Sep 17 00:00:00 2001 From: Tanay <114291962+tanayvaswani@users.noreply.github.com> Date: Tue, 28 Nov 2023 09:26:50 +0530 Subject: [PATCH 15/51] feat: add/update title of the document (#663) --- .../documents/[id]/edit-document.tsx | 58 ++++++++++-- .../forms/edit-document/add-title.action.ts | 21 +++++ .../lib/server-only/document/update-title.ts | 21 +++++ .../trpc/server/document-router/router.ts | 16 ++++ .../trpc/server/document-router/schema.ts | 7 ++ .../primitives/document-flow/add-signers.tsx | 6 +- .../ui/primitives/document-flow/add-title.tsx | 88 +++++++++++++++++++ .../document-flow/add-title.types.ts | 7 ++ packages/ui/primitives/document-flow/types.ts | 6 +- 9 files changed, 221 insertions(+), 9 deletions(-) create mode 100644 apps/web/src/components/forms/edit-document/add-title.action.ts create mode 100644 packages/lib/server-only/document/update-title.ts create mode 100644 packages/ui/primitives/document-flow/add-title.tsx create mode 100644 packages/ui/primitives/document-flow/add-title.types.ts diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 027d845b2..484d5d31d 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -4,7 +4,7 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; -import { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; +import { DocumentData, DocumentStatus, Field, Recipient, User } from '@documenso/prisma/client'; import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; @@ -14,6 +14,8 @@ import { AddSignersFormPartial } from '@documenso/ui/primitives/document-flow/ad import { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/add-subject'; import { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; +import { AddTitleFormPartial } from '@documenso/ui/primitives/document-flow/add-title'; +import { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerHeader, @@ -25,6 +27,7 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; import { addFields } from '~/components/forms/edit-document/add-fields.action'; import { addSigners } from '~/components/forms/edit-document/add-signers.action'; import { completeDocument } from '~/components/forms/edit-document/add-subject.action'; +import { addTitle } from '~/components/forms/edit-document/add-title.action'; export type EditDocumentFormProps = { className?: string; @@ -35,7 +38,7 @@ export type EditDocumentFormProps = { documentData: DocumentData; }; -type EditDocumentStep = 'signers' | 'fields' | 'subject'; +type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; export const EditDocumentForm = ({ className, @@ -48,30 +51,60 @@ export const EditDocumentForm = ({ const { toast } = useToast(); const router = useRouter(); - const [step, setStep] = useState('signers'); + const [step, setStep] = useState( + document.status === DocumentStatus.DRAFT ? 'title' : 'signers', + ); const documentFlow: Record = { + title: { + title: 'Add Title', + description: 'Add the title to the document.', + stepIndex: 1, + }, signers: { title: 'Add Signers', description: 'Add the people who will sign the document.', - stepIndex: 1, + stepIndex: 2, + onBackStep: () => document.status === DocumentStatus.DRAFT && setStep('title'), }, fields: { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', - stepIndex: 2, + stepIndex: 3, onBackStep: () => setStep('signers'), }, subject: { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', - stepIndex: 3, + stepIndex: 4, onBackStep: () => setStep('fields'), }, }; const currentDocumentFlow = documentFlow[step]; + const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => { + try { + // Custom invocation server action + await addTitle({ + documentId: document.id, + title: data.title, + }); + + router.refresh(); + + setStep('signers'); + } catch (err) { + console.error(err); + + toast({ + title: 'Error', + description: 'An error occurred while updating title.', + variant: 'destructive', + }); + } + }; + const onAddSignersFormSubmit = async (data: TAddSignersFormSchema) => { try { // Custom invocation server action @@ -164,10 +197,23 @@ export const EditDocumentForm = ({ description={currentDocumentFlow.description} /> + {step === 'title' && ( + + )} + {step === 'signers' && ( { + 'use server'; + + const { user } = await getRequiredServerComponentSession(); + + await updateTitle({ + documentId, + userId: user.id, + title: title, + }); +}; diff --git a/packages/lib/server-only/document/update-title.ts b/packages/lib/server-only/document/update-title.ts new file mode 100644 index 000000000..ba086b9cb --- /dev/null +++ b/packages/lib/server-only/document/update-title.ts @@ -0,0 +1,21 @@ +'use server'; + +import { prisma } from '@documenso/prisma'; + +export type UpdateTitleOptions = { + userId: number; + documentId: number; + title: string; +}; + +export const updateTitle = async ({ userId, documentId, title }: UpdateTitleOptions) => { + return await prisma.document.update({ + where: { + id: documentId, + userId, + }, + data: { + title, + }, + }); +}; diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index bd92312da..924d3a9bd 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -8,6 +8,7 @@ import { getDocumentById } from '@documenso/lib/server-only/document/get-documen import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token'; import { resendDocument } from '@documenso/lib/server-only/document/resend-document'; import { sendDocument } from '@documenso/lib/server-only/document/send-document'; +import { updateTitle } from '@documenso/lib/server-only/document/update-title'; import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; @@ -21,6 +22,7 @@ import { ZSendDocumentMutationSchema, ZSetFieldsForDocumentMutationSchema, ZSetRecipientsForDocumentMutationSchema, + ZSetTitleForDocumentMutationSchema, } from './schema'; export const documentRouter = router({ @@ -113,6 +115,20 @@ export const documentRouter = router({ } }), + setTitleForDocument: authenticatedProcedure + .input(ZSetTitleForDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + const { documentId, title } = input; + + const userId = ctx.user.id; + + return await updateTitle({ + title, + userId, + documentId, + }); + }), + setRecipientsForDocument: authenticatedProcedure .input(ZSetRecipientsForDocumentMutationSchema) .mutation(async ({ input, ctx }) => { diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index b9bea71c3..cc010046e 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -21,6 +21,13 @@ export const ZCreateDocumentMutationSchema = z.object({ export type TCreateDocumentMutationSchema = z.infer; +export const ZSetTitleForDocumentMutationSchema = z.object({ + documentId: z.number(), + title: z.string().min(1), +}); + +export type TSetTitleForDocumentMutationSchema = z.infer; + export const ZSetRecipientsForDocumentMutationSchema = z.object({ documentId: z.number(), recipients: z.array( diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index 14d728f0a..b623b0d4e 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -9,7 +9,8 @@ import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { nanoid } from '@documenso/lib/universal/id'; -import { Field, Recipient, SendStatus } from '@documenso/prisma/client'; +import { DocumentStatus, Field, Recipient, SendStatus } from '@documenso/prisma/client'; +import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { Button } from '@documenso/ui/primitives/button'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; import { Input } from '@documenso/ui/primitives/input'; @@ -29,6 +30,7 @@ export type AddSignersFormProps = { documentFlow: DocumentFlowStep; recipients: Recipient[]; fields: Field[]; + document: DocumentWithData; numberOfSteps: number; onSubmit: (_data: TAddSignersFormSchema) => void; }; @@ -37,6 +39,7 @@ export const AddSignersFormPartial = ({ documentFlow, numberOfSteps, recipients, + document, fields: _fields, onSubmit, }: AddSignersFormProps) => { @@ -223,6 +226,7 @@ export const AddSignersFormPartial = ({ /> void; +}; + +export const AddTitleFormPartial = ({ + documentFlow, + recipients: _recipients, + fields: _fields, + document, + numberOfSteps, + onSubmit, +}: AddTitleFormProps) => { + const { + register, + handleSubmit, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues: { + title: document.title, + }, + }); + + const onFormSubmit = handleSubmit(onSubmit); + + return ( + <> + +
+
+
+ + + + + +
+
+
+
+ + + + + void onFormSubmit()} + /> + + + ); +}; diff --git a/packages/ui/primitives/document-flow/add-title.types.ts b/packages/ui/primitives/document-flow/add-title.types.ts new file mode 100644 index 000000000..aaa8c17e4 --- /dev/null +++ b/packages/ui/primitives/document-flow/add-title.types.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const ZAddTitleFormSchema = z.object({ + title: z.string().min(1), +}); + +export type TAddTitleFormSchema = z.infer; diff --git a/packages/ui/primitives/document-flow/types.ts b/packages/ui/primitives/document-flow/types.ts index 2c24f8c96..c9244ad05 100644 --- a/packages/ui/primitives/document-flow/types.ts +++ b/packages/ui/primitives/document-flow/types.ts @@ -3,6 +3,8 @@ import { z } from 'zod'; import { FieldType } from '@documenso/prisma/client'; export const ZDocumentFlowFormSchema = z.object({ + title: z.string().min(1), + signers: z .array( z.object({ @@ -52,6 +54,6 @@ export interface DocumentFlowStep { title: string; description: string; stepIndex: number; - onBackStep?: () => void; - onNextStep?: () => void; + onBackStep?: () => unknown; + onNextStep?: () => unknown; } From 7e4c44e820f8529d10fefd445e3a20588529cb93 Mon Sep 17 00:00:00 2001 From: Szymon Sus Date: Tue, 28 Nov 2023 23:10:15 +0100 Subject: [PATCH 16/51] perf(web, lib): do not await inside promise statements (#692) --- apps/web/src/app/(dashboard)/documents/[id]/page.tsx | 4 ++-- packages/lib/server-only/user/get-all-users.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index 08d5f61d3..b26b6308c 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -43,11 +43,11 @@ export default async function DocumentPage({ params }: DocumentPageProps) { const { documentData } = document; const [recipients, fields] = await Promise.all([ - await getRecipientsForDocument({ + getRecipientsForDocument({ documentId, userId: user.id, }), - await getFieldsForDocument({ + getFieldsForDocument({ documentId, userId: user.id, }), diff --git a/packages/lib/server-only/user/get-all-users.ts b/packages/lib/server-only/user/get-all-users.ts index 71e670e7d..797d1e0b2 100644 --- a/packages/lib/server-only/user/get-all-users.ts +++ b/packages/lib/server-only/user/get-all-users.ts @@ -32,7 +32,7 @@ export const findUsers = async ({ }); const [users, count] = await Promise.all([ - await prisma.user.findMany({ + prisma.user.findMany({ include: { Subscription: true, Document: { @@ -45,7 +45,7 @@ export const findUsers = async ({ skip: Math.max(page - 1, 0) * perPage, take: perPage, }), - await prisma.user.count({ + prisma.user.count({ where: whereClause, }), ]); From dad56b49294f57673142b67cdf21e6eb27041ab2 Mon Sep 17 00:00:00 2001 From: Tanay <114291962+tanayvaswani@users.noreply.github.com> Date: Wed, 29 Nov 2023 03:41:29 +0530 Subject: [PATCH 17/51] fix: minor in file extension (#694) --- .../{add-signature.types.tsx => add-signature.types.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/ui/primitives/document-flow/{add-signature.types.tsx => add-signature.types.ts} (100%) diff --git a/packages/ui/primitives/document-flow/add-signature.types.tsx b/packages/ui/primitives/document-flow/add-signature.types.ts similarity index 100% rename from packages/ui/primitives/document-flow/add-signature.types.tsx rename to packages/ui/primitives/document-flow/add-signature.types.ts From 35d0fed8b3a277b11570e818d8238a49b80e9e77 Mon Sep 17 00:00:00 2001 From: cuttingedge1109 <53085803+cuttingedge1109@users.noreply.github.com> Date: Wed, 29 Nov 2023 20:06:25 +0100 Subject: [PATCH 18/51] fix: Fix typo in web build command in doc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 96dfbd603..89f44a926 100644 --- a/README.md +++ b/README.md @@ -240,7 +240,7 @@ Now you can install the dependencies and build it: ``` npm i -npm run:build:web +npm run build:web npm run prisma:migrate-deploy ``` From 252dd0008cfaffb21fb179f252793b1c171e299a Mon Sep 17 00:00:00 2001 From: Bilal Ahmad Bhat Date: Thu, 30 Nov 2023 13:12:15 +0530 Subject: [PATCH 19/51] feat: add link to homepage on the complete sign page for logged in users (#691) * feat: add link to homepage on the complete sign page for logged in users * feat: added ChevronLeft icon to the link * feat: remove icon from the link --- .../(signing)/sign/[token]/complete/page.tsx | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx index 67af3c7fa..b9a8ba6d7 100644 --- a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx @@ -2,6 +2,7 @@ import Link from 'next/link'; import { notFound } from 'next/navigation'; import { CheckCircle2, Clock8 } from 'lucide-react'; +import { getServerSession } from 'next-auth'; import { match } from 'ts-pattern'; import signingCelebration from '@documenso/assets/images/signing-celebration.png'; @@ -53,6 +54,9 @@ export default async function CompletedSigningPage({ fields.find((field) => field.type === FieldType.NAME)?.customText || recipient.email; + const sessionData = await getServerSession(); + const isLoggedIn = !!sessionData?.user; + return (
{/* Card with recipient */} @@ -105,15 +109,21 @@ export default async function CompletedSigningPage({ />
-

- Want to send slick signing links like this one?{' '} - - Check out Documenso. + {isLoggedIn ? ( + + Go Back Home -

+ ) : ( +

+ Want to send slick signing links like this one?{' '} + + Check out Documenso. + +

+ )}
); From 1d79ebbda3c3f5cd68a757e3729f097ee35f9374 Mon Sep 17 00:00:00 2001 From: david-loe <56305409+david-loe@users.noreply.github.com> Date: Thu, 30 Nov 2023 08:46:33 +0100 Subject: [PATCH 20/51] fix: body exeeded undefined limit (#679) * fixed bodySizeLimit * fix: update marketing config --------- Co-authored-by: Lucas Smith --- apps/marketing/next.config.js | 4 +++- apps/web/next.config.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index 41a80c12c..ef89f84b5 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -20,8 +20,10 @@ const FONT_CAVEAT_BYTES = fs.readFileSync( /** @type {import('next').NextConfig} */ const config = { experimental: { - serverActionsBodySizeLimit: '10mb', outputFileTracingRoot: path.join(__dirname, '../../'), + serverActions: { + bodySizeLimit: '50mb' + }, }, reactStrictMode: true, transpilePackages: [ diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 97af05ab5..29a7397c0 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -22,7 +22,9 @@ const config = { output: process.env.DOCKER_OUTPUT ? 'standalone' : undefined, experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), - serverActionsBodySizeLimit: '50mb', + serverActions: { + bodySizeLimit: '50mb' + }, }, reactStrictMode: true, transpilePackages: [ From c16c36a1fc95bef370423a5c8be7c6d6cc062b71 Mon Sep 17 00:00:00 2001 From: cuttingedge1109 <53085803+cuttingedge1109@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:38:54 +0100 Subject: [PATCH 21/51] fix: add a script for db seed with env --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 8c154401c..df6361aef 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "prisma:generate": "npm run with:env -- npm run prisma:generate -w @documenso/prisma", "prisma:migrate-dev": "npm run with:env -- npm run prisma:migrate-dev -w @documenso/prisma", "prisma:migrate-deploy": "npm run with:env -- npm run prisma:migrate-deploy -w @documenso/prisma", + "prisma:seed": "npm run with:env -- npm run prisma:seed -w @documenso/prisma", "prisma:studio": "npm run with:env -- npx prisma studio --schema packages/prisma/schema.prisma", "with:env": "dotenv -e .env -e .env.local --", "reset:hard": "npm run clean && npm i && npm run prisma:generate" From 792158c2cba1aecb6357448ccd48214adeebf71c Mon Sep 17 00:00:00 2001 From: Nafees Nazik <84864519+G3root@users.noreply.github.com> Date: Fri, 1 Dec 2023 05:52:16 +0530 Subject: [PATCH 22/51] feat: add two factor auth (#643) Add two factor authentication for users who wish to enhance the security of their accounts. --- .env.example | 5 + apps/web/package.json | 1 + .../app/(dashboard)/settings/billing/page.tsx | 2 +- .../(dashboard)/settings/password/page.tsx | 20 +- .../app/(dashboard)/settings/profile/page.tsx | 2 +- .../(dashboard)/settings/security/page.tsx | 46 ++ .../(dashboard)/layout/profile-dropdown.tsx | 8 +- .../settings/layout/desktop-nav.tsx | 10 +- .../settings/layout/mobile-nav.tsx | 10 +- .../forms/2fa/authenticator-app.tsx | 58 +++ .../2fa/disable-authenticator-app-dialog.tsx | 161 ++++++ .../2fa/enable-authenticator-app-dialog.tsx | 283 +++++++++++ .../forms/2fa/recovery-code-list.tsx | 57 +++ .../components/forms/2fa/recovery-codes.tsx | 43 ++ .../forms/2fa/view-recovery-codes-dialog.tsx | 151 ++++++ apps/web/src/components/forms/signin.tsx | 167 ++++-- package-lock.json | 480 +++++++++++++++++- packages/lib/constants/crypto.ts | 1 + packages/lib/next-auth/auth-options.ts | 24 +- packages/lib/next-auth/error-codes.ts | 11 + packages/lib/package.json | 3 + packages/lib/server-only/2fa/disable-2fa.ts | 48 ++ packages/lib/server-only/2fa/enable-2fa.ts | 47 ++ .../lib/server-only/2fa/get-backup-code.ts | 38 ++ .../lib/server-only/2fa/is-2fa-availble.ts | 17 + packages/lib/server-only/2fa/setup-2fa.ts | 76 +++ packages/lib/server-only/2fa/validate-2fa.ts | 35 ++ .../lib/server-only/2fa/verify-2fa-token.ts | 33 ++ .../lib/server-only/2fa/verify-backup-code.ts | 18 + packages/lib/server-only/auth/hash.ts | 6 +- packages/lib/universal/crypto.ts | 32 ++ .../20231105184518_add_2fa/migration.sql | 4 + packages/prisma/schema.prisma | 41 +- packages/trpc/package.json | 3 +- packages/trpc/server/auth-router/router.ts | 25 +- packages/trpc/server/auth-router/schema.ts | 2 + packages/trpc/server/router.ts | 2 + .../router.ts | 105 ++++ .../schema.ts | 32 ++ packages/tsconfig/process-env.d.ts | 1 + packages/ui/primitives/input.tsx | 39 +- turbo.json | 1 + 42 files changed, 2056 insertions(+), 92 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/settings/security/page.tsx create mode 100644 apps/web/src/components/forms/2fa/authenticator-app.tsx create mode 100644 apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx create mode 100644 apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx create mode 100644 apps/web/src/components/forms/2fa/recovery-code-list.tsx create mode 100644 apps/web/src/components/forms/2fa/recovery-codes.tsx create mode 100644 apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx create mode 100644 packages/lib/constants/crypto.ts create mode 100644 packages/lib/server-only/2fa/disable-2fa.ts create mode 100644 packages/lib/server-only/2fa/enable-2fa.ts create mode 100644 packages/lib/server-only/2fa/get-backup-code.ts create mode 100644 packages/lib/server-only/2fa/is-2fa-availble.ts create mode 100644 packages/lib/server-only/2fa/setup-2fa.ts create mode 100644 packages/lib/server-only/2fa/validate-2fa.ts create mode 100644 packages/lib/server-only/2fa/verify-2fa-token.ts create mode 100644 packages/lib/server-only/2fa/verify-backup-code.ts create mode 100644 packages/lib/universal/crypto.ts create mode 100644 packages/prisma/migrations/20231105184518_add_2fa/migration.sql create mode 100644 packages/trpc/server/two-factor-authentication-router/router.ts create mode 100644 packages/trpc/server/two-factor-authentication-router/schema.ts diff --git a/.env.example b/.env.example index 7bd71c04b..45c26f6be 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,11 @@ NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[CRYPTO]] +# Application Key for symmetric encryption and decryption +# This should be a random string of at least 32 characters +NEXT_PRIVATE_ENCRYPTION_KEY="CAFEBABE" + # [[AUTH OPTIONAL]] NEXT_PRIVATE_GOOGLE_CLIENT_ID="" NEXT_PRIVATE_GOOGLE_CLIENT_SECRET="" diff --git a/apps/web/package.json b/apps/web/package.json index aed5aef06..b5bb1c218 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -44,6 +44,7 @@ "sharp": "0.32.5", "ts-pattern": "^5.0.5", "typescript": "5.2.2", + "uqr": "^0.1.2", "zod": "^3.22.4" }, "devDependencies": { diff --git a/apps/web/src/app/(dashboard)/settings/billing/page.tsx b/apps/web/src/app/(dashboard)/settings/billing/page.tsx index c7161f4ae..61dff3216 100644 --- a/apps/web/src/app/(dashboard)/settings/billing/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/billing/page.tsx @@ -41,7 +41,7 @@ export default async function BillingSettingsPage() { return (
-

Billing

+

Billing

{isMissingOrInactiveOrFreePlan && ( diff --git a/apps/web/src/app/(dashboard)/settings/password/page.tsx b/apps/web/src/app/(dashboard)/settings/password/page.tsx index 701335180..dd344a1d1 100644 --- a/apps/web/src/app/(dashboard)/settings/password/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/password/page.tsx @@ -1,19 +1,5 @@ -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { redirect } from 'next/navigation'; -import { PasswordForm } from '~/components/forms/password'; - -export default async function PasswordSettingsPage() { - const { user } = await getRequiredServerComponentSession(); - - return ( -
-

Password

- -

Here you can update your password.

- -
- - -
- ); +export default function PasswordSettingsPage() { + redirect('/settings/security'); } diff --git a/apps/web/src/app/(dashboard)/settings/profile/page.tsx b/apps/web/src/app/(dashboard)/settings/profile/page.tsx index b577ec93e..cb64fb9cd 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/page.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/page.tsx @@ -7,7 +7,7 @@ export default async function ProfileSettingsPage() { return (
-

Profile

+

Profile

Here you can edit your personal details.

diff --git a/apps/web/src/app/(dashboard)/settings/security/page.tsx b/apps/web/src/app/(dashboard)/settings/security/page.tsx new file mode 100644 index 000000000..9e99b73e8 --- /dev/null +++ b/apps/web/src/app/(dashboard)/settings/security/page.tsx @@ -0,0 +1,46 @@ +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; + +import { AuthenticatorApp } from '~/components/forms/2fa/authenticator-app'; +import { RecoveryCodes } from '~/components/forms/2fa/recovery-codes'; +import { PasswordForm } from '~/components/forms/password'; + +export default async function SecuritySettingsPage() { + const { user } = await getRequiredServerComponentSession(); + + return ( +
+

Security

+ +

+ Here you can manage your password and security settings. +

+ +
+ + + +
+ +

Two Factor Authentication

+ +

+ Add and manage your two factor security settings to add an extra layer of security to your + account! +

+ +
+
Two-factor methods
+ + +
+ + {user.twoFactorEnabled && ( +
+
Recovery methods
+ + +
+ )} +
+ ); +} diff --git a/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx b/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx index d699dea4b..99761a0d3 100644 --- a/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx +++ b/apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx @@ -4,7 +4,7 @@ import Link from 'next/link'; import { CreditCard, - Key, + Lock, LogOut, User as LucideUser, Monitor, @@ -87,9 +87,9 @@ export const ProfileDropdown = ({ user }: ProfileDropdownProps) => { - - - Password + + + Security diff --git a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx index 901c6a5ae..f4b2aae5e 100644 --- a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx @@ -5,7 +5,7 @@ import { HTMLAttributes } from 'react'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import { CreditCard, Key, User } from 'lucide-react'; +import { CreditCard, Lock, User } from 'lucide-react'; import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import { cn } from '@documenso/ui/lib/utils'; @@ -35,16 +35,16 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { - + diff --git a/apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx b/apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx index ffe2b0d80..28ffc960f 100644 --- a/apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx +++ b/apps/web/src/components/(dashboard)/settings/layout/mobile-nav.tsx @@ -5,7 +5,7 @@ import { HTMLAttributes } from 'react'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import { CreditCard, Key, User } from 'lucide-react'; +import { CreditCard, Lock, User } from 'lucide-react'; import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import { cn } from '@documenso/ui/lib/utils'; @@ -38,16 +38,16 @@ export const MobileNav = ({ className, ...props }: MobileNavProps) => { - + diff --git a/apps/web/src/components/forms/2fa/authenticator-app.tsx b/apps/web/src/components/forms/2fa/authenticator-app.tsx new file mode 100644 index 000000000..1d164bd22 --- /dev/null +++ b/apps/web/src/components/forms/2fa/authenticator-app.tsx @@ -0,0 +1,58 @@ +'use client'; + +import { useState } from 'react'; + +import { Button } from '@documenso/ui/primitives/button'; + +import { DisableAuthenticatorAppDialog } from './disable-authenticator-app-dialog'; +import { EnableAuthenticatorAppDialog } from './enable-authenticator-app-dialog'; + +type AuthenticatorAppProps = { + isTwoFactorEnabled: boolean; +}; + +export const AuthenticatorApp = ({ isTwoFactorEnabled }: AuthenticatorAppProps) => { + const [modalState, setModalState] = useState<'enable' | 'disable' | null>(null); + + const isEnableDialogOpen = modalState === 'enable'; + const isDisableDialogOpen = modalState === 'disable'; + + return ( + <> +
+
+

Authenticator app

+ +

+ Create one-time passwords that serve as a secondary authentication method for confirming + your identity when requested during the sign-in process. +

+
+ +
+ {isTwoFactorEnabled ? ( + + ) : ( + + )} +
+
+ + !open && setModalState(null)} + /> + + !open && setModalState(null)} + /> + + ); +}; diff --git a/apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx new file mode 100644 index 000000000..eac574181 --- /dev/null +++ b/apps/web/src/components/forms/2fa/disable-authenticator-app-dialog.tsx @@ -0,0 +1,161 @@ +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { flushSync } from 'react-dom'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export const ZDisableTwoFactorAuthenticationForm = z.object({ + password: z.string().min(6).max(72), + backupCode: z.string(), +}); + +export type TDisableTwoFactorAuthenticationForm = z.infer< + typeof ZDisableTwoFactorAuthenticationForm +>; + +export type DisableAuthenticatorAppDialogProps = { + open: boolean; + onOpenChange: (_open: boolean) => void; +}; + +export const DisableAuthenticatorAppDialog = ({ + open, + onOpenChange, +}: DisableAuthenticatorAppDialogProps) => { + const router = useRouter(); + const { toast } = useToast(); + + const { mutateAsync: disableTwoFactorAuthentication } = + trpc.twoFactorAuthentication.disable.useMutation(); + + const disableTwoFactorAuthenticationForm = useForm({ + defaultValues: { + password: '', + backupCode: '', + }, + resolver: zodResolver(ZDisableTwoFactorAuthenticationForm), + }); + + const { isSubmitting: isDisableTwoFactorAuthenticationSubmitting } = + disableTwoFactorAuthenticationForm.formState; + + const onDisableTwoFactorAuthenticationFormSubmit = async ({ + password, + backupCode, + }: TDisableTwoFactorAuthenticationForm) => { + try { + await disableTwoFactorAuthentication({ password, backupCode }); + + toast({ + title: 'Two-factor authentication disabled', + description: + 'Two-factor authentication has been disabled for your account. You will no longer be required to enter a code from your authenticator app when signing in.', + }); + + flushSync(() => { + onOpenChange(false); + }); + + router.refresh(); + } catch (_err) { + toast({ + title: 'Unable to disable two-factor authentication', + description: + 'We were unable to disable two-factor authentication for your account. Please ensure that you have entered your password and backup code correctly and try again.', + variant: 'destructive', + }); + } + }; + + return ( + + + + Disable Authenticator App + + + To disable the Authenticator App for your account, please enter your password and a + backup code. If you do not have a backup code available, please contact support. + + + +
+ + ( + + Password + + + + + + )} + /> + + ( + + Backup Code + + + + + + )} + /> + +
+ + + +
+ + +
+
+ ); +}; diff --git a/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx new file mode 100644 index 000000000..8bf835ef5 --- /dev/null +++ b/apps/web/src/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -0,0 +1,283 @@ +import { useMemo } from 'react'; + +import { useRouter } from 'next/navigation'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { flushSync } from 'react-dom'; +import { useForm } from 'react-hook-form'; +import { match } from 'ts-pattern'; +import { renderSVG } from 'uqr'; +import { z } from 'zod'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { RecoveryCodeList } from './recovery-code-list'; + +export const ZSetupTwoFactorAuthenticationForm = z.object({ + password: z.string().min(6).max(72), +}); + +export type TSetupTwoFactorAuthenticationForm = z.infer; + +export const ZEnableTwoFactorAuthenticationForm = z.object({ + token: z.string(), +}); + +export type TEnableTwoFactorAuthenticationForm = z.infer; + +export type EnableAuthenticatorAppDialogProps = { + open: boolean; + onOpenChange: (_open: boolean) => void; +}; + +export const EnableAuthenticatorAppDialog = ({ + open, + onOpenChange, +}: EnableAuthenticatorAppDialogProps) => { + const router = useRouter(); + const { toast } = useToast(); + + const { mutateAsync: setupTwoFactorAuthentication, data: setupTwoFactorAuthenticationData } = + trpc.twoFactorAuthentication.setup.useMutation(); + + const { mutateAsync: enableTwoFactorAuthentication, data: enableTwoFactorAuthenticationData } = + trpc.twoFactorAuthentication.enable.useMutation(); + + const setupTwoFactorAuthenticationForm = useForm({ + defaultValues: { + password: '', + }, + resolver: zodResolver(ZSetupTwoFactorAuthenticationForm), + }); + + const { isSubmitting: isSetupTwoFactorAuthenticationSubmitting } = + setupTwoFactorAuthenticationForm.formState; + + const enableTwoFactorAuthenticationForm = useForm({ + defaultValues: { + token: '', + }, + resolver: zodResolver(ZEnableTwoFactorAuthenticationForm), + }); + + const { isSubmitting: isEnableTwoFactorAuthenticationSubmitting } = + enableTwoFactorAuthenticationForm.formState; + + const step = useMemo(() => { + if (!setupTwoFactorAuthenticationData || isSetupTwoFactorAuthenticationSubmitting) { + return 'setup'; + } + + if (!enableTwoFactorAuthenticationData || isEnableTwoFactorAuthenticationSubmitting) { + return 'enable'; + } + + return 'view'; + }, [ + setupTwoFactorAuthenticationData, + isSetupTwoFactorAuthenticationSubmitting, + enableTwoFactorAuthenticationData, + isEnableTwoFactorAuthenticationSubmitting, + ]); + + const onSetupTwoFactorAuthenticationFormSubmit = async ({ + password, + }: TSetupTwoFactorAuthenticationForm) => { + try { + await setupTwoFactorAuthentication({ password }); + } catch (_err) { + toast({ + title: 'Unable to setup two-factor authentication', + description: + 'We were unable to setup two-factor authentication for your account. Please ensure that you have entered your password correctly and try again.', + variant: 'destructive', + }); + } + }; + + const onEnableTwoFactorAuthenticationFormSubmit = async ({ + token, + }: TEnableTwoFactorAuthenticationForm) => { + try { + await enableTwoFactorAuthentication({ code: token }); + + toast({ + title: 'Two-factor authentication enabled', + description: + 'Two-factor authentication has been enabled for your account. You will now be required to enter a code from your authenticator app when signing in.', + }); + } catch (_err) { + toast({ + title: 'Unable to setup two-factor authentication', + description: + 'We were unable to setup two-factor authentication for your account. Please ensure that you have entered your password correctly and try again.', + variant: 'destructive', + }); + } + }; + + const onCompleteClick = () => { + flushSync(() => { + onOpenChange(false); + }); + + router.refresh(); + }; + + return ( + + + + Enable Authenticator App + + {step === 'setup' && ( + + To enable two-factor authentication, please enter your password below. + + )} + + {step === 'view' && ( + + Your recovery codes are listed below. Please store them in a safe place. + + )} + + + {match(step) + .with('setup', () => { + return ( +
+ + ( + + Password + + + + + + )} + /> + +
+ + + +
+ + + ); + }) + .with('enable', () => ( +
+ +

+ To enable two-factor authentication, scan the following QR code using your + authenticator app. +

+ +
+ +

+ If your authenticator app does not support QR codes, you can use the following + code instead: +

+ +

+ {setupTwoFactorAuthenticationData?.secret} +

+ +

+ Once you have scanned the QR code or entered the code manually, enter the code + provided by your authenticator app below. +

+ + ( + + Token + + + + + + )} + /> + +
+ + + +
+ + + )) + .with('view', () => ( +
+ {enableTwoFactorAuthenticationData?.recoveryCodes && ( + + )} + +
+ +
+
+ )) + .exhaustive()} + +
+ ); +}; diff --git a/apps/web/src/components/forms/2fa/recovery-code-list.tsx b/apps/web/src/components/forms/2fa/recovery-code-list.tsx new file mode 100644 index 000000000..d2efb0b4b --- /dev/null +++ b/apps/web/src/components/forms/2fa/recovery-code-list.tsx @@ -0,0 +1,57 @@ +import { Copy } from 'lucide-react'; + +import { useCopyToClipboard } from '@documenso/lib/client-only/hooks/use-copy-to-clipboard'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +export type RecoveryCodeListProps = { + recoveryCodes: string[]; +}; + +export const RecoveryCodeList = ({ recoveryCodes }: RecoveryCodeListProps) => { + const { toast } = useToast(); + const [, copyToClipboard] = useCopyToClipboard(); + + const onCopyRecoveryCodeClick = async (code: string) => { + try { + const result = await copyToClipboard(code); + + if (!result) { + throw new Error('Unable to copy recovery code'); + } + + toast({ + title: 'Recovery code copied', + description: 'Your recovery code has been copied to your clipboard.', + }); + } catch (_err) { + toast({ + title: 'Unable to copy recovery code', + description: + 'We were unable to copy your recovery code to your clipboard. Please try again.', + variant: 'destructive', + }); + } + }; + + return ( +
+ {recoveryCodes.map((code) => ( +
+ {code} + +
+ +
+
+ ))} +
+ ); +}; diff --git a/apps/web/src/components/forms/2fa/recovery-codes.tsx b/apps/web/src/components/forms/2fa/recovery-codes.tsx new file mode 100644 index 000000000..7e8950227 --- /dev/null +++ b/apps/web/src/components/forms/2fa/recovery-codes.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { useState } from 'react'; + +import { Button } from '@documenso/ui/primitives/button'; + +import { ViewRecoveryCodesDialog } from './view-recovery-codes-dialog'; + +type RecoveryCodesProps = { + // backupCodes: string[] | null; + isTwoFactorEnabled: boolean; +}; + +export const RecoveryCodes = ({ isTwoFactorEnabled }: RecoveryCodesProps) => { + const [isOpen, setIsOpen] = useState(false); + + return ( + <> +
+
+

Recovery Codes

+ +

+ Recovery codes are used to access your account in the event that you lose access to your + authenticator app. +

+
+ +
+ +
+
+ + + + ); +}; diff --git a/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx new file mode 100644 index 000000000..6275f16d6 --- /dev/null +++ b/apps/web/src/components/forms/2fa/view-recovery-codes-dialog.tsx @@ -0,0 +1,151 @@ +import { useMemo } from 'react'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { match } from 'ts-pattern'; +import { z } from 'zod'; + +import { trpc } from '@documenso/trpc/react'; +import { Button } from '@documenso/ui/primitives/button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@documenso/ui/primitives/dialog'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@documenso/ui/primitives/form/form'; +import { Input } from '@documenso/ui/primitives/input'; +import { useToast } from '@documenso/ui/primitives/use-toast'; + +import { RecoveryCodeList } from './recovery-code-list'; + +export const ZViewRecoveryCodesForm = z.object({ + password: z.string().min(6).max(72), +}); + +export type TViewRecoveryCodesForm = z.infer; + +export type ViewRecoveryCodesDialogProps = { + open: boolean; + onOpenChange: (_open: boolean) => void; +}; + +export const ViewRecoveryCodesDialog = ({ open, onOpenChange }: ViewRecoveryCodesDialogProps) => { + const { toast } = useToast(); + + const { mutateAsync: viewRecoveryCodes, data: viewRecoveryCodesData } = + trpc.twoFactorAuthentication.viewRecoveryCodes.useMutation(); + + const viewRecoveryCodesForm = useForm({ + defaultValues: { + password: '', + }, + resolver: zodResolver(ZViewRecoveryCodesForm), + }); + + const { isSubmitting: isViewRecoveryCodesSubmitting } = viewRecoveryCodesForm.formState; + + const step = useMemo(() => { + if (!viewRecoveryCodesData || isViewRecoveryCodesSubmitting) { + return 'authenticate'; + } + + return 'view'; + }, [viewRecoveryCodesData, isViewRecoveryCodesSubmitting]); + + const onViewRecoveryCodesFormSubmit = async ({ password }: TViewRecoveryCodesForm) => { + try { + await viewRecoveryCodes({ password }); + } catch (_err) { + toast({ + title: 'Unable to view recovery codes', + description: + 'We were unable to view your recovery codes. Please ensure that you have entered your password correctly and try again.', + variant: 'destructive', + }); + } + }; + + return ( + + + + View Recovery Codes + + {step === 'authenticate' && ( + + To view your recovery codes, please enter your password below. + + )} + + {step === 'view' && ( + + Your recovery codes are listed below. Please store them in a safe place. + + )} + + + {match(step) + .with('authenticate', () => { + return ( +
+ + ( + + Password + + + + + + )} + /> + +
+ + + +
+ + + ); + }) + .with('view', () => ( +
+ {viewRecoveryCodesData?.recoveryCodes && ( + + )} + +
+ +
+
+ )) + .exhaustive()} +
+
+ ); +}; diff --git a/apps/web/src/components/forms/signin.tsx b/apps/web/src/components/forms/signin.tsx index abdc1efe6..0d7dd723f 100644 --- a/apps/web/src/components/forms/signin.tsx +++ b/apps/web/src/components/forms/signin.tsx @@ -3,7 +3,6 @@ import { useState } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Eye, EyeOff } from 'lucide-react'; import { signIn } from 'next-auth/react'; import { useForm } from 'react-hook-form'; import { FcGoogle } from 'react-icons/fc'; @@ -12,23 +11,30 @@ import { z } from 'zod'; import { ErrorCode, isErrorCode } from '@documenso/lib/next-auth/error-codes'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@documenso/ui/primitives/dialog'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; -import { Input } from '@documenso/ui/primitives/input'; +import { Input, PasswordInput } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; -const ERROR_MESSAGES = { +const ERROR_MESSAGES: Partial> = { [ErrorCode.CREDENTIALS_NOT_FOUND]: 'The email or password provided is incorrect', [ErrorCode.INCORRECT_EMAIL_PASSWORD]: 'The email or password provided is incorrect', [ErrorCode.USER_MISSING_PASSWORD]: 'This account appears to be using a social login method, please sign in using that method', + [ErrorCode.INCORRECT_TWO_FACTOR_CODE]: 'The two-factor authentication code provided is incorrect', + [ErrorCode.INCORRECT_TWO_FACTOR_BACKUP_CODE]: 'The backup code provided is incorrect', }; +const TwoFactorEnabledErrorCode = ErrorCode.TWO_FACTOR_MISSING_CREDENTIALS; + const LOGIN_REDIRECT_PATH = '/documents'; export const ZSignInFormSchema = z.object({ email: z.string().email().min(1), - password: z.string().min(6, { message: 'Invalid password' }).max(72), + password: z.string().min(6).max(72), + totpCode: z.string().trim().optional(), + backupCode: z.string().trim().optional(), }); export type TSignInFormSchema = z.infer; @@ -39,33 +45,84 @@ export type SignInFormProps = { export const SignInForm = ({ className }: SignInFormProps) => { const { toast } = useToast(); - const [showPassword, setShowPassword] = useState(false); + const [isTwoFactorAuthenticationDialogOpen, setIsTwoFactorAuthenticationDialogOpen] = + useState(false); + + const [twoFactorAuthenticationMethod, setTwoFactorAuthenticationMethod] = useState< + 'totp' | 'backup' + >('totp'); const { register, handleSubmit, + setValue, formState: { errors, isSubmitting }, } = useForm({ values: { email: '', password: '', + totpCode: '', + backupCode: '', }, resolver: zodResolver(ZSignInFormSchema), }); - const onFormSubmit = async ({ email, password }: TSignInFormSchema) => { + const onCloseTwoFactorAuthenticationDialog = () => { + setValue('totpCode', ''); + setValue('backupCode', ''); + + setIsTwoFactorAuthenticationDialogOpen(false); + }; + + const onToggleTwoFactorAuthenticationMethodClick = () => { + const method = twoFactorAuthenticationMethod === 'totp' ? 'backup' : 'totp'; + + if (method === 'totp') { + setValue('backupCode', ''); + } + + if (method === 'backup') { + setValue('totpCode', ''); + } + + setTwoFactorAuthenticationMethod(method); + }; + + const onFormSubmit = async ({ email, password, totpCode, backupCode }: TSignInFormSchema) => { try { - const result = await signIn('credentials', { + const credentials: Record = { email, password, + }; + + if (totpCode) { + credentials.totpCode = totpCode; + } + + if (backupCode) { + credentials.backupCode = backupCode; + } + + const result = await signIn('credentials', { + ...credentials, + callbackUrl: LOGIN_REDIRECT_PATH, redirect: false, }); if (result?.error && isErrorCode(result.error)) { + if (result.error === TwoFactorEnabledErrorCode) { + setIsTwoFactorAuthenticationDialogOpen(true); + + return; + } + + const errorMessage = ERROR_MESSAGES[result.error]; + toast({ variant: 'destructive', - description: ERROR_MESSAGES[result.error], + title: 'Unable to sign in', + description: errorMessage ?? 'An unknown error occurred', }); return; @@ -118,31 +175,14 @@ export const SignInForm = ({ className }: SignInFormProps) => { Password -
- - - -
+
@@ -173,6 +213,67 @@ export const SignInForm = ({ className }: SignInFormProps) => { Google + + + + + Two-Factor Authentication + + +
+ {twoFactorAuthenticationMethod === 'totp' && ( +
+ + + + + +
+ )} + + {twoFactorAuthenticationMethod === 'backup' && ( +
+ + + + + +
+ )} + +
+ + + +
+
+
+
); }; diff --git a/package-lock.json b/package-lock.json index 6f5a6d6a9..56d332429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,6 +111,7 @@ "sharp": "0.32.5", "ts-pattern": "^5.0.5", "typescript": "5.2.2", + "uqr": "^0.1.2", "zod": "^3.22.4" }, "devDependencies": { @@ -2860,6 +2861,465 @@ "node": ">= 10" } }, + "node_modules/@noble/ciphers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.4.0.tgz", + "integrity": "sha512-xaUaUUDWbHIFSxaQ/pIe+33VG2mfJp6N/KxKLmZr5biWdNznCAmfu24QRhX10BbVAuqOahAoyp0S4M9md6GPDw==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/argon2": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.5.2.tgz", + "integrity": "sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@node-rs/argon2-android-arm-eabi": "1.5.2", + "@node-rs/argon2-android-arm64": "1.5.2", + "@node-rs/argon2-darwin-arm64": "1.5.2", + "@node-rs/argon2-darwin-x64": "1.5.2", + "@node-rs/argon2-freebsd-x64": "1.5.2", + "@node-rs/argon2-linux-arm-gnueabihf": "1.5.2", + "@node-rs/argon2-linux-arm64-gnu": "1.5.2", + "@node-rs/argon2-linux-arm64-musl": "1.5.2", + "@node-rs/argon2-linux-x64-gnu": "1.5.2", + "@node-rs/argon2-linux-x64-musl": "1.5.2", + "@node-rs/argon2-win32-arm64-msvc": "1.5.2", + "@node-rs/argon2-win32-ia32-msvc": "1.5.2", + "@node-rs/argon2-win32-x64-msvc": "1.5.2" + } + }, + "node_modules/@node-rs/argon2-android-arm-eabi": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.5.2.tgz", + "integrity": "sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-android-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.5.2.tgz", + "integrity": "sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.5.2.tgz", + "integrity": "sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.5.2.tgz", + "integrity": "sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.5.2.tgz", + "integrity": "sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-linux-arm-gnueabihf": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.5.2.tgz", + "integrity": "sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-linux-arm64-gnu": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.5.2.tgz", + "integrity": "sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-linux-arm64-musl": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.5.2.tgz", + "integrity": "sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-linux-x64-gnu": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.5.2.tgz", + "integrity": "sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-linux-x64-musl": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.5.2.tgz", + "integrity": "sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-win32-arm64-msvc": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.5.2.tgz", + "integrity": "sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-win32-ia32-msvc": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.5.2.tgz", + "integrity": "sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/argon2-win32-x64-msvc": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.5.2.tgz", + "integrity": "sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.7.3.tgz", + "integrity": "sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/bcrypt-android-arm-eabi": "1.7.3", + "@node-rs/bcrypt-android-arm64": "1.7.3", + "@node-rs/bcrypt-darwin-arm64": "1.7.3", + "@node-rs/bcrypt-darwin-x64": "1.7.3", + "@node-rs/bcrypt-freebsd-x64": "1.7.3", + "@node-rs/bcrypt-linux-arm-gnueabihf": "1.7.3", + "@node-rs/bcrypt-linux-arm64-gnu": "1.7.3", + "@node-rs/bcrypt-linux-arm64-musl": "1.7.3", + "@node-rs/bcrypt-linux-x64-gnu": "1.7.3", + "@node-rs/bcrypt-linux-x64-musl": "1.7.3", + "@node-rs/bcrypt-win32-arm64-msvc": "1.7.3", + "@node-rs/bcrypt-win32-ia32-msvc": "1.7.3", + "@node-rs/bcrypt-win32-x64-msvc": "1.7.3" + } + }, + "node_modules/@node-rs/bcrypt-android-arm-eabi": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.7.3.tgz", + "integrity": "sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-android-arm64": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.7.3.tgz", + "integrity": "sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-arm64": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.7.3.tgz", + "integrity": "sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-x64": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.7.3.tgz", + "integrity": "sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-freebsd-x64": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.7.3.tgz", + "integrity": "sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.7.3.tgz", + "integrity": "sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.7.3.tgz", + "integrity": "sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-musl": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.7.3.tgz", + "integrity": "sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-gnu": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.7.3.tgz", + "integrity": "sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-musl": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.7.3.tgz", + "integrity": "sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.7.3.tgz", + "integrity": "sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.7.3.tgz", + "integrity": "sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-x64-msvc": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.7.3.tgz", + "integrity": "sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -14300,6 +14760,15 @@ "node": ">=8" } }, + "node_modules/oslo": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/oslo/-/oslo-0.17.0.tgz", + "integrity": "sha512-UJHew6zFEkJYGWjO4/ARHnX+M7umhJ6IXc6cJA2AQ3BpFwqEqaKjySOfXYuNFQddzfP2zk1aG+xYQG1ODHKwfQ==", + "dependencies": { + "@node-rs/argon2": "^1.5.2", + "@node-rs/bcrypt": "^1.7.3" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -18457,6 +18926,11 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -19781,6 +20255,8 @@ "@documenso/prisma": "*", "@documenso/signing": "*", "@next-auth/prisma-adapter": "1.0.7", + "@noble/ciphers": "0.4.0", + "@noble/hashes": "1.3.2", "@pdf-lib/fontkit": "^1.1.1", "@scure/base": "^1.1.3", "@sindresorhus/slugify": "^2.2.1", @@ -19790,6 +20266,7 @@ "nanoid": "^4.0.2", "next": "14.0.0", "next-auth": "4.24.3", + "oslo": "^0.17.0", "pdf-lib": "^1.17.1", "react": "18.2.0", "remeda": "^1.27.1", @@ -19891,7 +20368,8 @@ "superjson": "^1.13.1", "ts-pattern": "^5.0.5", "zod": "^3.22.4" - } + }, + "devDependencies": {} }, "packages/tsconfig": { "name": "@documenso/tsconfig", diff --git a/packages/lib/constants/crypto.ts b/packages/lib/constants/crypto.ts new file mode 100644 index 000000000..d911cd6cf --- /dev/null +++ b/packages/lib/constants/crypto.ts @@ -0,0 +1 @@ +export const DOCUMENSO_ENCRYPTION_KEY = process.env.NEXT_PRIVATE_ENCRYPTION_KEY; diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 57a37d7fe..6d59b0666 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -10,6 +10,8 @@ import GoogleProvider from 'next-auth/providers/google'; import { prisma } from '@documenso/prisma'; +import { isTwoFactorAuthenticationEnabled } from '../server-only/2fa/is-2fa-availble'; +import { validateTwoFactorAuthentication } from '../server-only/2fa/validate-2fa'; import { getUserByEmail } from '../server-only/user/get-user-by-email'; import { ErrorCode } from './error-codes'; @@ -25,13 +27,19 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { credentials: { email: { label: 'Email', type: 'email' }, password: { label: 'Password', type: 'password' }, + totpCode: { + label: 'Two-factor Code', + type: 'input', + placeholder: 'Code from authenticator app', + }, + backupCode: { label: 'Backup Code', type: 'input', placeholder: 'Two-factor backup code' }, }, authorize: async (credentials, _req) => { if (!credentials) { throw new Error(ErrorCode.CREDENTIALS_NOT_FOUND); } - const { email, password } = credentials; + const { email, password, backupCode, totpCode } = credentials; const user = await getUserByEmail({ email }).catch(() => { throw new Error(ErrorCode.INCORRECT_EMAIL_PASSWORD); @@ -47,6 +55,20 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { throw new Error(ErrorCode.INCORRECT_EMAIL_PASSWORD); } + const is2faEnabled = isTwoFactorAuthenticationEnabled({ user }); + + if (is2faEnabled) { + const isValid = await validateTwoFactorAuthentication({ backupCode, totpCode, user }); + + if (!isValid) { + throw new Error( + totpCode + ? ErrorCode.INCORRECT_TWO_FACTOR_CODE + : ErrorCode.INCORRECT_TWO_FACTOR_BACKUP_CODE, + ); + } + } + return { id: Number(user.id), email: user.email, diff --git a/packages/lib/next-auth/error-codes.ts b/packages/lib/next-auth/error-codes.ts index 26e8f5b97..c3dfafece 100644 --- a/packages/lib/next-auth/error-codes.ts +++ b/packages/lib/next-auth/error-codes.ts @@ -8,4 +8,15 @@ export const ErrorCode = { INCORRECT_EMAIL_PASSWORD: 'INCORRECT_EMAIL_PASSWORD', USER_MISSING_PASSWORD: 'USER_MISSING_PASSWORD', CREDENTIALS_NOT_FOUND: 'CREDENTIALS_NOT_FOUND', + INTERNAL_SEVER_ERROR: 'INTERNAL_SEVER_ERROR', + TWO_FACTOR_ALREADY_ENABLED: 'TWO_FACTOR_ALREADY_ENABLED', + TWO_FACTOR_SETUP_REQUIRED: 'TWO_FACTOR_SETUP_REQUIRED', + TWO_FACTOR_MISSING_SECRET: 'TWO_FACTOR_MISSING_SECRET', + TWO_FACTOR_MISSING_CREDENTIALS: 'TWO_FACTOR_MISSING_CREDENTIALS', + INCORRECT_TWO_FACTOR_CODE: 'INCORRECT_TWO_FACTOR_CODE', + INCORRECT_TWO_FACTOR_BACKUP_CODE: 'INCORRECT_TWO_FACTOR_BACKUP_CODE', + INCORRECT_IDENTITY_PROVIDER: 'INCORRECT_IDENTITY_PROVIDER', + INCORRECT_PASSWORD: 'INCORRECT_PASSWORD', + MISSING_ENCRYPTION_KEY: 'MISSING_ENCRYPTION_KEY', + MISSING_BACKUP_CODE: 'MISSING_BACKUP_CODE', } as const; diff --git a/packages/lib/package.json b/packages/lib/package.json index 56be5a7f0..e9d321e5b 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -25,6 +25,8 @@ "@documenso/prisma": "*", "@documenso/signing": "*", "@next-auth/prisma-adapter": "1.0.7", + "@noble/ciphers": "0.4.0", + "@noble/hashes": "1.3.2", "@pdf-lib/fontkit": "^1.1.1", "@scure/base": "^1.1.3", "@sindresorhus/slugify": "^2.2.1", @@ -34,6 +36,7 @@ "nanoid": "^4.0.2", "next": "14.0.0", "next-auth": "4.24.3", + "oslo": "^0.17.0", "pdf-lib": "^1.17.1", "react": "18.2.0", "remeda": "^1.27.1", diff --git a/packages/lib/server-only/2fa/disable-2fa.ts b/packages/lib/server-only/2fa/disable-2fa.ts new file mode 100644 index 000000000..5b27d5c9d --- /dev/null +++ b/packages/lib/server-only/2fa/disable-2fa.ts @@ -0,0 +1,48 @@ +import { compare } from 'bcrypt'; + +import { prisma } from '@documenso/prisma'; +import { User } from '@documenso/prisma/client'; + +import { ErrorCode } from '../../next-auth/error-codes'; +import { validateTwoFactorAuthentication } from './validate-2fa'; + +type DisableTwoFactorAuthenticationOptions = { + user: User; + backupCode: string; + password: string; +}; + +export const disableTwoFactorAuthentication = async ({ + backupCode, + user, + password, +}: DisableTwoFactorAuthenticationOptions) => { + if (!user.password) { + throw new Error(ErrorCode.USER_MISSING_PASSWORD); + } + + const isCorrectPassword = await compare(password, user.password); + + if (!isCorrectPassword) { + throw new Error(ErrorCode.INCORRECT_PASSWORD); + } + + const isValid = await validateTwoFactorAuthentication({ backupCode, user }); + + if (!isValid) { + throw new Error(ErrorCode.INCORRECT_TWO_FACTOR_BACKUP_CODE); + } + + await prisma.user.update({ + where: { + id: user.id, + }, + data: { + twoFactorEnabled: false, + twoFactorBackupCodes: null, + twoFactorSecret: null, + }, + }); + + return true; +}; diff --git a/packages/lib/server-only/2fa/enable-2fa.ts b/packages/lib/server-only/2fa/enable-2fa.ts new file mode 100644 index 000000000..9f61e52a4 --- /dev/null +++ b/packages/lib/server-only/2fa/enable-2fa.ts @@ -0,0 +1,47 @@ +import { ErrorCode } from '@documenso/lib/next-auth/error-codes'; +import { prisma } from '@documenso/prisma'; +import { User } from '@documenso/prisma/client'; + +import { getBackupCodes } from './get-backup-code'; +import { verifyTwoFactorAuthenticationToken } from './verify-2fa-token'; + +type EnableTwoFactorAuthenticationOptions = { + user: User; + code: string; +}; + +export const enableTwoFactorAuthentication = async ({ + user, + code, +}: EnableTwoFactorAuthenticationOptions) => { + if (user.identityProvider !== 'DOCUMENSO') { + throw new Error(ErrorCode.INCORRECT_IDENTITY_PROVIDER); + } + + if (user.twoFactorEnabled) { + throw new Error(ErrorCode.TWO_FACTOR_ALREADY_ENABLED); + } + + if (!user.twoFactorSecret) { + throw new Error(ErrorCode.TWO_FACTOR_SETUP_REQUIRED); + } + + const isValidToken = await verifyTwoFactorAuthenticationToken({ user, totpCode: code }); + + if (!isValidToken) { + throw new Error(ErrorCode.INCORRECT_TWO_FACTOR_CODE); + } + + const updatedUser = await prisma.user.update({ + where: { + id: user.id, + }, + data: { + twoFactorEnabled: true, + }, + }); + + const recoveryCodes = getBackupCodes({ user: updatedUser }); + + return { recoveryCodes }; +}; diff --git a/packages/lib/server-only/2fa/get-backup-code.ts b/packages/lib/server-only/2fa/get-backup-code.ts new file mode 100644 index 000000000..e1188f37a --- /dev/null +++ b/packages/lib/server-only/2fa/get-backup-code.ts @@ -0,0 +1,38 @@ +import { z } from 'zod'; + +import { User } from '@documenso/prisma/client'; + +import { DOCUMENSO_ENCRYPTION_KEY } from '../../constants/crypto'; +import { symmetricDecrypt } from '../../universal/crypto'; + +interface GetBackupCodesOptions { + user: User; +} + +const ZBackupCodeSchema = z.array(z.string()); + +export const getBackupCodes = ({ user }: GetBackupCodesOptions) => { + const key = DOCUMENSO_ENCRYPTION_KEY; + + if (!user.twoFactorEnabled) { + throw new Error('User has not enabled 2FA'); + } + + if (!user.twoFactorBackupCodes) { + throw new Error('User has no backup codes'); + } + + const secret = Buffer.from(symmetricDecrypt({ key, data: user.twoFactorBackupCodes })).toString( + 'utf-8', + ); + + const data = JSON.parse(secret); + + const result = ZBackupCodeSchema.safeParse(data); + + if (result.success) { + return result.data; + } + + return null; +}; diff --git a/packages/lib/server-only/2fa/is-2fa-availble.ts b/packages/lib/server-only/2fa/is-2fa-availble.ts new file mode 100644 index 000000000..d06a0085d --- /dev/null +++ b/packages/lib/server-only/2fa/is-2fa-availble.ts @@ -0,0 +1,17 @@ +import { User } from '@documenso/prisma/client'; + +import { DOCUMENSO_ENCRYPTION_KEY } from '../../constants/crypto'; + +type IsTwoFactorAuthenticationEnabledOptions = { + user: User; +}; + +export const isTwoFactorAuthenticationEnabled = ({ + user, +}: IsTwoFactorAuthenticationEnabledOptions) => { + return ( + user.twoFactorEnabled && + user.identityProvider === 'DOCUMENSO' && + typeof DOCUMENSO_ENCRYPTION_KEY === 'string' + ); +}; diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts new file mode 100644 index 000000000..30ddf0ec3 --- /dev/null +++ b/packages/lib/server-only/2fa/setup-2fa.ts @@ -0,0 +1,76 @@ +import { base32 } from '@scure/base'; +import { compare } from 'bcrypt'; +import crypto from 'crypto'; +import { createTOTPKeyURI } from 'oslo/otp'; + +import { ErrorCode } from '@documenso/lib/next-auth/error-codes'; +import { prisma } from '@documenso/prisma'; +import { User } from '@documenso/prisma/client'; + +import { DOCUMENSO_ENCRYPTION_KEY } from '../../constants/crypto'; +import { symmetricEncrypt } from '../../universal/crypto'; + +type SetupTwoFactorAuthenticationOptions = { + user: User; + password: string; +}; + +const ISSUER = 'Documenso'; + +export const setupTwoFactorAuthentication = async ({ + user, + password, +}: SetupTwoFactorAuthenticationOptions) => { + const key = DOCUMENSO_ENCRYPTION_KEY; + + if (!key) { + throw new Error(ErrorCode.MISSING_ENCRYPTION_KEY); + } + + if (user.identityProvider !== 'DOCUMENSO') { + throw new Error(ErrorCode.INCORRECT_IDENTITY_PROVIDER); + } + + if (!user.password) { + throw new Error(ErrorCode.USER_MISSING_PASSWORD); + } + + const isCorrectPassword = await compare(password, user.password); + + if (!isCorrectPassword) { + throw new Error(ErrorCode.INCORRECT_PASSWORD); + } + + const secret = crypto.randomBytes(10); + + const backupCodes = new Array(10) + .fill(null) + .map(() => crypto.randomBytes(5).toString('hex')) + .map((code) => `${code.slice(0, 5)}-${code.slice(5)}`.toUpperCase()); + + const accountName = user.email; + const uri = createTOTPKeyURI(ISSUER, accountName, secret); + const encodedSecret = base32.encode(secret); + + await prisma.user.update({ + where: { + id: user.id, + }, + data: { + twoFactorEnabled: false, + twoFactorBackupCodes: symmetricEncrypt({ + data: JSON.stringify(backupCodes), + key: key, + }), + twoFactorSecret: symmetricEncrypt({ + data: encodedSecret, + key: key, + }), + }, + }); + + return { + secret: encodedSecret, + uri, + }; +}; diff --git a/packages/lib/server-only/2fa/validate-2fa.ts b/packages/lib/server-only/2fa/validate-2fa.ts new file mode 100644 index 000000000..7fc76a8bb --- /dev/null +++ b/packages/lib/server-only/2fa/validate-2fa.ts @@ -0,0 +1,35 @@ +import { User } from '@documenso/prisma/client'; + +import { ErrorCode } from '../../next-auth/error-codes'; +import { verifyTwoFactorAuthenticationToken } from './verify-2fa-token'; +import { verifyBackupCode } from './verify-backup-code'; + +type ValidateTwoFactorAuthenticationOptions = { + totpCode?: string; + backupCode?: string; + user: User; +}; + +export const validateTwoFactorAuthentication = async ({ + backupCode, + totpCode, + user, +}: ValidateTwoFactorAuthenticationOptions) => { + if (!user.twoFactorEnabled) { + throw new Error(ErrorCode.TWO_FACTOR_SETUP_REQUIRED); + } + + if (!user.twoFactorSecret) { + throw new Error(ErrorCode.TWO_FACTOR_MISSING_SECRET); + } + + if (totpCode) { + return await verifyTwoFactorAuthenticationToken({ user, totpCode }); + } + + if (backupCode) { + return await verifyBackupCode({ user, backupCode }); + } + + throw new Error(ErrorCode.TWO_FACTOR_MISSING_CREDENTIALS); +}; diff --git a/packages/lib/server-only/2fa/verify-2fa-token.ts b/packages/lib/server-only/2fa/verify-2fa-token.ts new file mode 100644 index 000000000..fa9159517 --- /dev/null +++ b/packages/lib/server-only/2fa/verify-2fa-token.ts @@ -0,0 +1,33 @@ +import { base32 } from '@scure/base'; +import { TOTPController } from 'oslo/otp'; + +import { User } from '@documenso/prisma/client'; + +import { DOCUMENSO_ENCRYPTION_KEY } from '../../constants/crypto'; +import { symmetricDecrypt } from '../../universal/crypto'; + +const totp = new TOTPController(); + +type VerifyTwoFactorAuthenticationTokenOptions = { + user: User; + totpCode: string; +}; + +export const verifyTwoFactorAuthenticationToken = async ({ + user, + totpCode, +}: VerifyTwoFactorAuthenticationTokenOptions) => { + const key = DOCUMENSO_ENCRYPTION_KEY; + + if (!user.twoFactorSecret) { + throw new Error('user missing 2fa secret'); + } + + const secret = Buffer.from(symmetricDecrypt({ key, data: user.twoFactorSecret })).toString( + 'utf-8', + ); + + const isValidToken = await totp.verify(totpCode, base32.decode(secret)); + + return isValidToken; +}; diff --git a/packages/lib/server-only/2fa/verify-backup-code.ts b/packages/lib/server-only/2fa/verify-backup-code.ts new file mode 100644 index 000000000..357d4994c --- /dev/null +++ b/packages/lib/server-only/2fa/verify-backup-code.ts @@ -0,0 +1,18 @@ +import { User } from '@documenso/prisma/client'; + +import { getBackupCodes } from './get-backup-code'; + +type VerifyBackupCodeParams = { + user: User; + backupCode: string; +}; + +export const verifyBackupCode = async ({ user, backupCode }: VerifyBackupCodeParams) => { + const userBackupCodes = await getBackupCodes({ user }); + + if (!userBackupCodes) { + throw new Error('User has no backup codes'); + } + + return userBackupCodes.includes(backupCode); +}; diff --git a/packages/lib/server-only/auth/hash.ts b/packages/lib/server-only/auth/hash.ts index 1de2ac458..df9931c97 100644 --- a/packages/lib/server-only/auth/hash.ts +++ b/packages/lib/server-only/auth/hash.ts @@ -1,4 +1,4 @@ -import { hashSync as bcryptHashSync } from 'bcrypt'; +import { compareSync as bcryptCompareSync, hashSync as bcryptHashSync } from 'bcrypt'; import { SALT_ROUNDS } from '../../constants/auth'; @@ -8,3 +8,7 @@ import { SALT_ROUNDS } from '../../constants/auth'; export const hashSync = (password: string) => { return bcryptHashSync(password, SALT_ROUNDS); }; + +export const compareSync = (password: string, hash: string) => { + return bcryptCompareSync(password, hash); +}; diff --git a/packages/lib/universal/crypto.ts b/packages/lib/universal/crypto.ts new file mode 100644 index 000000000..405208d7f --- /dev/null +++ b/packages/lib/universal/crypto.ts @@ -0,0 +1,32 @@ +import { xchacha20poly1305 } from '@noble/ciphers/chacha'; +import { bytesToHex, hexToBytes, utf8ToBytes } from '@noble/ciphers/utils'; +import { managedNonce } from '@noble/ciphers/webcrypto/utils'; +import { sha256 } from '@noble/hashes/sha256'; + +export type SymmetricEncryptOptions = { + key: string; + data: string; +}; + +export const symmetricEncrypt = ({ key, data }: SymmetricEncryptOptions) => { + const keyAsBytes = sha256(key); + const dataAsBytes = utf8ToBytes(data); + + const chacha = managedNonce(xchacha20poly1305)(keyAsBytes); // manages nonces for you + + return bytesToHex(chacha.encrypt(dataAsBytes)); +}; + +export type SymmetricDecryptOptions = { + key: string; + data: string; +}; + +export const symmetricDecrypt = ({ key, data }: SymmetricDecryptOptions) => { + const keyAsBytes = sha256(key); + const dataAsBytes = hexToBytes(data); + + const chacha = managedNonce(xchacha20poly1305)(keyAsBytes); // manages nonces for you + + return chacha.decrypt(dataAsBytes); +}; diff --git a/packages/prisma/migrations/20231105184518_add_2fa/migration.sql b/packages/prisma/migrations/20231105184518_add_2fa/migration.sql new file mode 100644 index 000000000..8456bdbc6 --- /dev/null +++ b/packages/prisma/migrations/20231105184518_add_2fa/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "twoFactorBackupCodes" TEXT, +ADD COLUMN "twoFactorEnabled" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "twoFactorSecret" TEXT; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 02807e4a0..7407bc5c0 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -19,25 +19,28 @@ enum Role { } model User { - id Int @id @default(autoincrement()) - name String? - email String @unique - emailVerified DateTime? - password String? - source String? - signature String? - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - lastSignedIn DateTime @default(now()) - roles Role[] @default([USER]) - identityProvider IdentityProvider @default(DOCUMENSO) - accounts Account[] - sessions Session[] - Document Document[] - Subscription Subscription? - PasswordResetToken PasswordResetToken[] - VerificationToken VerificationToken[] - + id Int @id @default(autoincrement()) + name String? + email String @unique + emailVerified DateTime? + password String? + source String? + signature String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + lastSignedIn DateTime @default(now()) + roles Role[] @default([USER]) + identityProvider IdentityProvider @default(DOCUMENSO) + accounts Account[] + sessions Session[] + Document Document[] + Subscription Subscription? + PasswordResetToken PasswordResetToken[] + twoFactorSecret String? + twoFactorEnabled Boolean @default(false) + twoFactorBackupCodes String? + VerificationToken VerificationToken[] + @@index([email]) } diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 05aed3147..54c1d5917 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -21,5 +21,6 @@ "superjson": "^1.13.1", "ts-pattern": "^5.0.5", "zod": "^3.22.4" - } + }, + "devDependencies": {} } diff --git a/packages/trpc/server/auth-router/router.ts b/packages/trpc/server/auth-router/router.ts index dfabd9da9..59c51ade5 100644 --- a/packages/trpc/server/auth-router/router.ts +++ b/packages/trpc/server/auth-router/router.ts @@ -1,10 +1,12 @@ import { TRPCError } from '@trpc/server'; +import { ErrorCode } from '@documenso/lib/next-auth/error-codes'; +import { compareSync } from '@documenso/lib/server-only/auth/hash'; import { createUser } from '@documenso/lib/server-only/user/create-user'; import { sendConfirmationToken } from '@documenso/lib/server-only/user/send-confirmation-token'; -import { procedure, router } from '../trpc'; -import { ZSignUpMutationSchema } from './schema'; +import { authenticatedProcedure, procedure, router } from '../trpc'; +import { ZSignUpMutationSchema, ZVerifyPasswordMutationSchema } from './schema'; export const authRouter = router({ signup: procedure.input(ZSignUpMutationSchema).mutation(async ({ input }) => { @@ -30,4 +32,23 @@ export const authRouter = router({ }); } }), + + verifyPassword: authenticatedProcedure + .input(ZVerifyPasswordMutationSchema) + .mutation(({ ctx, input }) => { + const user = ctx.user; + + const { password } = input; + + if (!user.password) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: ErrorCode.INCORRECT_PASSWORD, + }); + } + + const valid = compareSync(password, user.password); + + return valid; + }), }); diff --git a/packages/trpc/server/auth-router/schema.ts b/packages/trpc/server/auth-router/schema.ts index bdc9cd742..cc969c679 100644 --- a/packages/trpc/server/auth-router/schema.ts +++ b/packages/trpc/server/auth-router/schema.ts @@ -8,3 +8,5 @@ export const ZSignUpMutationSchema = z.object({ }); export type TSignUpMutationSchema = z.infer; + +export const ZVerifyPasswordMutationSchema = ZSignUpMutationSchema.pick({ password: true }); diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index dbf6ca03d..5b09478dc 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -6,6 +6,7 @@ import { profileRouter } from './profile-router/router'; import { shareLinkRouter } from './share-link-router/router'; import { singleplayerRouter } from './singleplayer-router/router'; import { router } from './trpc'; +import { twoFactorAuthenticationRouter } from './two-factor-authentication-router/router'; export const appRouter = router({ auth: authRouter, @@ -15,6 +16,7 @@ export const appRouter = router({ admin: adminRouter, shareLink: shareLinkRouter, singleplayer: singleplayerRouter, + twoFactorAuthentication: twoFactorAuthenticationRouter, }); export type AppRouter = typeof appRouter; diff --git a/packages/trpc/server/two-factor-authentication-router/router.ts b/packages/trpc/server/two-factor-authentication-router/router.ts new file mode 100644 index 000000000..a10f7a543 --- /dev/null +++ b/packages/trpc/server/two-factor-authentication-router/router.ts @@ -0,0 +1,105 @@ +import { TRPCError } from '@trpc/server'; + +import { ErrorCode } from '@documenso/lib/next-auth/error-codes'; +import { disableTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/disable-2fa'; +import { enableTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/enable-2fa'; +import { getBackupCodes } from '@documenso/lib/server-only/2fa/get-backup-code'; +import { setupTwoFactorAuthentication } from '@documenso/lib/server-only/2fa/setup-2fa'; +import { compareSync } from '@documenso/lib/server-only/auth/hash'; + +import { authenticatedProcedure, router } from '../trpc'; +import { + ZDisableTwoFactorAuthenticationMutationSchema, + ZEnableTwoFactorAuthenticationMutationSchema, + ZSetupTwoFactorAuthenticationMutationSchema, + ZViewRecoveryCodesMutationSchema, +} from './schema'; + +export const twoFactorAuthenticationRouter = router({ + setup: authenticatedProcedure + .input(ZSetupTwoFactorAuthenticationMutationSchema) + .mutation(async ({ ctx, input }) => { + const user = ctx.user; + + const { password } = input; + + return await setupTwoFactorAuthentication({ user, password }); + }), + + enable: authenticatedProcedure + .input(ZEnableTwoFactorAuthenticationMutationSchema) + .mutation(async ({ ctx, input }) => { + try { + const user = ctx.user; + + const { code } = input; + + return await enableTwoFactorAuthentication({ user, code }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to enable two-factor authentication. Please try again later.', + }); + } + }), + + disable: authenticatedProcedure + .input(ZDisableTwoFactorAuthenticationMutationSchema) + .mutation(async ({ ctx, input }) => { + try { + const user = ctx.user; + + const { password, backupCode } = input; + + return await disableTwoFactorAuthentication({ user, password, backupCode }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to disable two-factor authentication. Please try again later.', + }); + } + }), + + viewRecoveryCodes: authenticatedProcedure + .input(ZViewRecoveryCodesMutationSchema) + .mutation(async ({ ctx, input }) => { + try { + const user = ctx.user; + + const { password } = input; + + if (!user.twoFactorEnabled) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: ErrorCode.TWO_FACTOR_SETUP_REQUIRED, + }); + } + + if (!user.password || !compareSync(password, user.password)) { + throw new TRPCError({ + code: 'UNAUTHORIZED', + message: ErrorCode.INCORRECT_PASSWORD, + }); + } + + const recoveryCodes = await getBackupCodes({ user }); + + return { recoveryCodes }; + } catch (err) { + console.error(err); + + if (err instanceof TRPCError) { + throw err; + } + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to view your recovery codes. Please try again later.', + }); + } + }), +}); diff --git a/packages/trpc/server/two-factor-authentication-router/schema.ts b/packages/trpc/server/two-factor-authentication-router/schema.ts new file mode 100644 index 000000000..3a831845f --- /dev/null +++ b/packages/trpc/server/two-factor-authentication-router/schema.ts @@ -0,0 +1,32 @@ +import { z } from 'zod'; + +export const ZSetupTwoFactorAuthenticationMutationSchema = z.object({ + password: z.string().min(1), +}); + +export type TSetupTwoFactorAuthenticationMutationSchema = z.infer< + typeof ZSetupTwoFactorAuthenticationMutationSchema +>; + +export const ZEnableTwoFactorAuthenticationMutationSchema = z.object({ + code: z.string().min(6).max(6), +}); + +export type TEnableTwoFactorAuthenticationMutationSchema = z.infer< + typeof ZEnableTwoFactorAuthenticationMutationSchema +>; + +export const ZDisableTwoFactorAuthenticationMutationSchema = z.object({ + password: z.string().min(6).max(72), + backupCode: z.string().trim(), +}); + +export type TDisableTwoFactorAuthenticationMutationSchema = z.infer< + typeof ZDisableTwoFactorAuthenticationMutationSchema +>; + +export const ZViewRecoveryCodesMutationSchema = z.object({ + password: z.string().min(6).max(72), +}); + +export type TViewRecoveryCodesMutationSchema = z.infer; diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index 749cfcc43..717f13ade 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -7,6 +7,7 @@ declare namespace NodeJS { NEXT_PRIVATE_GOOGLE_CLIENT_SECRET?: string; NEXT_PRIVATE_DATABASE_URL: string; + NEXT_PRIVATE_ENCRYPTION_KEY: string; NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID: string; NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID: string; diff --git a/packages/ui/primitives/input.tsx b/packages/ui/primitives/input.tsx index 1a5fba1bb..ac739c984 100644 --- a/packages/ui/primitives/input.tsx +++ b/packages/ui/primitives/input.tsx @@ -1,6 +1,9 @@ import * as React from 'react'; +import { Eye, EyeOff } from 'lucide-react'; + import { cn } from '../lib/utils'; +import { Button } from './button'; export type InputProps = React.InputHTMLAttributes; @@ -25,4 +28,38 @@ const Input = React.forwardRef( Input.displayName = 'Input'; -export { Input }; +const PasswordInput = React.forwardRef( + ({ className, ...props }, ref) => { + const [showPassword, setShowPassword] = React.useState(false); + + return ( +
+ + + +
+ ); + }, +); + +PasswordInput.displayName = 'Input'; + +export { Input, PasswordInput }; diff --git a/turbo.json b/turbo.json index 0f0038887..36b169a80 100644 --- a/turbo.json +++ b/turbo.json @@ -33,6 +33,7 @@ "globalDependencies": ["**/.env.*local"], "globalEnv": [ "APP_VERSION", + "NEXT_PRIVATE_ENCRYPTION_KEY", "NEXTAUTH_URL", "NEXTAUTH_SECRET", "NEXT_PUBLIC_PROJECT", From 335684d0b7b47f196da1b0221d1f23560055cd76 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 1 Dec 2023 23:09:24 +1100 Subject: [PATCH 23/51] fix: edit document sizing (#706) --- .../documents/[id]/edit-document.tsx | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 484d5d31d..4152bd6b8 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -4,23 +4,24 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; -import { DocumentData, DocumentStatus, Field, Recipient, User } from '@documenso/prisma/client'; -import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; +import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; +import { DocumentStatus } from '@documenso/prisma/client'; +import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add-fields'; -import { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; +import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; import { AddSignersFormPartial } from '@documenso/ui/primitives/document-flow/add-signers'; -import { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; +import type { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/add-subject'; -import { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; +import type { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; import { AddTitleFormPartial } from '@documenso/ui/primitives/document-flow/add-title'; -import { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; +import type { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; import { DocumentFlowFormContainer, DocumentFlowFormContainerHeader, } from '@documenso/ui/primitives/document-flow/document-flow-root'; -import { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; +import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { useToast } from '@documenso/ui/primitives/use-toast'; @@ -191,7 +192,10 @@ export const EditDocumentForm = ({
- e.preventDefault()}> + e.preventDefault()} + > Date: Sat, 2 Dec 2023 09:38:24 +1100 Subject: [PATCH 24/51] fix: remove server actions (#684) --- apps/marketing/next.config.js | 2 +- apps/marketing/package.json | 12 +- apps/web/next.config.js | 2 +- apps/web/package.json | 12 +- .../documents/[id]/edit-document.tsx | 13 +- .../src/app/(signing)/sign/[token]/form.tsx | 7 +- .../forms/edit-document/add-fields.action.ts | 30 - .../forms/edit-document/add-signers.action.ts | 25 - .../forms/edit-document/add-subject.action.ts | 29 - .../forms/edit-document/add-title.action.ts | 21 - package-lock.json | 5970 +++++++---------- package.json | 11 +- packages/ee/package.json | 4 +- packages/email/components.ts | 17 + packages/email/package.json | 22 +- packages/email/render.ts | 2 +- .../template-confirmation-email.tsx | 17 +- .../template-document-completed.tsx | 17 +- .../template-document-image.tsx | 2 +- .../template-document-invite.tsx | 17 +- .../template-document-pending.tsx | 17 +- .../template-document-self-signed.tsx | 17 +- .../template-components/template-footer.tsx | 2 +- .../template-forgot-password.tsx | 17 +- .../template-reset-password.tsx | 17 +- packages/email/templates/confirm-email.tsx | 18 +- .../email/templates/document-completed.tsx | 18 +- packages/email/templates/document-invite.tsx | 13 +- packages/email/templates/document-pending.tsx | 18 +- .../email/templates/document-self-signed.tsx | 18 +- packages/email/templates/forgot-password.tsx | 18 +- packages/email/templates/reset-password.tsx | 13 +- packages/lib/package.json | 4 +- .../field/sign-field-with-token.ts | 68 +- packages/tailwind-config/package.json | 2 +- .../trpc/server/document-router/router.ts | 13 +- .../trpc/server/document-router/schema.ts | 4 + packages/trpc/server/field-router/router.ts | 34 +- packages/trpc/server/field-router/schema.ts | 21 + .../trpc/server/recipient-router/router.ts | 54 + .../trpc/server/recipient-router/schema.ts | 33 + packages/trpc/server/router.ts | 2 + .../trpc/server/singleplayer-router/router.ts | 12 +- packages/ui/package.json | 2 +- 44 files changed, 2711 insertions(+), 3956 deletions(-) delete mode 100644 apps/web/src/components/forms/edit-document/add-fields.action.ts delete mode 100644 apps/web/src/components/forms/edit-document/add-signers.action.ts delete mode 100644 apps/web/src/components/forms/edit-document/add-subject.action.ts delete mode 100644 apps/web/src/components/forms/edit-document/add-title.action.ts create mode 100644 packages/email/components.ts create mode 100644 packages/trpc/server/recipient-router/router.ts create mode 100644 packages/trpc/server/recipient-router/schema.ts diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index ef89f84b5..9c61e4ada 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -22,7 +22,7 @@ const config = { experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), serverActions: { - bodySizeLimit: '50mb' + bodySizeLimit: '50mb', }, }, reactStrictMode: true, diff --git a/apps/marketing/package.json b/apps/marketing/package.json index ab72ce6c8..bdd1ade41 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -24,8 +24,8 @@ "lucide-react": "^0.279.0", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "next-contentlayer": "^0.3.4", "next-plausible": "^3.10.1", "perfect-freehand": "^1.2.0", @@ -44,5 +44,13 @@ "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7" + }, + "overrides": { + "next-auth": { + "next": "$next" + }, + "next-contentlayer": { + "next": "$next" + } } } diff --git a/apps/web/next.config.js b/apps/web/next.config.js index 29a7397c0..7a42cb46a 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -23,7 +23,7 @@ const config = { experimental: { outputFileTracingRoot: path.join(__dirname, '../../'), serverActions: { - bodySizeLimit: '50mb' + bodySizeLimit: '50mb', }, }, reactStrictMode: true, diff --git a/apps/web/package.json b/apps/web/package.json index b5bb1c218..a2ced8ae5 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -27,8 +27,8 @@ "lucide-react": "^0.279.0", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "next-plausible": "^3.10.1", "next-themes": "^0.2.1", "perfect-freehand": "^1.2.0", @@ -53,5 +53,13 @@ "@types/node": "20.1.0", "@types/react": "18.2.18", "@types/react-dom": "18.2.7" + }, + "overrides": { + "next-auth": { + "next": "$next" + }, + "next-contentlayer": { + "next": "$next" + } } } diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 4152bd6b8..e775bffdc 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -7,6 +7,7 @@ import { useRouter } from 'next/navigation'; import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; +import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add-fields'; @@ -25,11 +26,6 @@ import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/ty import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { addFields } from '~/components/forms/edit-document/add-fields.action'; -import { addSigners } from '~/components/forms/edit-document/add-signers.action'; -import { completeDocument } from '~/components/forms/edit-document/add-subject.action'; -import { addTitle } from '~/components/forms/edit-document/add-title.action'; - export type EditDocumentFormProps = { className?: string; user: User; @@ -56,6 +52,11 @@ export const EditDocumentForm = ({ document.status === DocumentStatus.DRAFT ? 'title' : 'signers', ); + const { mutateAsync: addTitle } = trpc.document.setTitleForDocument.useMutation(); + const { mutateAsync: addFields } = trpc.field.addFields.useMutation(); + const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation(); + const { mutateAsync: sendDocument } = trpc.document.sendDocument.useMutation(); + const documentFlow: Record = { title: { title: 'Add Title', @@ -154,7 +155,7 @@ export const EditDocumentForm = ({ const { subject, message } = data.email; try { - await completeDocument({ + await sendDocument({ documentId: document.id, email: { subject, diff --git a/apps/web/src/app/(signing)/sign/[token]/form.tsx b/apps/web/src/app/(signing)/sign/[token]/form.tsx index 5c6779c62..6589572a3 100644 --- a/apps/web/src/app/(signing)/sign/[token]/form.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/form.tsx @@ -7,9 +7,9 @@ import { useRouter } from 'next/navigation'; import { useSession } from 'next-auth/react'; import { useForm } from 'react-hook-form'; -import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; -import { Document, Field, Recipient } from '@documenso/prisma/client'; +import type { Document, Field, Recipient } from '@documenso/prisma/client'; +import { trpc } from '@documenso/trpc/react'; import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -34,6 +34,9 @@ export const SigningForm = ({ document, recipient, fields }: SigningFormProps) = const { fullName, signature, setFullName, setSignature } = useRequiredSigningContext(); const [validateUninsertedFields, setValidateUninsertedFields] = useState(false); + const { mutateAsync: completeDocumentWithToken } = + trpc.recipient.completeDocumentWithToken.useMutation(); + const { handleSubmit, formState: { isSubmitting }, diff --git a/apps/web/src/components/forms/edit-document/add-fields.action.ts b/apps/web/src/components/forms/edit-document/add-fields.action.ts deleted file mode 100644 index edc5e7e39..000000000 --- a/apps/web/src/components/forms/edit-document/add-fields.action.ts +++ /dev/null @@ -1,30 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; -import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; - -export type AddFieldsActionInput = TAddFieldsFormSchema & { - documentId: number; -}; - -export const addFields = async ({ documentId, fields }: AddFieldsActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - await setFieldsForDocument({ - userId: user.id, - documentId, - fields: fields.map((field) => ({ - id: field.nativeId, - signerEmail: field.signerEmail, - type: field.type, - pageNumber: field.pageNumber, - pageX: field.pageX, - pageY: field.pageY, - pageWidth: field.pageWidth, - pageHeight: field.pageHeight, - })), - }); -}; diff --git a/apps/web/src/components/forms/edit-document/add-signers.action.ts b/apps/web/src/components/forms/edit-document/add-signers.action.ts deleted file mode 100644 index c36d51c41..000000000 --- a/apps/web/src/components/forms/edit-document/add-signers.action.ts +++ /dev/null @@ -1,25 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; -import type { TAddSignersFormSchema } from '@documenso/ui/primitives/document-flow/add-signers.types'; - -export type AddSignersActionInput = TAddSignersFormSchema & { - documentId: number; -}; - -export const addSigners = async ({ documentId, signers }: AddSignersActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - await setRecipientsForDocument({ - userId: user.id, - documentId, - recipients: signers.map((signer) => ({ - id: signer.nativeId, - email: signer.email, - name: signer.name, - })), - }); -}; diff --git a/apps/web/src/components/forms/edit-document/add-subject.action.ts b/apps/web/src/components/forms/edit-document/add-subject.action.ts deleted file mode 100644 index 56d6f694d..000000000 --- a/apps/web/src/components/forms/edit-document/add-subject.action.ts +++ /dev/null @@ -1,29 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { upsertDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta'; -import { sendDocument } from '@documenso/lib/server-only/document/send-document'; -import type { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; - -export type CompleteDocumentActionInput = TAddSubjectFormSchema & { - documentId: number; -}; - -export const completeDocument = async ({ documentId, email }: CompleteDocumentActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - if (email.message || email.subject) { - await upsertDocumentMeta({ - documentId, - subject: email.subject, - message: email.message, - }); - } - - return await sendDocument({ - userId: user.id, - documentId, - }); -}; diff --git a/apps/web/src/components/forms/edit-document/add-title.action.ts b/apps/web/src/components/forms/edit-document/add-title.action.ts deleted file mode 100644 index a92a3117f..000000000 --- a/apps/web/src/components/forms/edit-document/add-title.action.ts +++ /dev/null @@ -1,21 +0,0 @@ -'use server'; - -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { updateTitle } from '@documenso/lib/server-only/document/update-title'; -import type { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; - -export type AddTitleActionInput = TAddTitleFormSchema & { - documentId: number; -}; - -export const addTitle = async ({ documentId, title }: AddTitleActionInput) => { - 'use server'; - - const { user } = await getRequiredServerComponentSession(); - - await updateTitle({ - documentId, - userId: user.id, - title: title, - }); -}; diff --git a/package-lock.json b/package-lock.json index 56d332429..d96431451 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,6 @@ "apps/*", "packages/*" ], - "dependencies": { - "react-hotkeys-hook": "^4.4.1", - "recharts": "^2.7.2" - }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", @@ -47,8 +43,8 @@ "lucide-react": "^0.279.0", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "next-contentlayer": "^0.3.4", "next-plausible": "^3.10.1", "perfect-freehand": "^1.2.0", @@ -75,6 +71,18 @@ "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, + "apps/marketing/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "apps/web": { "name": "@documenso/web", "version": "0.1.0", @@ -94,8 +102,8 @@ "lucide-react": "^0.279.0", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "next-plausible": "^3.10.1", "next-themes": "^0.2.1", "perfect-freehand": "^1.2.0", @@ -128,6 +136,18 @@ "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==", "dev": true }, + "apps/web/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -273,63 +293,65 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/client-s3": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.430.0.tgz", - "integrity": "sha512-KpK6mZsLyxfHTPfXA3Bnuu5li15QhhWCzhSPx6moH6XGPH0hVNHFy05DM9T/1exf6tEAQhi5FJrek9dM/sOdeA==", + "version": "3.456.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.456.0.tgz", + "integrity": "sha512-987Mls+9w+mpdq4Vpc/OEQ93afkM12H7l97lIejcidZySuLVo5tdOM9ErekmgjAuotFzBgu2ExL83XtYIMgA0g==", "dependencies": { "@aws-crypto/sha1-browser": "3.0.0", "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.430.0", - "@aws-sdk/credential-provider-node": "3.430.0", - "@aws-sdk/middleware-bucket-endpoint": "3.430.0", - "@aws-sdk/middleware-expect-continue": "3.428.0", - "@aws-sdk/middleware-flexible-checksums": "3.428.0", - "@aws-sdk/middleware-host-header": "3.429.0", - "@aws-sdk/middleware-location-constraint": "3.428.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-sdk-s3": "3.429.0", - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/middleware-ssec": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.430.0", - "@aws-sdk/signature-v4-multi-region": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.430.0", + "@aws-sdk/client-sts": "3.454.0", + "@aws-sdk/core": "3.451.0", + "@aws-sdk/credential-provider-node": "3.451.0", + "@aws-sdk/middleware-bucket-endpoint": "3.451.0", + "@aws-sdk/middleware-expect-continue": "3.451.0", + "@aws-sdk/middleware-flexible-checksums": "3.451.0", + "@aws-sdk/middleware-host-header": "3.451.0", + "@aws-sdk/middleware-location-constraint": "3.451.0", + "@aws-sdk/middleware-logger": "3.451.0", + "@aws-sdk/middleware-recursion-detection": "3.451.0", + "@aws-sdk/middleware-sdk-s3": "3.451.0", + "@aws-sdk/middleware-signing": "3.451.0", + "@aws-sdk/middleware-ssec": "3.451.0", + "@aws-sdk/middleware-user-agent": "3.451.0", + "@aws-sdk/region-config-resolver": "3.451.0", + "@aws-sdk/signature-v4-multi-region": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-endpoints": "3.451.0", + "@aws-sdk/util-user-agent-browser": "3.451.0", + "@aws-sdk/util-user-agent-node": "3.451.0", "@aws-sdk/xml-builder": "3.310.0", - "@smithy/config-resolver": "^2.0.15", - "@smithy/eventstream-serde-browser": "^2.0.11", - "@smithy/eventstream-serde-config-resolver": "^2.0.11", - "@smithy/eventstream-serde-node": "^2.0.11", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-blob-browser": "^2.0.11", - "@smithy/hash-node": "^2.0.11", - "@smithy/hash-stream-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/md5-js": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.2", - "@smithy/middleware-retry": "^2.0.17", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", + "@smithy/config-resolver": "^2.0.18", + "@smithy/eventstream-serde-browser": "^2.0.13", + "@smithy/eventstream-serde-config-resolver": "^2.0.13", + "@smithy/eventstream-serde-node": "^2.0.13", + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/hash-blob-browser": "^2.0.14", + "@smithy/hash-node": "^2.0.15", + "@smithy/hash-stream-node": "^2.0.15", + "@smithy/invalid-dependency": "^2.0.13", + "@smithy/md5-js": "^2.0.15", + "@smithy/middleware-content-length": "^2.0.15", + "@smithy/middleware-endpoint": "^2.2.0", + "@smithy/middleware-retry": "^2.0.20", + "@smithy/middleware-serde": "^2.0.13", + "@smithy/middleware-stack": "^2.0.7", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/node-http-handler": "^2.1.9", + "@smithy/protocol-http": "^3.0.9", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.20", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-stream": "^2.0.16", - "@smithy/util-utf8": "^2.0.0", - "@smithy/util-waiter": "^2.0.11", + "@smithy/util-defaults-mode-browser": "^2.0.19", + "@smithy/util-defaults-mode-node": "^2.0.25", + "@smithy/util-endpoints": "^1.0.4", + "@smithy/util-retry": "^2.0.6", + "@smithy/util-stream": "^2.0.20", + "@smithy/util-utf8": "^2.0.2", + "@smithy/util-waiter": "^2.0.13", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -338,43 +360,45 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.430.0.tgz", - "integrity": "sha512-NxQJkTZCgl6LpdY12MCwsqGned6Ax19WsTCGLEiA/tsNE4vNrYLHHBR317G0sGWbIUQuhwsoM7wIrqJO7CacuQ==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.451.0.tgz", + "integrity": "sha512-KkYSke3Pdv3MfVH/5fT528+MKjMyPKlcLcd4zQb0x6/7Bl7EHrPh1JZYjzPLHelb+UY5X0qN8+cb8iSu1eiwIQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.429.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.430.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.430.0", - "@smithy/config-resolver": "^2.0.15", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.2", - "@smithy/middleware-retry": "^2.0.17", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", + "@aws-sdk/core": "3.451.0", + "@aws-sdk/middleware-host-header": "3.451.0", + "@aws-sdk/middleware-logger": "3.451.0", + "@aws-sdk/middleware-recursion-detection": "3.451.0", + "@aws-sdk/middleware-user-agent": "3.451.0", + "@aws-sdk/region-config-resolver": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-endpoints": "3.451.0", + "@aws-sdk/util-user-agent-browser": "3.451.0", + "@aws-sdk/util-user-agent-node": "3.451.0", + "@smithy/config-resolver": "^2.0.18", + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/hash-node": "^2.0.15", + "@smithy/invalid-dependency": "^2.0.13", + "@smithy/middleware-content-length": "^2.0.15", + "@smithy/middleware-endpoint": "^2.2.0", + "@smithy/middleware-retry": "^2.0.20", + "@smithy/middleware-serde": "^2.0.13", + "@smithy/middleware-stack": "^2.0.7", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/node-http-handler": "^2.1.9", + "@smithy/protocol-http": "^3.0.9", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.20", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.19", + "@smithy/util-defaults-mode-node": "^2.0.25", + "@smithy/util-endpoints": "^1.0.4", + "@smithy/util-retry": "^2.0.6", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -382,46 +406,48 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.430.0.tgz", - "integrity": "sha512-njUY3QeZH0CG+tG/6jhoG+Zr7rI1aGoVkZi3l6woKTz57hIlkwu2jQlLbJujm7PKrLhPaN5+4AqBQuHFVgMobw==", + "version": "3.454.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.454.0.tgz", + "integrity": "sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.430.0", - "@aws-sdk/middleware-host-header": "3.429.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-sdk-sts": "3.428.0", - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/region-config-resolver": "3.430.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.430.0", - "@smithy/config-resolver": "^2.0.15", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.2", - "@smithy/middleware-retry": "^2.0.17", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", + "@aws-sdk/core": "3.451.0", + "@aws-sdk/credential-provider-node": "3.451.0", + "@aws-sdk/middleware-host-header": "3.451.0", + "@aws-sdk/middleware-logger": "3.451.0", + "@aws-sdk/middleware-recursion-detection": "3.451.0", + "@aws-sdk/middleware-sdk-sts": "3.451.0", + "@aws-sdk/middleware-signing": "3.451.0", + "@aws-sdk/middleware-user-agent": "3.451.0", + "@aws-sdk/region-config-resolver": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-endpoints": "3.451.0", + "@aws-sdk/util-user-agent-browser": "3.451.0", + "@aws-sdk/util-user-agent-node": "3.451.0", + "@smithy/config-resolver": "^2.0.18", + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/hash-node": "^2.0.15", + "@smithy/invalid-dependency": "^2.0.13", + "@smithy/middleware-content-length": "^2.0.15", + "@smithy/middleware-endpoint": "^2.2.0", + "@smithy/middleware-retry": "^2.0.20", + "@smithy/middleware-serde": "^2.0.13", + "@smithy/middleware-stack": "^2.0.7", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/node-http-handler": "^2.1.9", + "@smithy/protocol-http": "^3.0.9", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.20", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.19", + "@smithy/util-defaults-mode-node": "^2.0.25", + "@smithy/util-endpoints": "^1.0.4", + "@smithy/util-retry": "^2.0.6", + "@smithy/util-utf8": "^2.0.2", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -430,24 +456,37 @@ } }, "node_modules/@aws-sdk/cloudfront-signer": { - "version": "3.433.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/cloudfront-signer/-/cloudfront-signer-3.433.0.tgz", - "integrity": "sha512-I86TTLVSAFb0nMVPWxNipVwkmf0dw0FEchoA1sJx5j9YPyBhc0gzg3Af1Qkzzty+Pkwwc+CtPbqHkYxbXI1tFg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/cloudfront-signer/-/cloudfront-signer-3.451.0.tgz", + "integrity": "sha512-qJ4p/6gbCaABB1fpQ8WvIV3nISNdkiUt0QC22Dc0ASSABHiapJzJx2KEMCJ8o5qX9e3hzUEE4m3ySaMCNnfTTg==", "dependencies": { - "@smithy/url-parser": "^2.0.12" + "@smithy/url-parser": "^2.0.13", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.451.0.tgz", + "integrity": "sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==", + "dependencies": { + "@smithy/smithy-client": "^2.1.15", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.428.0.tgz", - "integrity": "sha512-e6fbY174Idzw0r5ZMT1qkDh+dpOp1DX3ickhr7J6ipo3cUGLI45Y5lnR9nYXWfB5o/wiNv4zXgN+Y3ORJJHzyA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.451.0.tgz", + "integrity": "sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -455,19 +494,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.430.0.tgz", - "integrity": "sha512-m3NcmDyVYr/w8RV9kMArrA/0982aXMsvoSXi4wFVbgg/T5hO+6i5CY7fB/0xpKIuEJ+rw63rYNnBzLwwW48kWg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.451.0.tgz", + "integrity": "sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.428.0", - "@aws-sdk/credential-provider-process": "3.428.0", - "@aws-sdk/credential-provider-sso": "3.430.0", - "@aws-sdk/credential-provider-web-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/credential-provider-env": "3.451.0", + "@aws-sdk/credential-provider-process": "3.451.0", + "@aws-sdk/credential-provider-sso": "3.451.0", + "@aws-sdk/credential-provider-web-identity": "3.451.0", + "@aws-sdk/types": "3.451.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -475,20 +514,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.430.0.tgz", - "integrity": "sha512-ItOHJcqOhpI0QM+aho5uMrk2ZP34hsdisMHxd8/6FT41U8TOe9kQKaZ2l2AsVf4QuM6RJe2LangcVGGstCf8Sw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.451.0.tgz", + "integrity": "sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.428.0", - "@aws-sdk/credential-provider-ini": "3.430.0", - "@aws-sdk/credential-provider-process": "3.428.0", - "@aws-sdk/credential-provider-sso": "3.430.0", - "@aws-sdk/credential-provider-web-identity": "3.428.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/credential-provider-env": "3.451.0", + "@aws-sdk/credential-provider-ini": "3.451.0", + "@aws-sdk/credential-provider-process": "3.451.0", + "@aws-sdk/credential-provider-sso": "3.451.0", + "@aws-sdk/credential-provider-web-identity": "3.451.0", + "@aws-sdk/types": "3.451.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -496,14 +535,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.428.0.tgz", - "integrity": "sha512-UG2S2/4Wrskbkbgt9fBlnzwQ2hfTXvLJwUgGOluSOf6+mGCcoDku4zzc9EQdk1MwN5Us+ziyMrIMNY5sbdLg6g==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.451.0.tgz", + "integrity": "sha512-HQywSdKeD5PErcLLnZfSyCJO+6T+ZyzF+Lm/QgscSC+CbSUSIPi//s15qhBRVely/3KBV6AywxwNH+5eYgt4lQ==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -511,16 +550,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.430.0.tgz", - "integrity": "sha512-6de/aH9OFI+Ah7hL4alrZFqiNw5D6F+R92tLbIpFRQg7DxO/TuQTTtK94mLkft/AP/mGzVVBENjsyS1nJt166w==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.451.0.tgz", + "integrity": "sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==", "dependencies": { - "@aws-sdk/client-sso": "3.430.0", - "@aws-sdk/token-providers": "3.430.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/client-sso": "3.451.0", + "@aws-sdk/token-providers": "3.451.0", + "@aws-sdk/types": "3.451.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -528,13 +567,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.428.0.tgz", - "integrity": "sha512-ueuUPPlrJFvtDUVTGnClUGt1wxCbEiKArknah/w9cfcc/c1HtFd/M7x/z2Sm0gSItR45sVcK54qjzmhm29DMzg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.451.0.tgz", + "integrity": "sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -542,15 +581,15 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.430.0.tgz", - "integrity": "sha512-oK0WTNpMQFewSIYcL3LPm+S46uUWFILlPYK0fEeYdMXn03380JqS9oIKOFFX7w6DhYY1ePHZI721ee1HiCtDvw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.451.0.tgz", + "integrity": "sha512-KWyZ1JGnYz2QbHuJtYTP1BVnMOfVopR8rP8dTinVb/JR5HfAYz4imICJlJUbOYRjN7wpA3PrRI8dNRjrSBjWJg==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", "@smithy/util-config-provider": "^2.0.0", "tslib": "^2.5.0" }, @@ -559,13 +598,13 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.428.0.tgz", - "integrity": "sha512-d/vWUs9RD4fuO1oi7gJby6aEPb6XTf2+jCbrs/hUEYFMxQu7wwQx2c6BWAjfQca8zVadh7FY0cDNtL2Ep2d8zA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.451.0.tgz", + "integrity": "sha512-vwG8o2Uk6biLDlOZnqXemsO4dS2HvrprUdxyouwu6hlzLFskg8nL122butn19JqXJKgcVLuSSLzT+xwqBWy2Rg==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -573,17 +612,17 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.428.0.tgz", - "integrity": "sha512-O54XmBSvi9A6ZBRVSYrEvoGH1BjtR1TT8042gOdJgouI0OVWtjqHT2ZPVTbQ/rKW5QeLXszVloXFW6eqOwrVTg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.451.0.tgz", + "integrity": "sha512-eOkpcC2zgAvqs1w7Yp5nsk9LBIj6qLU5kaZuZEBOiFbNKIrTnPo6dQuhgvDcKHD6Y5W/cUjSBiFMs/ROb5aoug==", "dependencies": { "@aws-crypto/crc32": "3.0.0", "@aws-crypto/crc32c": "3.0.0", - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", - "@smithy/util-utf8": "^2.0.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -591,13 +630,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.429.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.429.0.tgz", - "integrity": "sha512-3v9WoDCmbfH28znQ43cQLvLlm8fhJFIDJLW19moFI8QbXMv85yojGEphBMlT2XZUw79+tyh7GWLFaNugYZ1o9A==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.451.0.tgz", + "integrity": "sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -605,12 +644,12 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.428.0.tgz", - "integrity": "sha512-2YvAhkdzMITTc2fVIH7FS5Hqa7AuoHBg92W0CzPOiKBkC0D6m5hw8o5Z5RnH/M9ki2eB4dn+7uB6p7Lgs+VFdw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.451.0.tgz", + "integrity": "sha512-R4U2G7mybP0BMiQBJWTcB47g49F4PSXTiCsvMDp5WOEhpWvGQuO1ZIhTxCl5s5lgTSne063Os8W6KSdK2yG2TQ==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -618,12 +657,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.428.0.tgz", - "integrity": "sha512-1P0V0quL9u2amdNOn6yYT7/ToQUmkLJqCKHPxsRyDB829vBThWndvvH5MkoItj/VgE1zWqMtrzN3xtzD7zx6Qg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.451.0.tgz", + "integrity": "sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -631,13 +670,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.428.0.tgz", - "integrity": "sha512-xC0OMduCByyRdiQz324RXy4kunnCG4LUJCfvdoegM33Elp9ex0D3fcfO1mUgV8qiLwSennIsSRVXHuhNxE2HZA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.451.0.tgz", + "integrity": "sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -645,15 +684,15 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.429.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.429.0.tgz", - "integrity": "sha512-wCT5GoExncHUzUbW8b9q/PN3uPsbxit4PUAHw/hkrIHDKOxd9H/ClM37ZeJHNEOml5hnJOPy+rOaF9jRqo8dGg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.451.0.tgz", + "integrity": "sha512-XF4Cw8HrYUwGLKOqKtWs6ss1WXoxvQUcgGLACGSqn9a0p51446NiS5671x7qJUsfBuygdKlIKcOc8pPr9a+5Ow==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@aws-sdk/util-arn-parser": "3.310.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@smithy/protocol-http": "^3.0.9", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -661,13 +700,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.428.0.tgz", - "integrity": "sha512-Uutl2niYXTnNP8v84v6umWDHD5no7d5/OqkZE1DsmeKR/dje90J5unJWf7MOsqvYm0JGDEWF4lk9xGVyqsw+Aw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.451.0.tgz", + "integrity": "sha512-UJ6UfVUEgp0KIztxpAeelPXI5MLj9wUtUCqYeIMP7C1ZhoEMNm3G39VLkGN43dNhBf1LqjsV9jkKMZbVfYXuwg==", "dependencies": { - "@aws-sdk/middleware-signing": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/middleware-signing": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -675,16 +714,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.428.0.tgz", - "integrity": "sha512-oMSerTPwtsQAR7fIU/G0b0BA30wF+MC4gZSrJjbypF8MK8nPC2yMfKLR8+QavGOGEW7rUMQ0uklThMTTwQEXNQ==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.451.0.tgz", + "integrity": "sha512-s5ZlcIoLNg1Huj4Qp06iKniE8nJt/Pj1B/fjhWc6cCPCM7XJYUCejCnRh6C5ZJoBEYodjuwZBejPc1Wh3j+znA==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", + "@smithy/protocol-http": "^3.0.9", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", + "@smithy/types": "^2.5.0", + "@smithy/util-middleware": "^2.0.6", "tslib": "^2.5.0" }, "engines": { @@ -692,12 +731,12 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.428.0.tgz", - "integrity": "sha512-QPKisAErRHFoopmdFhgOmjZPcUM6rvWCtnoEY4Sw9F0aIyK6yCTn+nB5j+3FAPvUvblE22srM6aow8TcGx1gjA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.451.0.tgz", + "integrity": "sha512-hDkeBUiRsvuDbvsPha0/uJHE680WDzjAOoE6ZnLBoWsw7ry+Bw1ULMj0sCmpBVrQ7Gpivi/6zbezhClVmt3ITw==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -705,14 +744,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.428.0.tgz", - "integrity": "sha512-+GAhObeHRick2D5jr3YkPckjcggt5v6uUVtEUQW2AdD65cE5PjIvmksv6FuM/mME/9nNA+wufQnHbLI8teLeaw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.451.0.tgz", + "integrity": "sha512-8NM/0JiKLNvT9wtAQVl1DFW0cEO7OvZyLSUBLNLTHqyvOZxKaZ8YFk7d8PL6l76LeUKRxq4NMxfZQlUIRe0eSA==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-endpoints": "3.451.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -720,14 +759,14 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.430.0.tgz", - "integrity": "sha512-9lqgtkcd4dqsQ2yN6V/i06blyDh4yLmS+fAS7LwEZih/NZZ2cBIR+5kb9c236auvTcuMcL1zFxVRloWwesYZjA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.451.0.tgz", + "integrity": "sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==", "dependencies": { - "@smithy/node-config-provider": "^2.1.2", - "@smithy/types": "^2.3.5", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/types": "^2.5.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/util-middleware": "^2.0.6", "tslib": "^2.5.0" }, "engines": { @@ -735,17 +774,17 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.430.0.tgz", - "integrity": "sha512-8+vatOoqEQTwhNXOG6QoTJ6Fszaagc+bQpgfKbRIotCLGh7g4/qgQXo73LVyFVLkS4Tg2bn/KHN8aG3qTPd1KQ==", + "version": "3.456.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.456.0.tgz", + "integrity": "sha512-f7xATU5D4Gn5CzdS1jWUv5LUoO8LInP1zLIIRX2jmwamIfIOBdix8jvEr6NQLGg2Bp7/ygNb9dbgQ6y0vmlWIA==", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-format-url": "3.428.0", - "@smithy/middleware-endpoint": "^2.1.2", - "@smithy/protocol-http": "^3.0.7", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@aws-sdk/signature-v4-multi-region": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-format-url": "3.451.0", + "@smithy/middleware-endpoint": "^2.2.0", + "@smithy/protocol-http": "^3.0.9", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -753,16 +792,17 @@ } }, "node_modules/@aws-sdk/signature-v4-crt": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.428.0.tgz", - "integrity": "sha512-TP6hSSfUH/3RXwJUKcYj2e96/arCzAEYfbk1sBod5JwqqHxfTsssNFoWw6E+a1RtJrwiFjrYiArUuFGcdMZAWg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.451.0.tgz", + "integrity": "sha512-bWoHFsAg6yF+3lpmQfYPlTbioOS+o5PfsewZn8OouAalkiRmNzuW6Pcw1ebHL7OLlp7AUAXLLO79ji+5F3NyJw==", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.428.0", + "@aws-sdk/signature-v4-multi-region": "3.451.0", + "@aws-sdk/util-user-agent-node": "3.451.0", "@smithy/querystring-parser": "^2.0.0", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", - "aws-crt": "^1.15.9", + "@smithy/types": "^2.5.0", + "@smithy/util-middleware": "^2.0.6", + "aws-crt": "^1.18.3", "tslib": "^2.5.0" }, "engines": { @@ -770,14 +810,14 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.428.0.tgz", - "integrity": "sha512-ImuontXK1vEHtxK+qiPVfLTk/+bKSwYqrVkE2/o5rnsqD78/wySzTn5RnkA73Nb+UL4qSd0dkOcuubEee2aUpQ==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.451.0.tgz", + "integrity": "sha512-qQKY7/txeNUTLyRL3WxUWEwaZ5sf76EIZgu9kLaR96cAYSxwQi/qQB3ijbfD6u7sJIA8aROMxeYK0VmRsQg0CA==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/protocol-http": "^3.0.7", + "@aws-sdk/types": "3.451.0", + "@smithy/protocol-http": "^3.0.9", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -785,44 +825,46 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.430.0.tgz", - "integrity": "sha512-vE+QnqG0A4MWhMEFXXPg8gPXjw03b4Q3XZbHyrANoZ+tVrzh8JhpHIcbkesGh6WrjirNqId0UghzI9VanKxsLw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.451.0.tgz", + "integrity": "sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.429.0", - "@aws-sdk/middleware-logger": "3.428.0", - "@aws-sdk/middleware-recursion-detection": "3.428.0", - "@aws-sdk/middleware-user-agent": "3.428.0", - "@aws-sdk/types": "3.428.0", - "@aws-sdk/util-endpoints": "3.428.0", - "@aws-sdk/util-user-agent-browser": "3.428.0", - "@aws-sdk/util-user-agent-node": "3.430.0", - "@smithy/config-resolver": "^2.0.15", - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/hash-node": "^2.0.11", - "@smithy/invalid-dependency": "^2.0.11", - "@smithy/middleware-content-length": "^2.0.13", - "@smithy/middleware-endpoint": "^2.1.2", - "@smithy/middleware-retry": "^2.0.17", - "@smithy/middleware-serde": "^2.0.11", - "@smithy/middleware-stack": "^2.0.5", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/node-http-handler": "^2.1.7", + "@aws-sdk/middleware-host-header": "3.451.0", + "@aws-sdk/middleware-logger": "3.451.0", + "@aws-sdk/middleware-recursion-detection": "3.451.0", + "@aws-sdk/middleware-user-agent": "3.451.0", + "@aws-sdk/region-config-resolver": "3.451.0", + "@aws-sdk/types": "3.451.0", + "@aws-sdk/util-endpoints": "3.451.0", + "@aws-sdk/util-user-agent-browser": "3.451.0", + "@aws-sdk/util-user-agent-node": "3.451.0", + "@smithy/config-resolver": "^2.0.18", + "@smithy/fetch-http-handler": "^2.2.6", + "@smithy/hash-node": "^2.0.15", + "@smithy/invalid-dependency": "^2.0.13", + "@smithy/middleware-content-length": "^2.0.15", + "@smithy/middleware-endpoint": "^2.2.0", + "@smithy/middleware-retry": "^2.0.20", + "@smithy/middleware-serde": "^2.0.13", + "@smithy/middleware-stack": "^2.0.7", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/node-http-handler": "^2.1.9", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.7", + "@smithy/protocol-http": "^3.0.9", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-base64": "^2.0.0", + "@smithy/smithy-client": "^2.1.15", + "@smithy/types": "^2.5.0", + "@smithy/url-parser": "^2.0.13", + "@smithy/util-base64": "^2.0.1", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.15", - "@smithy/util-defaults-mode-node": "^2.0.20", - "@smithy/util-retry": "^2.0.4", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-defaults-mode-browser": "^2.0.19", + "@smithy/util-defaults-mode-node": "^2.0.25", + "@smithy/util-endpoints": "^1.0.4", + "@smithy/util-retry": "^2.0.6", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -830,11 +872,11 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.428.0.tgz", - "integrity": "sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.451.0.tgz", + "integrity": "sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -853,11 +895,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.428.0.tgz", - "integrity": "sha512-ToKMhYlUWJ0YrbggpJLZeyZZNDXtQ4NITxqo/oeGltTT9KG4o/LqVY59EveV0f8P32ObDyj9Vh1mnjxeo3DxGw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.451.0.tgz", + "integrity": "sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==", "dependencies": { - "@aws-sdk/types": "3.428.0", + "@aws-sdk/types": "3.451.0", + "@smithy/util-endpoints": "^1.0.4", "tslib": "^2.5.0" }, "engines": { @@ -865,13 +908,13 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.428.0.tgz", - "integrity": "sha512-Jx3VwsGXaIGtFNRVg9IqGWMm7wTDsdTRLn29Tn2a6N38TaqrRMpC3T0YK3YrWKjNYhClo5tUIJLi5QGk2d2vBg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.451.0.tgz", + "integrity": "sha512-gmcqSFTIISU9iN6rSbc8HVqB9ACluPbo4mS0ztkk9DaDz5zK/YxoKBJSfqkZFidMzxYiXeWruDCxD8ZgYRn6ug==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/querystring-builder": "^2.0.13", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -890,24 +933,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.428.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.428.0.tgz", - "integrity": "sha512-qlc2UoGsmCpuh1ErY3VayZuAGl74TWWcLmhhQMkeByFSb6KooBlwOmDpDzJRtgwJoe0KXnyHBO6lzl9iczcozg==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.451.0.tgz", + "integrity": "sha512-Ws5mG3J0TQifH7OTcMrCTexo7HeSAc3cBgjfhS/ofzPUzVCtsyg0G7I6T7wl7vJJETix2Kst2cpOsxygPgPD9w==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/types": "^2.5.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.430.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.430.0.tgz", - "integrity": "sha512-DPpFPL3mFMPtipFxjY7TKQBjnhmsPzYCr4Y+qna0oR6ij8jZOz2ILQDK33GxTRNh3+bV9YYbx+ZGDOnxoK5Mhw==", + "version": "3.451.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.451.0.tgz", + "integrity": "sha512-TBzm6P+ql4mkGFAjPlO1CI+w3yUT+NulaiALjl/jNX/nnUp6HsJsVxJf4nVFQTG5KRV0iqMypcs7I3KIhH+LmA==", "dependencies": { - "@aws-sdk/types": "3.428.0", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/types": "^2.3.5", + "@aws-sdk/types": "3.451.0", + "@smithy/node-config-provider": "^2.1.5", + "@smithy/types": "^2.5.0", "tslib": "^2.5.0" }, "engines": { @@ -942,11 +985,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.4.tgz", + "integrity": "sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==", "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -1059,11 +1102,11 @@ } }, "node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1083,11 +1126,11 @@ } }, "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1107,11 +1150,11 @@ } }, "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1120,9 +1163,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" } @@ -1136,9 +1179,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1213,9 +1256,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.4.tgz", + "integrity": "sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1224,9 +1267,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1248,11 +1291,11 @@ } }, "node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1261,18 +1304,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1280,6 +1323,33 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.4.tgz", + "integrity": "sha512-esuS49Cga3HcThFNebGhlgsrVLkvhqvYDTzgjfFFlHJcIfLe5jFmRRfCQ1KuBfc4Jrtn3ndLgKWAKjBE+IraYQ==", + "dependencies": { + "@babel/types": "^7.23.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/types": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.4.tgz", + "integrity": "sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1301,16 +1371,16 @@ } }, "node_modules/@commitlint/cli": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.0.tgz", - "integrity": "sha512-D3LdyZYbiRyAChfJMNlAd9f2P9vNQ7GWbI9gN2o7L5hF07QJDqj4z/pcJF3PjDbJWOaUUXla287RdDmmKqH2WQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.1.tgz", + "integrity": "sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==", "dev": true, "dependencies": { - "@commitlint/format": "^17.4.4", - "@commitlint/lint": "^17.8.0", - "@commitlint/load": "^17.8.0", - "@commitlint/read": "^17.5.1", - "@commitlint/types": "^17.4.4", + "@commitlint/format": "^17.8.1", + "@commitlint/lint": "^17.8.1", + "@commitlint/load": "^17.8.1", + "@commitlint/read": "^17.8.1", + "@commitlint/types": "^17.8.1", "execa": "^5.0.0", "lodash.isfunction": "^3.0.9", "resolve-from": "5.0.0", @@ -1325,9 +1395,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.0.tgz", - "integrity": "sha512-MgiFXujmqAvi7M33C7OSMTznwrVkckrbXe/aZWQ/+KFGLLF6IE50XIcjGrW0/uiDGb/im5qbqF2dh1dCFNa+sQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz", + "integrity": "sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==", "dev": true, "dependencies": { "conventional-changelog-conventionalcommits": "^6.1.0" @@ -1337,12 +1407,12 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", - "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz", + "integrity": "sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "ajv": "^8.11.0" }, "engines": { @@ -1350,12 +1420,12 @@ } }, "node_modules/@commitlint/ensure": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.6.7.tgz", - "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz", + "integrity": "sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -1367,21 +1437,21 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", - "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz", + "integrity": "sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/format": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", - "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz", + "integrity": "sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "chalk": "^4.1.0" }, "engines": { @@ -1389,12 +1459,12 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.0.tgz", - "integrity": "sha512-8bR6rxNcWaNprPBdE4ePIOwbxutTQGOsRPYWssX+zjGxnEljzaZSGzFUOMxapYILlf8Tts/O1wPQgG549Rdvdg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz", + "integrity": "sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "semver": "7.5.4" }, "engines": { @@ -1402,30 +1472,30 @@ } }, "node_modules/@commitlint/lint": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.0.tgz", - "integrity": "sha512-4ihwnqOY4TcJN6iz5Jv1LeYavvBllONwFyGxOIWmCT5s4PNMb43cws2TUdbXTZL1Vq59etGKd5LWYDFPVbs5EA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz", + "integrity": "sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^17.8.0", - "@commitlint/parse": "^17.7.0", - "@commitlint/rules": "^17.7.0", - "@commitlint/types": "^17.4.4" + "@commitlint/is-ignored": "^17.8.1", + "@commitlint/parse": "^17.8.1", + "@commitlint/rules": "^17.8.1", + "@commitlint/types": "^17.8.1" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/load": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.0.tgz", - "integrity": "sha512-9VnGXYJCP4tXmR4YrwP8n5oX6T5ZsHfPQq6WuUQOvAI+QsDQMaTGgTRXr7us+xsjz+b+mMBSagogqfUx2aixyw==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz", + "integrity": "sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/execute-rule": "^17.4.0", - "@commitlint/resolve-extends": "^17.6.7", - "@commitlint/types": "^17.4.4", + "@commitlint/config-validator": "^17.8.1", + "@commitlint/execute-rule": "^17.8.1", + "@commitlint/resolve-extends": "^17.8.1", + "@commitlint/types": "^17.8.1", "@types/node": "20.5.1", "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", @@ -1435,28 +1505,28 @@ "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.0.0" + "typescript": "^4.6.4 || ^5.2.2" }, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/message": { - "version": "17.4.2", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", - "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz", + "integrity": "sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.7.0.tgz", - "integrity": "sha512-dIvFNUMCUHqq5Abv80mIEjLVfw8QNuA4DS7OWip4pcK/3h5wggmjVnlwGCDvDChkw2TjK1K6O+tAEV78oxjxag==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz", + "integrity": "sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==", "dev": true, "dependencies": { - "@commitlint/types": "^17.4.4", + "@commitlint/types": "^17.8.1", "conventional-changelog-angular": "^6.0.0", "conventional-commits-parser": "^4.0.0" }, @@ -1465,13 +1535,13 @@ } }, "node_modules/@commitlint/read": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", - "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz", + "integrity": "sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==", "dev": true, "dependencies": { - "@commitlint/top-level": "^17.4.0", - "@commitlint/types": "^17.4.4", + "@commitlint/top-level": "^17.8.1", + "@commitlint/types": "^17.8.1", "fs-extra": "^11.0.0", "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" @@ -1481,13 +1551,13 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "17.6.7", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", - "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz", + "integrity": "sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^17.6.7", - "@commitlint/types": "^17.4.4", + "@commitlint/config-validator": "^17.8.1", + "@commitlint/types": "^17.8.1", "import-fresh": "^3.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", @@ -1498,15 +1568,15 @@ } }, "node_modules/@commitlint/rules": { - "version": "17.7.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.7.0.tgz", - "integrity": "sha512-J3qTh0+ilUE5folSaoK91ByOb8XeQjiGcdIdiB/8UT1/Rd1itKo0ju/eQVGyFzgTMYt8HrDJnGTmNWwcMR1rmA==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz", + "integrity": "sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==", "dev": true, "dependencies": { - "@commitlint/ensure": "^17.6.7", - "@commitlint/message": "^17.4.2", - "@commitlint/to-lines": "^17.4.0", - "@commitlint/types": "^17.4.4", + "@commitlint/ensure": "^17.8.1", + "@commitlint/message": "^17.8.1", + "@commitlint/to-lines": "^17.8.1", + "@commitlint/types": "^17.8.1", "execa": "^5.0.0" }, "engines": { @@ -1514,18 +1584,18 @@ } }, "node_modules/@commitlint/to-lines": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", - "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz", + "integrity": "sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==", "dev": true, "engines": { "node": ">=v14" } }, "node_modules/@commitlint/top-level": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", - "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz", + "integrity": "sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==", "dev": true, "dependencies": { "find-up": "^5.0.0" @@ -1535,9 +1605,9 @@ } }, "node_modules/@commitlint/types": { - "version": "17.4.4", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", - "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz", + "integrity": "sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==", "dev": true, "dependencies": { "chalk": "^4.1.0" @@ -1684,6 +1754,16 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@documenso/app-tests": { "resolved": "packages/app-tests", "link": true @@ -1838,51 +1918,6 @@ "esbuild": "*" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/darwin-arm64": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", @@ -1898,276 +1933,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2183,17 +1948,17 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", + "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -2233,9 +1998,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", + "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -2263,9 +2028,9 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", - "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", "dependencies": { "@floating-ui/dom": "^1.5.1" }, @@ -2280,9 +2045,9 @@ "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "node_modules/@grpc/grpc-js": { - "version": "1.9.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.6.tgz", - "integrity": "sha512-yq3qTy23u++8zdvf+h4mz4ohDFi681JAkMZZPTKh8zmUVh0AKLisFlgxcn22FMNowXz15oJ6pqgwT7DJ+PdJvg==", + "version": "1.9.11", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.11.tgz", + "integrity": "sha512-QDhMfbTROOXUhLHMroow8f3EHiCKUOh6UwxMP5S3EuXMnWMNSVIhatGZRwkpg9OUTYdZPsDUVH3cOAkWhGFUJw==", "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -2344,12 +2109,44 @@ "xtend": "^4.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "node_modules/@httptoolkit/websocket-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -2370,15 +2167,14 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2395,7 +2191,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -2407,7 +2202,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -2453,12 +2247,12 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@js-temporal/polyfill": { @@ -2713,23 +2507,22 @@ } }, "node_modules/@next/env": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.0.tgz", - "integrity": "sha512-cIKhxkfVELB6hFjYsbtEeTus2mwrTC+JissfZYM0n+8Fv+g8ucUfOlm3VEDtwtwydZ0Nuauv3bl0qF82nnCAqA==" + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.3.tgz", + "integrity": "sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "12.3.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.4.tgz", - "integrity": "sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==", - "dev": true, + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", + "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", "dependencies": { "glob": "7.1.7" } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.0.tgz", - "integrity": "sha512-HQKi159jCz4SRsPesVCiNN6tPSAFUkOuSkpJsqYTIlbHLKr1mD6be/J0TvWV6fwJekj81bZV9V/Tgx3C2HO9lA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz", + "integrity": "sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==", "cpu": [ "arm64" ], @@ -2742,9 +2535,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.0.tgz", - "integrity": "sha512-4YyQLMSaCgX/kgC1jjF3s3xSoBnwHuDhnF6WA1DWNEYRsbOOPWjcYhv8TKhRe2ApdOam+VfQSffC4ZD+X4u1Cg==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz", + "integrity": "sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==", "cpu": [ "x64" ], @@ -2757,9 +2550,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.0.tgz", - "integrity": "sha512-io7fMkJ28Glj7SH8yvnlD6naIhRDnDxeE55CmpQkj3+uaA2Hko6WGY2pT5SzpQLTnGGnviK85cy8EJ2qsETj/g==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz", + "integrity": "sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==", "cpu": [ "arm64" ], @@ -2772,9 +2565,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.0.tgz", - "integrity": "sha512-nC2h0l1Jt8LEzyQeSs/BKpXAMe0mnHIMykYALWaeddTqCv5UEN8nGO3BG8JAqW/Y8iutqJsaMe2A9itS0d/r8w==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz", + "integrity": "sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==", "cpu": [ "arm64" ], @@ -2787,9 +2580,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.0.tgz", - "integrity": "sha512-Wf+WjXibJQ7hHXOdNOmSMW5bxeJHVf46Pwb3eLSD2L76NrytQlif9NH7JpHuFlYKCQGfKfgSYYre5rIfmnSwQw==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz", + "integrity": "sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==", "cpu": [ "x64" ], @@ -2802,9 +2595,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.0.tgz", - "integrity": "sha512-WTZb2G7B+CTsdigcJVkRxfcAIQj7Lf0ipPNRJ3vlSadU8f0CFGv/ST+sJwF5eSwIe6dxKoX0DG6OljDBaad+rg==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz", + "integrity": "sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==", "cpu": [ "x64" ], @@ -2817,9 +2610,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.0.tgz", - "integrity": "sha512-7R8/x6oQODmNpnWVW00rlWX90sIlwluJwcvMT6GXNIBOvEf01t3fBg0AGURNKdTJg2xNuP7TyLchCL7Lh2DTiw==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz", + "integrity": "sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==", "cpu": [ "arm64" ], @@ -2832,9 +2625,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.0.tgz", - "integrity": "sha512-RLK1nELvhCnxaWPF07jGU4x3tjbyx2319q43loZELqF0+iJtKutZ+Lk8SVmf/KiJkYBc7Cragadz7hb3uQvz4g==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz", + "integrity": "sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==", "cpu": [ "ia32" ], @@ -2847,9 +2640,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.0.tgz", - "integrity": "sha512-g6hLf1SUko+hnnaywQQZzzb3BRecQsoKkF3o/C+F+dOA4w/noVAJngUVkfwF0+2/8FzNznM7ofM6TGZO9svn7w==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz", + "integrity": "sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==", "cpu": [ "x64" ], @@ -2880,446 +2673,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@node-rs/argon2": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2/-/argon2-1.5.2.tgz", - "integrity": "sha512-qq7wOSsdP2b4rXEapWNmsCjpaTGZWtp9kZmri98GYCDZqN8UJUG5zSue4XtYWWJMWKJVE/hkaIwk+BgN1ZUn0Q==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@node-rs/argon2-android-arm-eabi": "1.5.2", - "@node-rs/argon2-android-arm64": "1.5.2", - "@node-rs/argon2-darwin-arm64": "1.5.2", - "@node-rs/argon2-darwin-x64": "1.5.2", - "@node-rs/argon2-freebsd-x64": "1.5.2", - "@node-rs/argon2-linux-arm-gnueabihf": "1.5.2", - "@node-rs/argon2-linux-arm64-gnu": "1.5.2", - "@node-rs/argon2-linux-arm64-musl": "1.5.2", - "@node-rs/argon2-linux-x64-gnu": "1.5.2", - "@node-rs/argon2-linux-x64-musl": "1.5.2", - "@node-rs/argon2-win32-arm64-msvc": "1.5.2", - "@node-rs/argon2-win32-ia32-msvc": "1.5.2", - "@node-rs/argon2-win32-x64-msvc": "1.5.2" - } - }, - "node_modules/@node-rs/argon2-android-arm-eabi": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm-eabi/-/argon2-android-arm-eabi-1.5.2.tgz", - "integrity": "sha512-vVZec4ITr9GumAy0p8Zj8ozie362gtbZrTkLp9EqvuFZ/HrZzR09uS2IsDgm4mAstg/rc4A1gLRrHI8jDdbjkA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-android-arm64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-android-arm64/-/argon2-android-arm64-1.5.2.tgz", - "integrity": "sha512-SwhnsXyrpgtWDTwYds1WUnxLA/kVP8HVaImYwQ3Wemqj1lkzcSoIaNyjNWkyrYGqO1tVc1YUrqsbd5eCHh+3sg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-darwin-arm64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-arm64/-/argon2-darwin-arm64-1.5.2.tgz", - "integrity": "sha512-+1ZMKiCCv2pip/o1Xg09piQru2LOIBPQ1vS4is86f55N3jjZnSfP+db5mYCSRuB0gRYqui98he7su7OGXlF4gQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-darwin-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-darwin-x64/-/argon2-darwin-x64-1.5.2.tgz", - "integrity": "sha512-mQ57mORlsxpfjcEsVpiHyHCOp6Ljrz/rVNWk8ihnPWw0qt0EqF1zbHRxTEPemL1iBHL9UyXpXrKS4JKq6xMn5w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-freebsd-x64": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-freebsd-x64/-/argon2-freebsd-x64-1.5.2.tgz", - "integrity": "sha512-UjKbFd3viYcpiwflkU4haEdNUMk1V2fVCJImWLWQns/hVval9BrDv5xsBwgdynbPHDlPOiWj816LBQwhWLGVWA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm-gnueabihf": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm-gnueabihf/-/argon2-linux-arm-gnueabihf-1.5.2.tgz", - "integrity": "sha512-36GJjJBnVuscV9CTn8RVDeJysnmIzr6Lp7QBCDczYHi6eKFuA8udCJb4SRyJqdvIuzycKG1RL56FbcFBJYCYIA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm64-gnu": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-gnu/-/argon2-linux-arm64-gnu-1.5.2.tgz", - "integrity": "sha512-sE0ydb2gp6xC+5vbVz8l3paaiBbFQIB2Rwp5wx9MmKiYdTfcO5WkGeADuSgoFiTcSEz1RsHXqrdVy6j/LtSqtA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-arm64-musl": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-arm64-musl/-/argon2-linux-arm64-musl-1.5.2.tgz", - "integrity": "sha512-LhE0YHB0aJCwlbsQrwePik/KFWUc9qMriJIL5KiejK3bDoTVY4ihH587QT56JyaLvl3nBJaAV8l5yMqQdHnouA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-x64-gnu": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-gnu/-/argon2-linux-x64-gnu-1.5.2.tgz", - "integrity": "sha512-MnKLiBlyg05pxvKXe3lNgBL9El9ThD74hvVEiWH1Xk40RRrJ507NCOWXVmQ0FDq1mjTeGFxbIvk+AcoF0NSLIQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-linux-x64-musl": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-linux-x64-musl/-/argon2-linux-x64-musl-1.5.2.tgz", - "integrity": "sha512-tzLgASY0Ng2OTW7Awwl9UWzjbWx8/uD6gXcZ/k/nYGSZE5Xp8EOD2NUqHLbK6KZE3775A0R25ShpiSxCadYqkg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-win32-arm64-msvc": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-arm64-msvc/-/argon2-win32-arm64-msvc-1.5.2.tgz", - "integrity": "sha512-vpTwSvv3oUXTpWZh0/HxdJ5wFMlmS7aVDwL4ATWepTZhMG4n+TO0+tVLdcPHCbg0oc6hCWBjWNPlSn9mW+YIgA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-win32-ia32-msvc": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-ia32-msvc/-/argon2-win32-ia32-msvc-1.5.2.tgz", - "integrity": "sha512-KPpZR15ui7uQWQXKmtaKyUQRs4UJdXnIIfiyFLGmLWCdEKlr3MtIGFt0fdziu4BF5ZObD8Ic6QvT0VXK4OJiww==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/argon2-win32-x64-msvc": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@node-rs/argon2-win32-x64-msvc/-/argon2-win32-x64-msvc-1.5.2.tgz", - "integrity": "sha512-/pGuwixJS8ZlpwhX9iM6g6JEeZYo1TtnNf8exwsOi7gxcUoTUfw5it+5GfbY/n+xRBz/DIU4bzUmXmh+7Gh0ug==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.7.3.tgz", - "integrity": "sha512-BF6u9CBPUiyk1zU+5iwikezf+xM4MFSu5cmrrg/PLKffGgIM13ZsY6DHftcTraETB04ryasjM/5IejotH+sO5Q==", - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "optionalDependencies": { - "@node-rs/bcrypt-android-arm-eabi": "1.7.3", - "@node-rs/bcrypt-android-arm64": "1.7.3", - "@node-rs/bcrypt-darwin-arm64": "1.7.3", - "@node-rs/bcrypt-darwin-x64": "1.7.3", - "@node-rs/bcrypt-freebsd-x64": "1.7.3", - "@node-rs/bcrypt-linux-arm-gnueabihf": "1.7.3", - "@node-rs/bcrypt-linux-arm64-gnu": "1.7.3", - "@node-rs/bcrypt-linux-arm64-musl": "1.7.3", - "@node-rs/bcrypt-linux-x64-gnu": "1.7.3", - "@node-rs/bcrypt-linux-x64-musl": "1.7.3", - "@node-rs/bcrypt-win32-arm64-msvc": "1.7.3", - "@node-rs/bcrypt-win32-ia32-msvc": "1.7.3", - "@node-rs/bcrypt-win32-x64-msvc": "1.7.3" - } - }, - "node_modules/@node-rs/bcrypt-android-arm-eabi": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.7.3.tgz", - "integrity": "sha512-l53RuBqnqNvBN2jx09Ws6jpLmuQdSDx10n0GeaTfwh1svxsC8bPpVmxkfBExsT2Tu7KF38gTnPZvwsxysZQyPQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-android-arm64": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.7.3.tgz", - "integrity": "sha512-TZpm4VbiViqDMvusrcYzLr1b1M5FDF0cDNiTUciLeBSsKtU5lNdEZGAU7gvCnrKoUWpGuOblHU7613zuB7SiNQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-darwin-arm64": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.7.3.tgz", - "integrity": "sha512-SiUuAabynVsmixZMjh5xrn8w47EnV0HzbW9st4DPoVhn/wzdUcksIXDY75aoQG2EIzKLN8IGb+CIVnPGmRyhxw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-darwin-x64": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.7.3.tgz", - "integrity": "sha512-R+81Z0eX4hZPvCXY5Z6l0l+JrTU3WcSYGHP0QYV9uwdaafOz6EhrCXUzZ02AIcAbNoVR8eucYVruq9PiasXoVw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-freebsd-x64": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.7.3.tgz", - "integrity": "sha512-0pItU/5K3e83JjcJj9fZv+78txUoZ3hHCT7n/UMdu9mkpUzhX/rqb4jmQpJpD+UQoR76xp3qDo5RMgQBffBVNg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.7.3.tgz", - "integrity": "sha512-HTSybWUjNe8rWuXkTkMeFDiQNHc6VioRcgv6AeHZphIxiT6dFbnhXNkfz4Hr0zxvyPhZ3NrYjT2AmPVFT6VW3Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.7.3.tgz", - "integrity": "sha512-rWep6Y+v/c4bZHaM8LmSsrMwMmDR9wG4/q+3Z9VzR8xdnt5VCbuQdYWpf3sgGRGjTRdTBAdSK8x1reOjqsJ3Jg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-arm64-musl": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.7.3.tgz", - "integrity": "sha512-TyWEKhxr+yfGcMKzVV/ARZw+Hrky2yl91bo0XYU2ZW6I6LDC0emNsXugdWjwz8ADI4OWhhrOjXD8GCilxiB2Rg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-x64-gnu": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.7.3.tgz", - "integrity": "sha512-PofxM1Qg7tZKj1oP0I7tBTSSLr8Xc2uxx+P3pBCPmYzaBwWqGteNHJlF7n2q5xiH7YOlguH4w5CmcEjsiA3K4A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-linux-x64-musl": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.7.3.tgz", - "integrity": "sha512-D5V6/dDVKP8S/ieDBLGhTn4oTo3upbrpWInynbhOMjJvPiIxVG1PiI3MXkWBtG9qtfleDk7gUkEKtAOxlIxDTQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.7.3.tgz", - "integrity": "sha512-b4gH2Yj5R4TwULrfMHd1Qqr+MrnFjVRUAJujDKPqi+PppSqezW8QF6DRSOL4GjnBmz5JEd64wxgeidvy7dsbGw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.7.3.tgz", - "integrity": "sha512-E91ro+ybI0RhNc89aGaZQGll0YhPoHr8JacoWrNKwhg9zwNOYeuO0tokdMZdm6nF0/8obll0Mq7wO9AXO9iffw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@node-rs/bcrypt-win32-x64-msvc": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.7.3.tgz", - "integrity": "sha512-LO/p9yjPODj/pQvPnowBuwpDdqiyUXQbqL1xb1RSP3NoyCFAGmjL5h0plSQrhLh8hskQiozBRXNaQurtsM7o0Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3553,28 +2906,28 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.17.1.tgz", - "integrity": "sha512-up5I+RiQEkGrVEHtbAtmRgS+ZOnFh3shaDNHqZPBlGy+O92auL6yMmjzYpSKmJOGWowvs3fhVHePa8Exb5iHUg==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.18.1.tgz", + "integrity": "sha512-HHfJR32NH2x0b69CACCwH8m1dpNALoCTtpgmIWMNkeMGNUeKT48d4AX4xsF4uIRuUoRTbTgtSBRvS+cF97qwCQ==", "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/core": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.17.1.tgz", - "integrity": "sha512-I6LrZvl1FF97FQXPR0iieWQmKnGxYtMbWA1GrAXnLUR+B1Hn2m8KqQNEIlZAucyv00GBgpWkpllmULmZfG8P3g==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.18.1.tgz", + "integrity": "sha512-kvnUqezHMhsQvdsnhnqTNfAJs3ox/isB0SVrM1dhVFw7SsB7TstuVa6fgWnN2GdPyilIFLUvvbTZoVRmx6eiRg==", "dependencies": { - "@opentelemetry/semantic-conventions": "1.17.1" + "@opentelemetry/semantic-conventions": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { @@ -3797,46 +3150,46 @@ } }, "node_modules/@opentelemetry/propagator-b3": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.17.1.tgz", - "integrity": "sha512-XEbXYb81AM3ayJLlbJqITPIgKBQCuby45ZHiB9mchnmQOffh6ZJOmXONdtZAV7TWzmzwvAd28vGSUk57Aw/5ZA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.18.1.tgz", + "integrity": "sha512-oSTUOsnt31JDx5SoEy27B5jE1/tiPvvE46w7CDKj0R5oZhCCfYH2bbSGa7NOOyDXDNqQDkgqU1DIV/xOd3f8pw==", "dependencies": { - "@opentelemetry/core": "1.17.1" + "@opentelemetry/core": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.17.1.tgz", - "integrity": "sha512-p+P4lf2pbqd3YMfZO15QCGsDwR2m1ke2q5+dq6YBLa/q0qiC2eq4cD/qhYBBed5/X4PtdamaVGHGsp+u3GXHDA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.18.1.tgz", + "integrity": "sha512-Kh4M1Qewv0Tbmts6D8LgNzx99IjdE18LCmY/utMkgVyU7Bg31Yuj+X6ZyoIRKPcD2EV4rVkuRI16WVMRuGbhWA==", "dependencies": { - "@opentelemetry/core": "1.17.1" + "@opentelemetry/core": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/resources": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.17.1.tgz", - "integrity": "sha512-M2e5emqg5I7qRKqlzKx0ROkcPyF8PbcSaWEdsm72od9txP7Z/Pl8PDYOyu80xWvbHAWk5mDxOF6v3vNdifzclA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.18.1.tgz", + "integrity": "sha512-JjbcQLYMttXcIabflLRuaw5oof5gToYV9fuXbcsoOeQ0BlbwUn6DAZi++PNsSz2jjPeASfDls10iaO/8BRIPRA==", "dependencies": { - "@opentelemetry/core": "1.17.1", - "@opentelemetry/semantic-conventions": "1.17.1" + "@opentelemetry/core": "1.18.1", + "@opentelemetry/semantic-conventions": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/sdk-logs": { @@ -3946,44 +3299,44 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.17.1.tgz", - "integrity": "sha512-pfSJJSjZj5jkCJUQZicSpzN8Iz9UKMryPWikZRGObPnJo6cUSoKkjZh6BM3j+D47G4olMBN+YZKYqkFM1L6zNA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz", + "integrity": "sha512-tRHfDxN5dO+nop78EWJpzZwHsN1ewrZRVVwo03VJa3JQZxToRDH29/+MB24+yoa+IArerdr7INFJiX/iN4gjqg==", "dependencies": { - "@opentelemetry/core": "1.17.1", - "@opentelemetry/resources": "1.17.1", - "@opentelemetry/semantic-conventions": "1.17.1" + "@opentelemetry/core": "1.18.1", + "@opentelemetry/resources": "1.18.1", + "@opentelemetry/semantic-conventions": "1.18.1" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.17.1.tgz", - "integrity": "sha512-J56DaG4cusjw5crpI7x9rv4bxDF27DtKYGxXJF56KIvopbNKpdck5ZWXBttEyqgAVPDwHMAXWDL1KchHzF0a3A==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.18.1.tgz", + "integrity": "sha512-ML0l9TNlfLoplLF1F8lb95NGKgdm6OezDS3Ymqav9sYxMd5bnH2LZVzd4xEF+ov5vpZJOGdWxJMs2nC9no7+xA==", "dependencies": { - "@opentelemetry/context-async-hooks": "1.17.1", - "@opentelemetry/core": "1.17.1", - "@opentelemetry/propagator-b3": "1.17.1", - "@opentelemetry/propagator-jaeger": "1.17.1", - "@opentelemetry/sdk-trace-base": "1.17.1", + "@opentelemetry/context-async-hooks": "1.18.1", + "@opentelemetry/core": "1.18.1", + "@opentelemetry/propagator-b3": "1.18.1", + "@opentelemetry/propagator-jaeger": "1.18.1", + "@opentelemetry/sdk-trace-base": "1.18.1", "semver": "^7.5.2" }, "engines": { "node": ">=14" }, "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.7.0" + "@opentelemetry/api": ">=1.0.0 <1.8.0" } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.1.tgz", - "integrity": "sha512-xbR2U+2YjauIuo42qmE8XyJK6dYeRMLJuOlUP5SO4auET4VtOHOzgkRVOq+Ik18N+Xf3YPcqJs9dZMiDddz1eQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz", + "integrity": "sha512-+NLGHr6VZwcgE/2lw8zDIufOCGnzsA5CbQIMleXZTrgkBd0TanCX+MiDYJ1TOS4KL/Tqk0nFRxawnaYr6pkZkA==", "engines": { "node": ">=14" } @@ -4024,19 +3377,18 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, "optional": true, "engines": { "node": ">=14" } }, "node_modules/@playwright/test": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", - "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.40.0.tgz", + "integrity": "sha512-PdW+kn4eV99iP5gxWNSDQCbhMaDVej+RXL5xr6t04nbKLCBwYtA046t7ofoczHOm8u6c+45hpDKQVZqtqwkeQg==", "dev": true, "dependencies": { - "playwright": "1.39.0" + "playwright": "1.40.0" }, "bin": { "playwright": "cli.js" @@ -5572,6 +4924,133 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@react-email/body": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.4.tgz", + "integrity": "sha512-NmHOumdmyjWvOXomqhQt06KbgRxhHrVznxQp/oWiPWes8nAJo2Y4L27aPHR9nTcs7JF7NmcJe9YSN42pswK+GQ==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/button": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.11.tgz", + "integrity": "sha512-mB5ySfZifwE5ybtIWwXGbmKk1uKkH4655gftL4+mMxZAZCkINVa2KXTi5pO+xZhMtJI9xtAsikOrOEU1gTDoww==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/column": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.8.tgz", + "integrity": "sha512-blChqGU8e/L6KZiB5EPww8bkZfdyHDuS0vKIvU+iS14uK+xfAw+5P5CU9BYXccEuJh2Gftfngu1bWMFp2Sc6ag==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/container": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.10.tgz", + "integrity": "sha512-goishY7ocq+lord0043/LZK268bqvMFW/sxpUt/dSCPJyrrZZNCbpW2t8w8HztU38cYj0qGQLxO5Qvpn/RER3w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/font": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.4.tgz", + "integrity": "sha512-rN/pFlAcDNmfYFxpufT/rFRrM5KYBJM4nTA2uylTehlVOro6fb/q6n0zUwLF6OmQ4QIuRbqdEy7DI9mmJiNHxA==", + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/head": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.6.tgz", + "integrity": "sha512-9BrBDalb34nBOmmQVQc7/pjJotcuAeC3rhBl4G88Ohiipuv15vPIKqwy8vPJcFNi4l7yGlitfG3EESIjkLkoIw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/heading": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.9.tgz", + "integrity": "sha512-xzkcGlm+/aFrNlJZBKzxRKkRYJ2cRx92IqmSKAuGnwuKQ/uMKomXzPsHPu3Dclmnhn3wVKj4uprkgQOoxP6uXQ==", + "dependencies": { + "@radix-ui/react-slot": "1.0.2", + "react": "18.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@react-email/hr": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.6.tgz", + "integrity": "sha512-W+wINBz7z7BRv3i9GS+QoJBae1PESNhv6ZY6eLnEpqtBI/2++suuRNJOU/KpZzE6pykeTp6I/Z7UcL0LEYKgyg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/html": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.6.tgz", + "integrity": "sha512-8Fo20VOqxqc087gGEPjT8uos06fTXIC8NSoiJxpiwAkwiKtQnQH/jOdoLv6XaWh5Zt2clj1uokaoklnaM5rY1w==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/img": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.6.tgz", + "integrity": "sha512-Wd7xKI3b1Jvb2ZEHyVpJ9D98u0GHrRl+578b8LV24PavM/65V61Q5LN5Fr9sAhj+4VGqnHDIVeXIYEzVbWaa3Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/link": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.6.tgz", + "integrity": "sha512-bYYHroWGS//nDl9yhh8V6K2BrNwAsyX7N/XClSCRku3x56NrZ6D0nBKWewYDPlJ9rW9TIaJm1jDYtO9XBzLlkQ==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/preview": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.7.tgz", + "integrity": "sha512-YLfIwHdexPi8IgP1pSuVXdAmKzMQ8ctCCLEjkMttT2vkSFqT6m/e6UFWK2l30rKm2dDsLvQyEvo923mPXjnNzg==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, "node_modules/@react-email/render": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.9.tgz", @@ -5586,10 +5065,61 @@ "node": ">=18.0.0" } }, + "node_modules/@react-email/row": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.6.tgz", + "integrity": "sha512-msJ2TnDJNwpgDfDzUO63CvhusJHeaGLMM+8Zz86VPvxzwe/DkT7N48QKRWRCkt8urxVz5U+EgivORA9Dum9p3Q==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/section": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.10.tgz", + "integrity": "sha512-x9B2KYFqj+d8I1fK9bgeVm/3mLE4Qgn4mm/GbDtcJeSzKU/G7bTb7/3+BMDk9SARPGkg5XAuZm1XgcqQQutt2A==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/tailwind": { + "version": "0.0.13-canary.1", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.13-canary.1.tgz", + "integrity": "sha512-XnqYPdghS/hkH/6dD+LOHISGSdTTezzYxrpaK3V+5gnxqKRYNi3SzsdeeskhTYXQw9DUk4UU8KREfQda0dAQqw==", + "dependencies": { + "postcss": "8.4.31", + "postcss-css-variables": "0.19.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/@react-email/text": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.6.tgz", + "integrity": "sha512-PDUTAD1PjlzXFOIUrR1zuV2xxguL62yne5YLcn1k+u/dVUyzn6iU/5lFShxCfzuh3QDWCf4+JRNnXN9rmV6jzw==", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz", + "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==" }, "node_modules/@scure/base": { "version": "1.1.3", @@ -5681,11 +5211,11 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.11.tgz", - "integrity": "sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.14.tgz", + "integrity": "sha512-zXtteuYLWbSXnzI3O6xq3FYvigYZFW8mdytGibfarLL2lxHto9L3ILtGVnVGmFZa7SDh62l39EnU5hesLN87Fw==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5701,23 +5231,23 @@ } }, "node_modules/@smithy/chunked-blob-reader-native": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", - "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.1.tgz", + "integrity": "sha512-N2oCZRglhWKm7iMBu7S6wDzXirjAofi7tAd26cxmgibRYOBS4D3hGfmkwCpHdASZzwZDD8rluh0Rcqw1JeZDRw==", "dependencies": { - "@smithy/util-base64": "^2.0.0", + "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.15.tgz", - "integrity": "sha512-a2Pfocla5nSrG2RyB8i20jcWgMyR71TUeFKm8pmrnZotr/X22tlg4y/EhSvBK2oTE8MKHlKh4YdpDO2AryJbGQ==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.19.tgz", + "integrity": "sha512-JsghnQ5zjWmjEVY8TFOulLdEOCj09SjRLugrHlkPZTIBBm7PQitCFVLThbsKPZQOP7N3ME1DU1nKUc1UaVnBog==", "dependencies": { - "@smithy/node-config-provider": "^2.1.2", - "@smithy/types": "^2.3.5", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/types": "^2.6.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/util-middleware": "^2.0.7", "tslib": "^2.5.0" }, "engines": { @@ -5725,14 +5255,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.17.tgz", - "integrity": "sha512-2XcD414yrwbxxuYueTo7tzLC2/w3jj9FZqfenpv3MQkocdOEmuOVS0v9WHsY/nW6V+2EcR340rj/z5HnvsHncQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.2.tgz", + "integrity": "sha512-Y62jBWdoLPSYjr9fFvJf+KwTa1EunjVr6NryTEWCnwIY93OJxwV4t0qxjwdPl/XMsUkq79ppNJSEQN6Ohnhxjw==", "dependencies": { - "@smithy/node-config-provider": "^2.1.2", - "@smithy/property-provider": "^2.0.12", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/property-provider": "^2.0.15", + "@smithy/types": "^2.6.0", + "@smithy/url-parser": "^2.0.14", "tslib": "^2.5.0" }, "engines": { @@ -5740,23 +5270,23 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz", - "integrity": "sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.14.tgz", + "integrity": "sha512-g/OU/MeWGfHDygoXgMWfG/Xb0QqDnAGcM9t2FRrVAhleXYRddGOEnfanR5cmHgB9ue52MJsyorqFjckzXsylaA==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.11.tgz", - "integrity": "sha512-p9IK4uvwT6B3pT1VGlODvcVBfPVikjBFHAcKpvvNF+7lAEI+YiC6d0SROPkpjnvCgVBYyGXa3ciqrWnFze6mwQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.14.tgz", + "integrity": "sha512-41wmYE9smDGJi1ZXp+LogH6BR7MkSsQD91wneIFISF/mupKULvoOJUkv/Nf0NMRxWlM3Bf1Vvi9FlR2oV4KU8Q==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/eventstream-serde-universal": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5764,11 +5294,11 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.11.tgz", - "integrity": "sha512-vN32E8yExo0Z8L7kXhlU9KRURrhqOpPdLxQMp3MwfMThrjiqbr1Sk5srUXc1ed2Ygl/l0TEN9vwNG0bQHg6AjQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.14.tgz", + "integrity": "sha512-43IyRIzQ82s+5X+t/3Ood00CcWtAXQdmUIUKMed2Qg9REPk8SVIHhpm3rwewLwg+3G2Nh8NOxXlEQu6DsPUcMw==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5776,12 +5306,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.11.tgz", - "integrity": "sha512-Gjqbpg7UmD+YzkpgNShNcDNZcUpBWIkvX2XCGptz5PoxJU/UQbuF9eSc93ZlIb7j4aGjtFfqk23HUMW8Hopg2Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.14.tgz", + "integrity": "sha512-jVh9E2qAr6DxH5tWfCAl9HV6tI0pEQ3JVmu85JknDvYTC66djcjDdhctPV2EHuKWf2kjRiFJcMIn0eercW4THA==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/eventstream-serde-universal": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5789,12 +5319,12 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.11.tgz", - "integrity": "sha512-F8FsxLTbFN4+Esgpo+nNKcEajrgRZJ+pG9c8+MhLM4Odp5ejLHw2GMCXd81cGsgmfcbnzdDEXazPPVzOwj89MQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.14.tgz", + "integrity": "sha512-Ie35+AISNn1NmEjn5b2SchIE49pvKp4Q74bE9ME5RULWI1MgXyGkQUajWd5E6OBSr/sqGcs+rD3IjPErXnCm9g==", "dependencies": { - "@smithy/eventstream-codec": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/eventstream-codec": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5802,36 +5332,36 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.3.tgz", - "integrity": "sha512-0G9sePU+0R+8d7cie+OXzNbbkjnD4RfBlVCs46ZEuQAMcxK8OniemYXSSkOc80CCk8Il4DnlYZcUSvsIs2OB2w==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.7.tgz", + "integrity": "sha512-iSDBjxuH9TgrtMYAr7j5evjvkvgwLY3y+9D547uep+JNkZ1ZT+BaeU20j6I/bO/i26ilCWFImrlXTPsfQtZdIQ==", "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", + "@smithy/protocol-http": "^3.0.10", + "@smithy/querystring-builder": "^2.0.14", + "@smithy/types": "^2.6.0", + "@smithy/util-base64": "^2.0.1", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-blob-browser": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.11.tgz", - "integrity": "sha512-/6vq/NiH2EN3mWdwcLdjVohP+VCng+ZA1GnlUdx959egsfgIlLWQvCyjnB2ze9Hr6VHV5XEFLLpLQH2dHA6Sgw==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.15.tgz", + "integrity": "sha512-HX/7GIyPUT/HDWVYe2HYQu0iRnSYpF4uZVNhAhZsObPRawk5Mv0PbyluBgIFI2DDCCKgL/tloCYYwycff1GtQg==", "dependencies": { "@smithy/chunked-blob-reader": "^2.0.0", - "@smithy/chunked-blob-reader-native": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/chunked-blob-reader-native": "^2.0.1", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.11.tgz", - "integrity": "sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.16.tgz", + "integrity": "sha512-Wbi9A0PacMYUOwjAulQP90Wl3mQ6NDwnyrZQzFjDz+UzjXOSyQMgBrTkUBz+pVoYVlX3DUu24gWMZBcit+wOGg==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -5839,12 +5369,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.11.tgz", - "integrity": "sha512-Jn2yl+Dn0kvwKvSavvR1/BFVYa2wIkaJKWeTH48kno89gqHAJxMh1hrtBN6SJ7F8VhodNZTiNOlQVqCSfLheNQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.16.tgz", + "integrity": "sha512-4x24GFdeWos1Z49MC5sYdM1j+z32zcUr6oWM9Ggm3WudFAcRIcbG9uDQ1XgJ0Kl+ZTjpqLKniG0iuWvQb2Ud1A==", "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-utf8": "^2.0.0", + "@smithy/types": "^2.6.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -5852,11 +5382,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.11.tgz", - "integrity": "sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.14.tgz", + "integrity": "sha512-d8ohpwZo9RzTpGlAfsWtfm1SHBSU7+N4iuZ6MzR10xDTujJJWtmXYHK1uzcr7rggbpUTaWyHpPFgnf91q0EFqQ==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" } }, @@ -5872,22 +5402,22 @@ } }, "node_modules/@smithy/md5-js": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.11.tgz", - "integrity": "sha512-YBIv+e95qeGvQA05ucwstmTeQ/bUzWgU+nO2Ffmif5awu6IzSR0Jfk3XLYh4mdy7f8DCgsn8qA63u7N9Lu0+5A==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.16.tgz", + "integrity": "sha512-YhWt9aKl+EMSNXyUTUo7I01WHf3HcCkPu/Hl2QmTNwrHT49eWaY7hptAMaERZuHFH0V5xHgPKgKZo2I93DFtgQ==", "dependencies": { - "@smithy/types": "^2.3.5", - "@smithy/util-utf8": "^2.0.0", + "@smithy/types": "^2.6.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.13.tgz", - "integrity": "sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.16.tgz", + "integrity": "sha512-9ddDia3pp1d3XzLXKcm7QebGxLq9iwKf+J1LapvlSOhpF8EM9SjMeSrMOOFgG+2TfW5K3+qz4IAJYYm7INYCng==", "dependencies": { - "@smithy/protocol-http": "^3.0.7", - "@smithy/types": "^2.3.5", + "@smithy/protocol-http": "^3.0.10", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5895,16 +5425,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.2.tgz", - "integrity": "sha512-dua4r2EbSTRzNefz72snz+KDuXN73RCe1K+rGeemzUyYemxuh1jujFbLQbTU6DVlTgHkhtrbH0+kdOFY/SV4Qg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.1.tgz", + "integrity": "sha512-dVDS7HNJl/wb0lpByXor6whqDbb1YlLoaoWYoelyYzLHioXOE7y/0iDwJWtDcN36/tVCw9EPBFZ3aans84jLpg==", "dependencies": { - "@smithy/middleware-serde": "^2.0.11", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/shared-ini-file-loader": "^2.2.1", - "@smithy/types": "^2.3.5", - "@smithy/url-parser": "^2.0.11", - "@smithy/util-middleware": "^2.0.4", + "@smithy/middleware-serde": "^2.0.14", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/shared-ini-file-loader": "^2.2.5", + "@smithy/types": "^2.6.0", + "@smithy/url-parser": "^2.0.14", + "@smithy/util-middleware": "^2.0.7", "tslib": "^2.5.0" }, "engines": { @@ -5912,16 +5442,16 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.17.tgz", - "integrity": "sha512-ZYVU1MmshCTbEKTNc5h7/Pps1vhH5C7hRclQWnAbVYKkIT+PEGu9dSVqprzEo/nlMA8Zv4Dj5Y+fv3pRnUwElw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.21.tgz", + "integrity": "sha512-EZS1EXv1k6IJX6hyu/0yNQuPcPaXwG8SWljQHYueyRbOxmqYgoWMWPtfZj0xRRQ4YtLawQSpBgAeiJltq8/MPw==", "dependencies": { - "@smithy/node-config-provider": "^2.1.2", - "@smithy/protocol-http": "^3.0.7", - "@smithy/service-error-classification": "^2.0.4", - "@smithy/types": "^2.3.5", - "@smithy/util-middleware": "^2.0.4", - "@smithy/util-retry": "^2.0.4", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/protocol-http": "^3.0.10", + "@smithy/service-error-classification": "^2.0.7", + "@smithy/types": "^2.6.0", + "@smithy/util-middleware": "^2.0.7", + "@smithy/util-retry": "^2.0.7", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -5930,11 +5460,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.11.tgz", - "integrity": "sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.14.tgz", + "integrity": "sha512-hFi3FqoYWDntCYA2IGY6gJ6FKjq2gye+1tfxF2HnIJB5uW8y2DhpRNBSUMoqP+qvYzRqZ6ntv4kgbG+o3pX57g==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5942,11 +5472,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.5.tgz", - "integrity": "sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.8.tgz", + "integrity": "sha512-7/N59j0zWqVEKExJcA14MrLDZ/IeN+d6nbkN8ucs+eURyaDUXWYlZrQmMOd/TyptcQv0+RDlgag/zSTTV62y/Q==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5954,13 +5484,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.2.tgz", - "integrity": "sha512-tbYh/JK/ddxKWYTtjLgap0juyivJ0wCvywMqINb54zyOVHoKYM6iYl7DosQA0owFaNp6GAx1lXFjqGz7L2fAqA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.6.tgz", + "integrity": "sha512-HLqTs6O78m3M3z1cPLFxddxhEPv5MkVatfPuxoVO3A+cHZanNd/H5I6btcdHy6N2CB1MJ/lihJC92h30SESsBA==", "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/shared-ini-file-loader": "^2.2.1", - "@smithy/types": "^2.3.5", + "@smithy/property-provider": "^2.0.15", + "@smithy/shared-ini-file-loader": "^2.2.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5968,14 +5498,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.7.tgz", - "integrity": "sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.10.tgz", + "integrity": "sha512-lkALAwtN6odygIM4nB8aHDahINM6WXXjNrZmWQAh0RSossySRT2qa31cFv0ZBuAYVWeprskRk13AFvvLmf1WLw==", "dependencies": { - "@smithy/abort-controller": "^2.0.11", - "@smithy/protocol-http": "^3.0.7", - "@smithy/querystring-builder": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/abort-controller": "^2.0.14", + "@smithy/protocol-http": "^3.0.10", + "@smithy/querystring-builder": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5983,11 +5513,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.12.tgz", - "integrity": "sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==", + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.15.tgz", + "integrity": "sha512-YbRFBn8oiiC3o1Kn3a4KjGa6k47rCM9++5W9cWqYn9WnkyH+hBWgfJAckuxpyA2Hq6Ys4eFrWzXq6fqHEw7iew==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -5995,11 +5525,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.7.tgz", - "integrity": "sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", + "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6007,11 +5537,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.11.tgz", - "integrity": "sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.14.tgz", + "integrity": "sha512-lQ4pm9vTv9nIhl5jt6uVMPludr6syE2FyJmHsIJJuOD7QPIJnrf9HhUGf1iHh9KJ4CUv21tpOU3X6s0rB6uJ0g==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -6020,11 +5550,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", - "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.14.tgz", + "integrity": "sha512-+cbtXWI9tNtQjlgQg3CA+pvL3zKTAxPnG3Pj6MP89CR3vi3QMmD0SOWoq84tqZDnJCxlsusbgIXk1ngMReXo+A==", "dependencies": { - "@smithy/types": "^2.4.0", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6032,22 +5562,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.4.tgz", - "integrity": "sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.7.tgz", + "integrity": "sha512-LLxgW12qGz8doYto15kZ4x1rHjtXl0BnCG6T6Wb8z2DI4PT9cJfOSvzbuLzy7+5I24PAepKgFeWHRd9GYy3Z9w==", "dependencies": { - "@smithy/types": "^2.3.5" + "@smithy/types": "^2.6.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.1.tgz", - "integrity": "sha512-eAYajwo2eTTVU5KPX90+V6ccfrWphrzcUwOt7n9pLOMBO0fOKlRVshbvCBqfRCxEn7OYDGH6TsL3yrx+hAjddA==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.5.tgz", + "integrity": "sha512-LHA68Iu7SmNwfAVe8egmjDCy648/7iJR/fK1UnVw+iAOUJoEYhX2DLgVd5pWllqdDiRbQQzgaHLcRokM+UFR1w==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6055,17 +5585,17 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.11.tgz", - "integrity": "sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.16.tgz", + "integrity": "sha512-ilLY85xS2kZZzTb83diQKYLIYALvart0KnBaKnIRnMBHAGEio5aHSlANQoxVn0VsonwmQ3CnWhnCT0sERD8uTg==", "dependencies": { - "@smithy/eventstream-codec": "^2.0.11", + "@smithy/eventstream-codec": "^2.0.14", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.4", + "@smithy/util-middleware": "^2.0.7", "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -6073,13 +5603,13 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.11.tgz", - "integrity": "sha512-okjMbuBBCTiieK665OFN/ap6u9+Z9z55PMphS5FYCsS6Zfp137Q3qlnt0OgBAnUVnH/mNGyoJV0LBX9gkTWptg==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.16.tgz", + "integrity": "sha512-Lw67+yQSpLl4YkDLUzI2KgS8TXclXmbzSeOJUmRFS4ueT56B4pw3RZRF/SRzvgyxM/HxgkUan8oSHXCujPDafQ==", "dependencies": { - "@smithy/middleware-stack": "^2.0.5", - "@smithy/types": "^2.3.5", - "@smithy/util-stream": "^2.0.16", + "@smithy/middleware-stack": "^2.0.8", + "@smithy/types": "^2.6.0", + "@smithy/util-stream": "^2.0.21", "tslib": "^2.5.0" }, "engines": { @@ -6087,9 +5617,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", - "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.6.0.tgz", + "integrity": "sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==", "dependencies": { "tslib": "^2.5.0" }, @@ -6098,19 +5628,19 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", - "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.14.tgz", + "integrity": "sha512-kbu17Y1AFXi5lNlySdDj7ZzmvupyWKCX/0jNZ8ffquRyGdbDZb+eBh0QnWqsSmnZa/ctyWaTf7n4l/pXLExrnw==", "dependencies": { - "@smithy/querystring-parser": "^2.0.12", - "@smithy/types": "^2.4.0", + "@smithy/querystring-parser": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", - "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", + "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", "dependencies": { "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" @@ -6162,13 +5692,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.15.tgz", - "integrity": "sha512-2raMZOYKSuke7QlDg/HDcxQdrp0zteJ8z+S0B9Rn23J55ZFNK1+IjG4HkN6vo/0u3Xy/JOdJ93ibiBSB8F7kOw==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.20.tgz", + "integrity": "sha512-QJtnbTIl0/BbEASkx1MUFf6EaoWqWW1/IM90N++8NNscePvPf77GheYfpoPis6CBQawUWq8QepTP2QUSAdrVkw==", "dependencies": { - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@smithy/property-provider": "^2.0.15", + "@smithy/smithy-client": "^2.1.16", + "@smithy/types": "^2.6.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -6177,22 +5707,35 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.20.tgz", - "integrity": "sha512-kJjcZ/Lzvs3sPDKBwlhZsFFcgPNIpB3CMb6/saCakawRzo0E+JkyS3ZZRjVR3ce29yHtwoP/0YLKC1PeH0Dffg==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.26.tgz", + "integrity": "sha512-lGFPOFCHv1ql019oegYqa54BZH7HREw6EBqjDLbAr0wquMX0BDi2sg8TJ6Eq+JGLijkZbJB73m4+aK8OFAapMg==", "dependencies": { - "@smithy/config-resolver": "^2.0.15", - "@smithy/credential-provider-imds": "^2.0.17", - "@smithy/node-config-provider": "^2.1.2", - "@smithy/property-provider": "^2.0.12", - "@smithy/smithy-client": "^2.1.11", - "@smithy/types": "^2.3.5", + "@smithy/config-resolver": "^2.0.19", + "@smithy/credential-provider-imds": "^2.1.2", + "@smithy/node-config-provider": "^2.1.6", + "@smithy/property-provider": "^2.0.15", + "@smithy/smithy-client": "^2.1.16", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, + "node_modules/@smithy/util-endpoints": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.5.tgz", + "integrity": "sha512-K7qNuCOD5K/90MjHvHm9kJldrfm40UxWYQxNEShMFxV/lCCCRIg8R4uu1PFAxRvPxNpIdcrh1uK6I1ISjDXZJw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.6", + "@smithy/types": "^2.6.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@smithy/util-hex-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", @@ -6205,11 +5748,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.4.tgz", - "integrity": "sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.7.tgz", + "integrity": "sha512-tRINOTlf1G9B0ECarFQAtTgMhpnrMPSa+5j4ZEwEawCLfTFTavk6757sxhE4RY5RMlD/I3x+DCS8ZUiR8ho9Pw==", "dependencies": { - "@smithy/types": "^2.3.5", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6217,12 +5760,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.4.tgz", - "integrity": "sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.7.tgz", + "integrity": "sha512-fIe5yARaF0+xVT1XKcrdnHKTJ1Vc4+3e3tLDjCuIcE9b6fkBzzGFY7AFiX4M+vj6yM98DrwkuZeHf7/hmtVp0Q==", "dependencies": { - "@smithy/service-error-classification": "^2.0.4", - "@smithy/types": "^2.3.5", + "@smithy/service-error-classification": "^2.0.7", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6230,17 +5773,17 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.16.tgz", - "integrity": "sha512-b5ZSRh1KzUzC7LoJcpfk7+iXGoRr3WylEfmPd4FnBLm90OwxSB9VgK1fDZwicfYxSEvWHdYXgvvjPtenEYBBhw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.21.tgz", + "integrity": "sha512-0BUE16d7n1x7pi1YluXJdB33jOTyBChT0j/BlOkFa9uxfg6YqXieHxjHNuCdJRARa7AZEj32LLLEPJ1fSa4inA==", "dependencies": { - "@smithy/fetch-http-handler": "^2.2.3", - "@smithy/node-http-handler": "^2.1.7", - "@smithy/types": "^2.3.5", - "@smithy/util-base64": "^2.0.0", + "@smithy/fetch-http-handler": "^2.2.7", + "@smithy/node-http-handler": "^2.1.10", + "@smithy/types": "^2.6.0", + "@smithy/util-base64": "^2.0.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.0", + "@smithy/util-utf8": "^2.0.2", "tslib": "^2.5.0" }, "engines": { @@ -6259,9 +5802,9 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", - "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", + "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", "dependencies": { "@smithy/util-buffer-from": "^2.0.0", "tslib": "^2.5.0" @@ -6271,12 +5814,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.11.tgz", - "integrity": "sha512-8SJWUl9O1YhjC77EccgltI3q4XZQp3vp9DGEW6o0OdkUcwqm/H4qOLnMkA2n+NDojuM5Iia2jWoCdbluIiG7TA==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.14.tgz", + "integrity": "sha512-Q6gSz4GUNjNGhrfNg+2Mjy+7K4pEI3r82x1b/+3dSc03MQqobMiUrRVN/YK/4nHVagvBELCoXsiHAFQJNQ5BeA==", "dependencies": { - "@smithy/abort-controller": "^2.0.11", - "@smithy/types": "^2.3.5", + "@smithy/abort-controller": "^2.0.14", + "@smithy/types": "^2.6.0", "tslib": "^2.5.0" }, "engines": { @@ -6373,13 +5916,13 @@ } }, "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.2.0.tgz", - "integrity": "sha512-YBepjbt+ZNBVmN3ev1amQH3lWCmHyt5qTbLCp/syXJRu/Kw2koXh44qayB1gMRxcL/gV8egmjN5xWSrYyfUtyw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", + "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", "dependencies": { "@babel/generator": "7.17.7", "@babel/parser": "^7.20.5", - "@babel/traverse": "7.17.3", + "@babel/traverse": "7.23.2", "@babel/types": "7.17.0", "javascript-natural-sort": "0.7.1", "lodash": "^4.17.21" @@ -6395,20 +5938,20 @@ } }, "node_modules/@trpc/client": { - "version": "10.40.0", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-10.40.0.tgz", - "integrity": "sha512-bT6BcdWjj0KzGQiimE6rB2tIaRYX0Ear4Gthb5szN/c01wrP0yC1Fbz2uCcm/QTVAwu4Lve5M+YjPoEaTHG6lg==", + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-10.44.1.tgz", + "integrity": "sha512-vTWsykNcgz1LnwePVl2fKZnhvzP9N3GaaLYPkfGINo314ZOS0OBqe9x0ytB2LLUnRVTAAZ2WoONzARd8nHiqrA==", "funding": [ "https://trpc.io/sponsor" ], "peerDependencies": { - "@trpc/server": "10.40.0" + "@trpc/server": "10.44.1" } }, "node_modules/@trpc/next": { - "version": "10.40.0", - "resolved": "https://registry.npmjs.org/@trpc/next/-/next-10.40.0.tgz", - "integrity": "sha512-GMOiN+2DIfUXxS2DuTuTT3FOzkuB5p6+1QglY5M9ywKFWBVTGkBnbLkTgoPGuglq+dPfcZbcSajRN22AUv5Qtg==", + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/next/-/next-10.44.1.tgz", + "integrity": "sha512-ez2oYUzmaQ+pGch627sRBfeEk3h+UIwNicR8WjTAM54TPcdP5W9ZyWCyO5HZTEfjHgGixYM4tCIxewdKOWY9yA==", "funding": [ "https://trpc.io/sponsor" ], @@ -6417,36 +5960,39 @@ }, "peerDependencies": { "@tanstack/react-query": "^4.18.0", - "@trpc/client": "10.40.0", - "@trpc/react-query": "10.40.0", - "@trpc/server": "10.40.0", + "@trpc/client": "10.44.1", + "@trpc/react-query": "10.44.1", + "@trpc/server": "10.44.1", "next": "*", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@trpc/react-query": { - "version": "10.40.0", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-10.40.0.tgz", - "integrity": "sha512-DpJrV3lmYNo9xtPtcg49lfh9CUFap3ZivjhlSmfe4QPf7H6xBjAE+ml4OdJ0RmKvSTFvbLSOiNdB1k5O8zIdzQ==", + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-10.44.1.tgz", + "integrity": "sha512-Sgi/v0YtdunOXjBRi7om9gILGkOCFYXPzn5KqLuEHiZw5dr5w4qGHFwCeMAvndZxmwfblJrl1tk2AznmsVu8MA==", "funding": [ "https://trpc.io/sponsor" ], "peerDependencies": { "@tanstack/react-query": "^4.18.0", - "@trpc/client": "10.40.0", - "@trpc/server": "10.40.0", + "@trpc/client": "10.44.1", + "@trpc/server": "10.44.1", "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "node_modules/@trpc/server": { - "version": "10.40.0", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-10.40.0.tgz", - "integrity": "sha512-49SUOMWzSZtu5+OdrADmJD+u+sjSE0qj1cWgYk2FY4jLkPJunLuNRuhzM7aOeBhiUjyfhg2YTfur8FN1WBmvEw==", + "version": "10.44.1", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-10.44.1.tgz", + "integrity": "sha512-mF7B+K6LjuboX8I1RZgKE5GA/fJhsJ8tKGK2UBt3Bwik7hepEPb4NJgNr7vO6BK5IYwPdBLRLTctRw6XZx0sRg==", "funding": [ "https://trpc.io/sponsor" - ] + ], + "engines": { + "node": ">=18.0.0" + } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", @@ -6481,85 +6027,85 @@ } }, "node_modules/@types/bcrypt": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.1.tgz", - "integrity": "sha512-dIIrEsLV1/v0AUNI8oHMaRRTSeVjoy5ID8oclJavtPj8CwPJoD1eFoNXEypuu6k091brEzBeOo3LlxeAH9zRZg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", + "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/d3-array": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.9.tgz", - "integrity": "sha512-mZowFN3p64ajCJJ4riVYlOjNlBJv3hctgAY01pjw3qTnJePD8s9DZmYDzhHKvzfCYvdjwylkU38+Vdt7Cu2FDA==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" }, "node_modules/@types/d3-color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.2.tgz", - "integrity": "sha512-At+Ski7dL8Bs58E8g8vPcFJc8tGcaC12Z4m07+p41+DRqnZQcAlp3NfYjLrhNYv+zEyQitU1CUxXNjqUyf+c0g==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, "node_modules/@types/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-VZofjpEt8HWv3nxUAosj5o/+4JflnJ7Bbv07k17VO3T2WRuzGdZeookfaF60iVh5RdhVG49LE5w6LIshVUC6rg==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, "node_modules/@types/d3-interpolate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.3.tgz", - "integrity": "sha512-6OZ2EIB4lLj+8cUY7I/Cgn9Q+hLdA4DjJHYOQDiHL0SzqS1K9DL5xIOVBSIHgF+tiuO9MU1D36qvdIvRDRPh+Q==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.1.tgz", - "integrity": "sha512-blRhp7ki7pVznM8k6lk5iUU9paDbVRVq+/xpf0RRgSJn5gr6SE7RcFtxooYGMBOc1RZiGyqRpVdu5AD0z0ooMA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==" }, "node_modules/@types/d3-scale": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.6.tgz", - "integrity": "sha512-lo3oMLSiqsQUovv8j15X4BNEDOsnHuGjeVg7GRbAuB2PUa1prK5BNSOu6xixgNf3nqxPl4I1BqJWrPvFGlQoGQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.4.tgz", - "integrity": "sha512-M2/xsWPsjaZc5ifMKp1EBp0gqJG0eO/zlldJNOC85Y/5DGsBQ49gDkRJ2h5GY7ZVD6KUumvZWsylSbvTaJTqKg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.2.tgz", - "integrity": "sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" }, "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/debug": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", - "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/estree-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.1.tgz", - "integrity": "sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", + "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", "dependencies": { "@types/estree": "*" } @@ -6574,9 +6120,9 @@ } }, "node_modules/@types/hast": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.6.tgz", - "integrity": "sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.8.tgz", + "integrity": "sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==", "dependencies": { "@types/unist": "^2" } @@ -6592,34 +6138,34 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/luxon": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.2.tgz", - "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.5.tgz", + "integrity": "sha512-1cyf6Ge/94zlaWIZA2ei1pE6SZ8xpad2hXaYa5JEFiaUH0YS494CZwyi4MXNpXD9oEuv6ZH0Bmh0e7F9sPhmZA==", "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.13.tgz", - "integrity": "sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dependencies": { "@types/unist": "^2" } }, "node_modules/@types/mdx": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.8.tgz", - "integrity": "sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", + "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==" }, "node_modules/@types/minimist": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", - "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/ms": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", - "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==" + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { "version": "20.5.1", @@ -6627,27 +6173,27 @@ "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" }, "node_modules/@types/node-forge": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.7.tgz", - "integrity": "sha512-uWvTDObXqNQPVprvvm7FCS/B0qexgRMmNCJCRETywf7cBm3C7uGRtGfaSqCoUlksrmY5Yn3++fvA7awBE5lAzw==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", + "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/nodemailer": { - "version": "6.4.11", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.11.tgz", - "integrity": "sha512-Ld2c0frwpGT4VseuoeboCXQ7UJIkK3X7Lx/4YsZEiUHtHsthWAOCYtf6PAiLhMtfwV0cWJRabLBS3+LD8x6Nrw==", + "version": "6.4.14", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.14.tgz", + "integrity": "sha512-fUWthHO9k9DSdPCSPRqcu6TWhYyxTBg382vlNIttSe9M7XfsT06y0f24KHXtbnijPGGRIcVvdKHTNikOI6qiHA==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", - "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" }, "node_modules/@types/parse5": { "version": "6.0.3", @@ -6655,14 +6201,16 @@ "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "devOptional": true }, "node_modules/@types/react": { "version": "18.2.18", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.18.tgz", "integrity": "sha512-da4NTSeBv/P34xoZPhtcLkmZuJ+oYaCxHmyHzwaDQo9RQPBeXV+06gEk2FpqEcsX9XrnNLvRpVh6bdavDSjtiQ==", + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -6679,53 +6227,88 @@ } }, "node_modules/@types/resolve": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.3.tgz", - "integrity": "sha512-NH5oErHOtHZYcjCtg69t26aXEk4BN2zLWqf7wnDZ+dpe0iR7Rds1SPGEItl3fca21oOe0n3OCnZ4W7jBxu7FOw==" + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==" }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "devOptional": true }, "node_modules/@types/semver": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.5.tgz", - "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==" + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==" }, "node_modules/@types/unist": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.8.tgz", - "integrity": "sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@types/ws": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", - "integrity": "sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", + "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/type-utils": "6.8.0", + "@typescript-eslint/utils": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", + "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.8.0", + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/typescript-estree": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -6734,16 +6317,15 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", + "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.8.0", + "@typescript-eslint/visitor-keys": "6.8.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -6776,7 +6358,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", @@ -6788,7 +6370,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", @@ -6814,62 +6396,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/utils": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", @@ -6894,61 +6420,7 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", @@ -6964,29 +6436,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@upstash/redis": { - "version": "1.23.4", - "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.23.4.tgz", - "integrity": "sha512-7KtG6RE5W7QbByDjQq7cEpwG2ir46VrEXZ8NFRn17FYSJUHKeHl6qnAqQJIR5rAItQWtyrKNYBij5IGEjUevhA==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@upstash/redis/-/redis-1.25.1.tgz", + "integrity": "sha512-ACj0GhJ4qrQyBshwFgPod6XufVEfKX2wcaihsEvSdLYnY+m+pa13kGt1RXm/yTHKf4TQi/Dy2A8z/y6WUEOmlg==", "dependencies": { - "isomorphic-fetch": "^3.0.0" + "crypto-js": "^4.2.0" } }, "node_modules/abbrev": { @@ -6995,9 +6455,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "bin": { "acorn": "bin/acorn" }, @@ -7014,9 +6474,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "devOptional": true, "engines": { "node": ">=0.4.0" @@ -7132,19 +6592,6 @@ "node": ">=10" } }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", @@ -7322,9 +6769,9 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" }, "node_modules/astring": { "version": "1.8.6", @@ -7403,34 +6850,36 @@ } }, "node_modules/aws-crt": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.18.1.tgz", - "integrity": "sha512-VUUmO4wi5EUb86kNNvu7GLHvCRwQzD5uV/pYuLuQvIhdN75/IjI5ManejKZjhxmFKkuJAfk5BmxR4oFIFlKDxg==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.19.0.tgz", + "integrity": "sha512-pBRSpy4TsL/fxW7Lp1xpN1FhnxvtBXFYx3Njo/j/m8GSV3Ytq/mBetYq7vhDb7CJQmFJCWod9I0yShqjiSUuyQ==", "hasInstallScript": true, "dependencies": { "@aws-sdk/util-utf8-browser": "^3.109.0", - "@httptoolkit/websocket-stream": "^6.0.0", - "axios": "^0.24.0", + "@httptoolkit/websocket-stream": "^6.0.1", + "axios": "^1.6.0", "buffer": "^6.0.3", - "crypto-js": "^4.0.0", + "crypto-js": "^4.2.0", "mqtt": "^4.3.7", "process": "^0.11.10" } }, "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { @@ -7498,9 +6947,9 @@ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "engines": { "node": ">=0.6" } @@ -7558,19 +7007,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -7720,12 +7156,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7783,9 +7220,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001549", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", - "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", + "version": "1.0.30001564", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", + "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", "funding": [ { "type": "opencollective", @@ -7816,41 +7253,6 @@ "node": ">=6" } }, - "node_modules/canvas/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/canvas/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/canvas/node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -7975,11 +7377,6 @@ "url": "https://joebell.co.uk" } }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, "node_modules/cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -8493,19 +7890,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/condense-newlines": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", @@ -8707,9 +8091,9 @@ } }, "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/cssesc": { "version": "3.0.0", @@ -8725,7 +8109,8 @@ "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "devOptional": true }, "node_modules/d3-array": { "version": "3.2.4", @@ -8859,6 +8244,22 @@ "node": ">= 12" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -8927,17 +8328,15 @@ } }, "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, "dependencies": { - "mimic-response": "^3.1.0" + "mimic-response": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/deep-extend": { @@ -9245,6 +8644,38 @@ "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -9256,11 +8687,42 @@ "stream-shift": "^1.0.0" } }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/editorconfig": { "version": "1.0.4", @@ -9310,9 +8772,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.557", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz", - "integrity": "sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw==" + "version": "1.4.593", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.593.tgz", + "integrity": "sha512-c7+Hhj87zWmdpmjDONbvNKNo24tvmD4mjal1+qqTYTrlF0/sNpAcDlU0Ki84ftA/5yj3BF2QhSGEC0Rky6larg==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -9359,25 +8821,25 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -9387,7 +8849,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -9401,7 +8863,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9432,24 +8894,24 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -9524,17 +8986,18 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.54.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", + "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.3", + "@eslint/js": "8.54.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -9587,7 +9050,129 @@ "eslint-plugin-react": "7.28.0" } }, - "node_modules/eslint-config-next": { + "node_modules/eslint-config-custom/node_modules/@next/eslint-plugin-next": { + "version": "12.3.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-12.3.4.tgz", + "integrity": "sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/eslint-config-custom/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-custom/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-custom/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-custom/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-custom/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-custom/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-config-next": { "version": "12.3.4", "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-12.3.4.tgz", "integrity": "sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==", @@ -9613,19 +9198,7 @@ } } }, - "node_modules/eslint-config-next/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-config-next/node_modules/eslint-plugin-react": { + "node_modules/eslint-config-custom/node_modules/eslint-config-next/node_modules/eslint-plugin-react": { "version": "7.33.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", @@ -9655,7 +9228,7 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-config-next/node_modules/resolve": { + "node_modules/eslint-config-custom/node_modules/eslint-config-next/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", @@ -9672,7 +9245,7 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-next/node_modules/semver": { + "node_modules/eslint-config-custom/node_modules/eslint-config-next/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -9681,6 +9254,125 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-config-custom/node_modules/eslint-import-resolver-typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", + "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "glob": "^7.2.0", + "is-glob": "^4.0.3", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-import-resolver-typescript/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-plugin-react": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", + "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flatmap": "^1.2.5", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.0.4", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.0", + "object.values": "^1.1.5", + "prop-types": "^15.7.2", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-config-custom/node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-config-next": { + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", + "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", + "dependencies": { + "@next/eslint-plugin-next": "13.4.19", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/eslint-config-prettier": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", @@ -9693,11 +9385,11 @@ } }, "node_modules/eslint-config-turbo": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.15.tgz", - "integrity": "sha512-76mpx2x818JZE26euen14utYcFDxOahZ9NaWA+6Xa4pY2ezVKVschuOxS96EQz3o3ZRSmcgBOapw/gHbN+EKxQ==", + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.16.tgz", + "integrity": "sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==", "dependencies": { - "eslint-plugin-turbo": "1.10.15" + "eslint-plugin-turbo": "1.10.16" }, "peerDependencies": { "eslint": ">6.6.0" @@ -9722,45 +9414,29 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", - "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", - "dev": true, + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dependencies": { "debug": "^4.3.4", - "glob": "^7.2.0", - "is-glob": "^4.0.3", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*" } }, - "node_modules/eslint-import-resolver-typescript/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -9786,25 +9462,25 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -9843,26 +9519,26 @@ } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" @@ -9871,14 +9547,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-package-json": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/eslint-plugin-package-json/-/eslint-plugin-package-json-0.1.5.tgz", @@ -9916,25 +9584,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", - "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", - "dev": true, + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -9958,7 +9627,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -9970,7 +9638,6 @@ "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -9987,15 +9654,14 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-turbo": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.15.tgz", - "integrity": "sha512-Tv4QSKV/U56qGcTqS/UgOvb9HcKFmWOQcVh3HEaj7of94lfaENgfrtK48E2CckQf7amhKs1i+imhCsNCKjkQyA==", + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.16.tgz", + "integrity": "sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==", "dependencies": { "dotenv": "16.0.3" }, @@ -10011,6 +9677,26 @@ "node": ">=12" } }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", + "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, "node_modules/eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", @@ -10336,9 +10022,9 @@ } }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10482,16 +10168,16 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { @@ -10544,7 +10230,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -10560,7 +10245,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -10627,9 +10311,9 @@ } }, "node_modules/framer-motion": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", - "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", + "version": "10.16.5", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.5.tgz", + "integrity": "sha512-GEzVjOYP2MIpV9bT/GbhcsBNoImG3/2X3O/xVNWmktkv9MdJ7P/44zELm/7Fjb+O3v39SmKFnoDQB32giThzpg==", "dependencies": { "tslib": "^2.4.0" }, @@ -10840,14 +10524,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11102,14 +10786,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -11135,11 +10811,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11187,9 +10863,20 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/hash-wasm": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.10.0.tgz", - "integrity": "sha512-a0NjBNWjavvMalm/pPSEJ00MPDjRG8rv9D5BK7dBQTLGwAOVWqnTEUggaYs5szATB5UK5ULeIQr7QJXbczAZYA==" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/hash-wasm/-/hash-wasm-4.11.0.tgz", + "integrity": "sha512-HVusNXlVqHe0fzIzdQOGolnFN6mX/fqcrSAOcTBXdvzrXVHwTz11vXeKRmkR5gTuwVpvHZEIyKoePDvuAR+XwQ==" + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/hast-util-from-parse5": { "version": "7.1.2", @@ -11342,19 +11029,6 @@ "readable-stream": "^3.6.0" } }, - "node_modules/help-me/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -11375,29 +11049,6 @@ "node": ">=10" } }, - "node_modules/html-dom-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-4.0.0.tgz", - "integrity": "sha512-TUa3wIwi80f5NF8CVWzkopBVqVAtlawUzJoLwVLHns0XSJGynss4jiY0mTWpiDOsuyw+afP+ujjMgRh9CoZcXw==", - "dependencies": { - "domhandler": "5.0.3", - "htmlparser2": "9.0.0" - } - }, - "node_modules/html-react-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.0.0.tgz", - "integrity": "sha512-OzlOavs9lLyBxoRiXbXfODIX/nSShukMtdx3+WSMjon/FF1gJZRq0rBELoR5OswfbN56C0oKpAii7i3yzO/uVQ==", - "dependencies": { - "domhandler": "5.0.3", - "html-dom-parser": "4.0.0", - "react-property": "2.0.0", - "style-to-js": "1.1.3" - }, - "peerDependencies": { - "react": "0.14 || 15 || 16 || 17 || 18" - } - }, "node_modules/html-to-text": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", @@ -11413,7 +11064,16 @@ "node": ">=14" } }, - "node_modules/html-to-text/node_modules/htmlparser2": { + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", @@ -11431,33 +11091,6 @@ "entities": "^4.4.0" } }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", - "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.1.0", - "entities": "^4.5.0" - } - }, "node_modules/http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -11539,28 +11172,21 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "engines": { "node": ">= 4" } }, "node_modules/imagescript": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/imagescript/-/imagescript-1.2.16.tgz", - "integrity": "sha512-hhy8OVNymU+cYYj8IwCbdNlXJRoMr4HRd7+efkH32eBVfybVU/5SbzDYf3ZSiiF9ye/ghfBrI/ujec/nwl+fOQ==", + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/imagescript/-/imagescript-1.2.17.tgz", + "integrity": "sha512-gUibUVTqbd2AeakephgVshjTL9zqh7k4Ea9yk9z8O9jjn11qU3vQWbMRDWGVzQl1t/cLeHYjclefjx8HblXo9Q==", "engines": { "node": ">=14.0.0" } }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "optional": true, - "peer": true - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -11634,12 +11260,12 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -11795,11 +11421,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12134,9 +11760,9 @@ } }, "node_modules/is-what": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.15.tgz", - "integrity": "sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA==", + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "engines": { "node": ">=12.13" }, @@ -12153,43 +11779,15 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, - "node_modules/isomorphic-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -12214,7 +11812,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12234,9 +11831,9 @@ "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" }, "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", "bin": { "jiti": "bin/jiti.js" } @@ -12276,14 +11873,14 @@ } }, "node_modules/js-beautify": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.9.tgz", - "integrity": "sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==", + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.3", - "glob": "^8.1.0", - "nopt": "^6.0.0" + "glob": "^10.3.3", + "nopt": "^7.2.0" }, "bin": { "css-beautify": "js/bin/css-beautify.js", @@ -12291,7 +11888,15 @@ "js-beautify": "js/bin/js-beautify.js" }, "engines": { - "node": ">=12" + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/js-beautify/node_modules/brace-expansion": { @@ -12303,46 +11908,52 @@ } }, "node_modules/js-beautify/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/js-beautify/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/js-sdsl": { @@ -12498,11 +12109,14 @@ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" }, "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dependencies": { - "language-subtag-registry": "~0.3.2" + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/lazy-ass": { @@ -12954,17 +12568,17 @@ } }, "node_modules/luxon": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.3.tgz", - "integrity": "sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", "engines": { "node": ">=12" } }, "node_modules/make-cancellable-promise": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.1.tgz", - "integrity": "sha512-DWOzWdO3xhY5ESjVR+wVFy03rpt0ZccS4bunccNwngoX6rllKlMZm6S9ZnJ5nMuDDweqDMjtaO0g6tZeh+cCUA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", + "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", "funding": { "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" } @@ -12998,9 +12612,9 @@ "devOptional": true }, "node_modules/make-event-props": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.1.tgz", - "integrity": "sha512-JhvWq/iz1BvlmnPvLJjXv+xnMPJZuychrDC68V+yCGQJn5chcA8rLGKo5EP1XwIKVrigSXKLmbeXAGkf36wdCQ==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", "funding": { "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" } @@ -13287,14 +12901,19 @@ } }, "node_modules/merge-refs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.1.tgz", - "integrity": "sha512-pRPz39HQz2xzHdXAGvtJ9S8aEpNgpUjzb5yPC3ytozodmsHg+9nqgRs7/YOmn9fM/TLzntAC8AdGTidKxOq9TQ==", - "dependencies": { - "@types/react": "*" - }, + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.2.2.tgz", + "integrity": "sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==", "funding": { "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/merge-stream": { @@ -13949,11 +13568,12 @@ } }, "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14106,19 +13726,6 @@ "stream-shift": "^1.0.0" } }, - "node_modules/mqtt/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/mqtt/node_modules/ws": { "version": "7.5.9", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", @@ -14169,9 +13776,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -14222,11 +13829,11 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/next": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/next/-/next-14.0.0.tgz", - "integrity": "sha512-J0jHKBJpB9zd4+c153sair0sz44mbaCHxggs8ryVXSFBuBqJ8XdE9/ozoV85xGh2VnSjahwntBZZgsihL9QznA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/next/-/next-14.0.3.tgz", + "integrity": "sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==", "dependencies": { - "@next/env": "14.0.0", + "@next/env": "14.0.3", "@swc/helpers": "0.5.2", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -14241,15 +13848,15 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.0.0", - "@next/swc-darwin-x64": "14.0.0", - "@next/swc-linux-arm64-gnu": "14.0.0", - "@next/swc-linux-arm64-musl": "14.0.0", - "@next/swc-linux-x64-gnu": "14.0.0", - "@next/swc-linux-x64-musl": "14.0.0", - "@next/swc-win32-arm64-msvc": "14.0.0", - "@next/swc-win32-ia32-msvc": "14.0.0", - "@next/swc-win32-x64-msvc": "14.0.0" + "@next/swc-darwin-arm64": "14.0.3", + "@next/swc-darwin-x64": "14.0.3", + "@next/swc-linux-arm64-gnu": "14.0.3", + "@next/swc-linux-arm64-musl": "14.0.3", + "@next/swc-linux-x64-gnu": "14.0.3", + "@next/swc-linux-x64-musl": "14.0.3", + "@next/swc-win32-arm64-msvc": "14.0.3", + "@next/swc-win32-ia32-msvc": "14.0.3", + "@next/swc-win32-x64-msvc": "14.0.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -14267,9 +13874,9 @@ } }, "node_modules/next-auth": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.3.tgz", - "integrity": "sha512-n1EvmY7MwQMSOkCh6jhI6uBneB6VVtkYELVMEwVaCLD1mBD3IAAucwk+90kgxramW09nSp5drvynwfNCi1JjaQ==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.24.5.tgz", + "integrity": "sha512-3RafV3XbfIKk6rF6GlLE4/KxjTcuMCifqrmD+98ejFq73SRoj2rmzoca8u764977lH/Q7jo6Xu6yM+Re1Mz/Og==", "dependencies": { "@babel/runtime": "^7.20.13", "@panva/hkdf": "^1.0.2", @@ -14282,7 +13889,7 @@ "uuid": "^8.3.2" }, "peerDependencies": { - "next": "^12.2.5 || ^13", + "next": "^12.2.5 || ^13 || ^14", "nodemailer": "^6.6.5", "react": "^17.0.2 || ^18", "react-dom": "^17.0.2 || ^18" @@ -14309,14 +13916,14 @@ } }, "node_modules/next-plausible": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.11.2.tgz", - "integrity": "sha512-T/5RPVYFRk4HODvcnpMPk6pe4HYHQHSwJFGUbAdyKIJWgs4jl3oq3S16D6xKSKP3AEjIwQe4YsotQrDN2ILbjA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/next-plausible/-/next-plausible-3.11.3.tgz", + "integrity": "sha512-2dpG58ryxdsr4ZI8whWQpGv0T6foRDPGiehcICpDhYfmMJmluewswQgfDA8Z37RFMXAY+6SHOPS7Xi+9ewNi2Q==", "funding": { "url": "https://github.com/4lejandrito/next-plausible?sponsor=1" }, "peerDependencies": { - "next": "^11.1.0 || ^12.0.0 || ^13.0.0", + "next": "^11.1.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -14428,9 +14035,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.6.tgz", - "integrity": "sha512-s7pDtWwe5fLMkQUhw8TkWB/wnZ7SRdd9HRZslq/s24hlZvBP3j32N/ETLmnqTpmj4xoBZL9fOWyCIZ7r2HORHg==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.7.tgz", + "integrity": "sha512-rUtR77ksqex/eZRLmQ21LKVH5nAAsVicAtAYudK7JgwenEDZ0UIQ1adUGqErz7sMkWYxWTTU1aeP2Jga6WQyJw==", "engines": { "node": ">=6.0.0" } @@ -14533,9 +14140,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14664,9 +14271,9 @@ } }, "node_modules/oo-ascii-tree": { - "version": "1.90.0", - "resolved": "https://registry.npmjs.org/oo-ascii-tree/-/oo-ascii-tree-1.90.0.tgz", - "integrity": "sha512-LixRPYQJtgVfMi9gsUPB/zxrna4DqSe+M+iRGQBAq150BiPD33nWXOj/Je7uauGsOf+NkvRjZiD1P6yW/j8hsQ==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/oo-ascii-tree/-/oo-ascii-tree-1.92.0.tgz", + "integrity": "sha512-rLSPbnakn5Wb3dOIVtrmn8jfHKqWv7bROpyBiw6DExq+dOG7qC49EIs89hBhyHkvLolX0oC+0a/RMPAyHEZ+1w==", "engines": { "node": ">= 14.17.0" } @@ -14927,7 +14534,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -14940,10 +14546,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "engines": { "node": "14 || >=16.14" } @@ -14988,6 +14593,21 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/pdfjs-dist": { + "version": "3.6.172", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.6.172.tgz", + "integrity": "sha512-bfOhCg+S9DXh/ImWhWYTOiq3aVMFSCvzGiBzsIJtdMC71kVWDBw7UXr32xh0y56qc5wMVylIeqV3hBaRsu+e+w==", + "dependencies": { + "path2d-polyfill": "^2.0.1", + "web-streams-polyfill": "^3.2.1" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "canvas": "^2.11.2" + } + }, "node_modules/peberminta": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", @@ -15040,11 +14660,11 @@ } }, "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/pirates": { @@ -15056,12 +14676,12 @@ } }, "node_modules/playwright": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", - "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.0.tgz", + "integrity": "sha512-gyHAgQjiDf1m34Xpwzaqb76KgfzYrhK7iih+2IzcOCoZWr/8ZqmdBw+t0RU85ZmfJMgtgAiNtBQ/KS2325INXw==", "dev": true, "dependencies": { - "playwright-core": "1.39.0" + "playwright-core": "1.40.0" }, "bin": { "playwright": "cli.js" @@ -15074,9 +14694,9 @@ } }, "node_modules/playwright-core": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", - "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.0.tgz", + "integrity": "sha512-fvKewVJpGeca8t0ipM56jkVSU6Eo0RmFvQ/MaCQNDYm+sdvKkMBBWTE1FdeMqIdumRaXXjZChWHvIzCGM/tA/Q==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -15127,9 +14747,9 @@ } }, "node_modules/postcss-css-variables": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", - "integrity": "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.19.0.tgz", + "integrity": "sha512-Hr0WEYKLK9VCrY15anHXOd4RCvJy/xRvCnWdplGBeLInwEj6Z14hgzTb2W/39dYTCnS8hnHUfU4/F1zxX0IZuQ==", "dependencies": { "balanced-match": "^1.0.0", "escape-string-regexp": "^1.0.3", @@ -15182,20 +14802,26 @@ } }, "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" @@ -15209,6 +14835,14 @@ } } }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "engines": { + "node": ">=14" + } + }, "node_modules/postcss-nested": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", @@ -15258,38 +14892,29 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/posthog-js": { - "version": "1.83.3", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.83.3.tgz", - "integrity": "sha512-8MQbt0zyLAW3DfAiz9QQz5m849Xsnp/uRJHxYeC7lOBmG9Yp4KLpXGKj9cdZl0jdinWohPQHsX7iG7U5jBpPAQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.93.2.tgz", + "integrity": "sha512-0e2kqlb4kB1/Q9poLFlMF+SUrW+DCzNBHTJuUKl177euE4LChkJipSjy2vpq98qtJ2K3Hxw7ylHf2C+dZCx4RA==", "dependencies": { "fflate": "^0.4.1" } }, "node_modules/posthog-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.1.2.tgz", - "integrity": "sha512-atPGYjiK+QvtseKKsrUxMrzN84sIVs9jTa7nx5hl999gJly1S3J5r0DApwZ69NKfJkVIeLTCJyT0kyS+7WqDSw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-3.1.3.tgz", + "integrity": "sha512-UaOOoWEUYTcaaDe1w0fgHW/sXvFr3RO0l7yI7RUDzkZNZCfwXNO9r3pc14d1EtNppF/SHBrV5hNiZZATpf/vUw==", "dependencies": { - "axios": "^0.27.0", + "axios": "^1.6.0", "rusha": "^0.8.14" }, "engines": { "node": ">=15.0.0" } }, - "node_modules/posthog-node/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, "node_modules/preact": { - "version": "10.18.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.18.1.tgz", - "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==", + "version": "10.19.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.2.tgz", + "integrity": "sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" @@ -15336,17 +14961,53 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/prebuild-install/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prebuild-install/node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, "node_modules/prebuild-install/node_modules/tar-fs": { @@ -15564,9 +15225,9 @@ } }, "node_modules/property-information": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.3.0.tgz", - "integrity": "sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz", + "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -15600,6 +15261,11 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/ps-tree": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", @@ -15624,9 +15290,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -15769,9 +15435,9 @@ } }, "node_modules/react-day-picker": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.9.0.tgz", - "integrity": "sha512-XgoUgexp5KUy03lGsBDRkV+YQy73qJOLNPojeKe0dDNamrCM75PSBhMBkYVjgMSDy12LGWlbThSRK8p0kozAOA==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.9.1.tgz", + "integrity": "sha512-W0SPApKIsYq+XCtfGeMYDoU0KbsG3wfkYtlw8l+vZp6KoBXGOlhzBUp4tNx1XiwiOZwhfdGOlj7NGSCKGSlg5Q==", "funding": { "type": "individual", "url": "https://github.com/sponsors/gpbl" @@ -15859,51 +15525,6 @@ "commander": "9.4.x" } }, - "node_modules/react-email/node_modules/@esbuild/android-arm": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.4.tgz", - "integrity": "sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/android-arm64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.4.tgz", - "integrity": "sha512-VPuTzXFm/m2fcGfN6CiwZTlLzxrKsWbPkG7ArRFpuxyaHUm/XFHQPD4xNwZT6uUmpIHhnSjcaCmcla8COzmZ5Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/android-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.4.tgz", - "integrity": "sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/react-email/node_modules/@esbuild/darwin-arm64": { "version": "0.16.4", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", @@ -15919,274 +15540,30 @@ "node": ">=12" } }, - "node_modules/react-email/node_modules/@esbuild/darwin-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.4.tgz", - "integrity": "sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/react-email/node_modules/@react-email/render": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.6.tgz", + "integrity": "sha512-6zs7WZbd37TcPT1OmMPH/kcBpv0QSi+k3om7LyDnbdIcrbwOO/OstVwUaa/6zgvDvnq9Y2wOosbru7j5kUrW9A==", + "dependencies": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.4.tgz", - "integrity": "sha512-Oup3G/QxBgvvqnXWrBed7xxkFNwAwJVHZcklWyQt7YCAL5bfUkaa6FVWnR78rNQiM8MqqLiT6ZTZSdUFuVIg1w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/freebsd-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.4.tgz", - "integrity": "sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-arm": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.4.tgz", - "integrity": "sha512-A47ZmtpIPyERxkSvIv+zLd6kNIOtJH03XA0Hy7jaceRDdQaQVGSDt4mZqpWqJYgDk9rg96aglbF6kCRvPGDSUA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-arm64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.4.tgz", - "integrity": "sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-ia32": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.4.tgz", - "integrity": "sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-loong64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.4.tgz", - "integrity": "sha512-peDrrUuxbZ9Jw+DwLCh/9xmZAk0p0K1iY5d2IcwmnN+B87xw7kujOkig6ZRcZqgrXgeRGurRHn0ENMAjjD5DEg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-mips64el": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.4.tgz", - "integrity": "sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-ppc64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.4.tgz", - "integrity": "sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-riscv64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.4.tgz", - "integrity": "sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-s390x": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.4.tgz", - "integrity": "sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/linux-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.4.tgz", - "integrity": "sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/netbsd-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.4.tgz", - "integrity": "sha512-LHSJLit8jCObEQNYkgsDYBh2JrJT53oJO2HVdkSYLa6+zuLJh0lAr06brXIkljrlI+N7NNW1IAXGn/6IZPi3YQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/openbsd-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.4.tgz", - "integrity": "sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/sunos-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.4.tgz", - "integrity": "sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/win32-arm64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.4.tgz", - "integrity": "sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/win32-ia32": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz", - "integrity": "sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/react-email/node_modules/@esbuild/win32-x64": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.4.tgz", - "integrity": "sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/react-email/node_modules/@selderee/plugin-htmlparser2": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz", + "integrity": "sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.10.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" } }, "node_modules/react-email/node_modules/brace-expansion": { @@ -16259,6 +15636,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/react-email/node_modules/html-to-text": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.3.tgz", + "integrity": "sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.10.0", + "deepmerge": "^4.2.2", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.1", + "selderee": "^0.10.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/react-email/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -16270,10 +15662,41 @@ "node": ">=10" } }, + "node_modules/react-email/node_modules/parseley": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz", + "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.8.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/react-email/node_modules/peberminta": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", + "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/react-email/node_modules/selderee": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz", + "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==", + "dependencies": { + "parseley": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/react-hook-form": { - "version": "7.47.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.47.0.tgz", - "integrity": "sha512-F/TroLjTICipmHeFlMrLtNLceO2xr1jU3CyiNla5zdwsGUGu2UOxxR4UyJgLlhMwLW/Wzp4cpJ7CPfgJIeKdSg==", + "version": "7.48.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.48.2.tgz", + "integrity": "sha512-H0T2InFQb1hX7qKtDIZmvpU1Xfn/bdahWBN1fH19gSe4bBEqTfmlr7H3XWTaVtiK4/tpPaI1F3355GPMZYge+A==", "engines": { "node": ">=12.22.0" }, @@ -16295,9 +15718,9 @@ } }, "node_modules/react-icons": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", - "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", "peerDependencies": { "react": "*" } @@ -16312,10 +15735,41 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, - "node_modules/react-property": { + "node_modules/react-pdf": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.3.3.tgz", + "integrity": "sha512-d7WAxcsjOogJfJ+I+zX/mdip3VjR1yq/yDa4hax4XbQVjbbbup6rqs4c8MGx0MLSnzob17TKp1t4CsNbDZ6GeQ==", + "dependencies": { + "clsx": "^2.0.0", + "make-cancellable-promise": "^1.3.1", + "make-event-props": "^1.6.0", + "merge-refs": "^1.2.1", + "pdfjs-dist": "3.6.172", + "prop-types": "^15.6.2", + "tiny-invariant": "^1.0.0", + "tiny-warning": "^1.0.0" + }, + "funding": { + "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-pdf/node_modules/clsx": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", - "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } }, "node_modules/react-remove-scroll": { "version": "2.5.5", @@ -16362,18 +15816,6 @@ } } }, - "node_modules/react-resize-detector": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", - "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", - "dependencies": { - "lodash": "^4.17.21" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-rnd": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", @@ -16460,14 +15902,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -16626,24 +16060,26 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node_modules/read-yaml-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/readdirp": { "version": "3.6.0", @@ -16657,22 +16093,21 @@ } }, "node_modules/recharts": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.9.0.tgz", - "integrity": "sha512-cVgiAU3W5UrA8nRRV/N0JrudgZzY/vjkzrlShbH+EFo1vs4nMlXgshZWLI0DfDLmn4/p4pF7Lq7F5PU+K94Ipg==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.10.1.tgz", + "integrity": "sha512-9bi0jIzxOTfEda+oYqgimKuYfApmBr0zKnAX8r4Iw56k3Saz/IQyBD4zohZL0eyzfz0oGFRH7alpJBgH1eC57g==", "dependencies": { - "classnames": "^2.2.5", + "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.19", "react-is": "^16.10.2", - "react-resize-detector": "^8.0.4", - "react-smooth": "^2.0.4", + "react-smooth": "^2.0.5", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "engines": { - "node": ">=12" + "node": ">=14" }, "peerDependencies": { "prop-types": "^15.6.0", @@ -16688,6 +16123,14 @@ "decimal.js-light": "^2.4.1" } }, + "node_modules/recharts/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/recharts/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -16857,9 +16300,9 @@ } }, "node_modules/remeda": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/remeda/-/remeda-1.27.1.tgz", - "integrity": "sha512-va05uuDBz/E55O9wmpDdbVlwdWbHGJJy3oC0EAHSFn74MpWF3S81NVJDz/FW05bc/UDg769t1u6YPhBK/gmvLw==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-1.29.0.tgz", + "integrity": "sha512-M3LQ14KtMdQ1879lj/kKji3zBk158s7Rwg963mEkTfQFMxnKrIEAMxJfo/+0sp/+uGgN/KMVU2MBA4LNjqf8YQ==" }, "node_modules/repeat-string": { "version": "1.6.1", @@ -17131,11 +16574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -17173,24 +16611,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sass": { - "version": "1.69.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.4.tgz", - "integrity": "sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA==", - "optional": true, - "peer": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -17241,6 +16661,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -17286,11 +16720,60 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/sharp/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sharp/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sharp/node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" }, + "node_modules/sharp/node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -17364,25 +16847,12 @@ ] }, "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, "dependencies": { - "decompress-response": "^6.0.0", + "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } @@ -17525,19 +16995,6 @@ "readable-stream": "^3.0.0" } }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17557,9 +17014,9 @@ } }, "node_modules/start-server-and-test": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.1.tgz", - "integrity": "sha512-8PFo4DLLLCDMuS51/BEEtE1m9CAXw1LNVtZSS1PzkYQh6Qf9JUwM4huYeSoUumaaoAyuwYBwCa9OsrcpMqcOdQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.3.tgz", + "integrity": "sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg==", "dependencies": { "arg": "^5.0.2", "bluebird": "3.7.2", @@ -17568,7 +17025,7 @@ "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "7.0.1" + "wait-on": "7.2.0" }, "bin": { "server-test": "src/bin/start.js", @@ -17614,27 +17071,22 @@ } }, "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", + "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -17648,7 +17100,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -17666,7 +17117,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -17679,14 +17129,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -17695,7 +17143,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -17707,7 +17154,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -17808,7 +17254,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -17880,22 +17325,6 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "node_modules/style-to-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz", - "integrity": "sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==", - "dependencies": { - "style-to-object": "0.4.1" - } - }, - "node_modules/style-to-js/node_modules/style-to-object": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", - "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -18017,9 +17446,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -18041,6 +17470,7 @@ "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, @@ -18187,20 +17617,6 @@ "readable-stream": "3" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tiny-invariant": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", @@ -18510,39 +17926,26 @@ } }, "node_modules/turbo": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.10.15.tgz", - "integrity": "sha512-mKKkqsuDAQy1wCCIjCdG+jOCwUflhckDMSRoeBPcIL/CnCl7c5yRDFe7SyaXloUUkt4tUR0rvNIhVCcT7YeQpg==", + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-1.10.16.tgz", + "integrity": "sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==", "dev": true, "bin": { "turbo": "bin/turbo" }, "optionalDependencies": { - "turbo-darwin-64": "1.10.15", - "turbo-darwin-arm64": "1.10.15", - "turbo-linux-64": "1.10.15", - "turbo-linux-arm64": "1.10.15", - "turbo-windows-64": "1.10.15", - "turbo-windows-arm64": "1.10.15" + "turbo-darwin-64": "1.10.16", + "turbo-darwin-arm64": "1.10.16", + "turbo-linux-64": "1.10.16", + "turbo-linux-arm64": "1.10.16", + "turbo-windows-64": "1.10.16", + "turbo-windows-arm64": "1.10.16" } }, - "node_modules/turbo-darwin-64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-1.10.15.tgz", - "integrity": "sha512-Sik5uogjkRTe1XVP9TC2GryEMOJCaKE2pM/O9uLn4koQDnWKGcLQv+mDU+H+9DXvKLnJnKCD18OVRkwK5tdpoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, "node_modules/turbo-darwin-arm64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.15.tgz", - "integrity": "sha512-xwqyFDYUcl2xwXyGPmHkmgnNm4Cy0oNzMpMOBGRr5x64SErS7QQLR4VHb0ubiR+VAb8M+ECPklU6vD1Gm+wekg==", + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.16.tgz", + "integrity": "sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==", "cpu": [ "arm64" ], @@ -18552,58 +17955,6 @@ "darwin" ] }, - "node_modules/turbo-linux-64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-1.10.15.tgz", - "integrity": "sha512-dM07SiO3RMAJ09Z+uB2LNUSkPp3I1IMF8goH5eLj+d8Kkwoxd/+qbUZOj9RvInyxU/IhlnO9w3PGd3Hp14m/nA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-linux-arm64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-1.10.15.tgz", - "integrity": "sha512-MkzKLkKYKyrz4lwfjNXH8aTny5+Hmiu4SFBZbx+5C0vOlyp6fV5jZANDBvLXWiDDL4DSEAuCEK/2cmN6FVH1ow==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/turbo-windows-64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-1.10.15.tgz", - "integrity": "sha512-3TdVU+WEH9ThvQGwV3ieX/XHebtYNHv9HARHauPwmVj3kakoALkpGxLclkHFBLdLKkqDvmHmXtcsfs6cXXRHJg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/turbo-windows-arm64": { - "version": "1.10.15", - "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-1.10.15.tgz", - "integrity": "sha512-l+7UOBCbfadvPMYsX08hyLD+UIoAkg6ojfH+E8aud3gcA1padpjCJTh9gMpm3QdMbKwZteT5uUM+wyi6Rbbyww==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -18703,9 +18054,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -18855,14 +18206,14 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -18897,6 +18248,38 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" }, + "node_modules/unzipper/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -19083,9 +18466,9 @@ } }, "node_modules/victory-vendor": { - "version": "36.6.11", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", - "integrity": "sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==", + "version": "36.6.12", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.12.tgz", + "integrity": "sha512-pJrTkNHln+D83vDCCSUf0ZfxBvIaVrFHmrBOsnnLAbdqfudRACAj51He2zU94/IWq9464oTADcPVkmWAfNMwgA==", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -19104,15 +18487,15 @@ } }, "node_modules/wait-on": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", - "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", + "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", "dependencies": { - "axios": "^0.27.2", - "joi": "^17.7.0", + "axios": "^1.6.1", + "joi": "^17.11.0", "lodash": "^4.17.21", - "minimist": "^1.2.7", - "rxjs": "^7.8.0" + "minimist": "^1.2.8", + "rxjs": "^7.8.1" }, "bin": { "wait-on": "bin/wait-on" @@ -19121,15 +18504,6 @@ "node": ">=12.0.0" } }, - "node_modules/wait-on/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -19172,11 +18546,6 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -19240,11 +18609,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", @@ -19260,12 +18624,12 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -19323,7 +18687,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -19341,7 +18704,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -19357,14 +18719,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -19373,7 +18733,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -19387,7 +18746,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, "engines": { "node": ">=12" }, @@ -19399,7 +18757,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, "engines": { "node": ">=12" }, @@ -19411,7 +18768,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -19469,9 +18825,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", "engines": { "node": ">= 14" } @@ -19607,8 +18963,8 @@ "@documenso/prisma": "*", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "react": "18.2.0", "ts-pattern": "^5.0.5", "zod": "^3.22.4" @@ -19620,54 +18976,6 @@ "license": "MIT", "dependencies": { "@documenso/nodemailer-resend": "2.0.0", - "@react-email/components": "^0.0.11", - "@react-email/tailwind": "0.0.9", - "nodemailer": "^6.9.3", - "react-email": "^1.9.5", - "resend": "^2.0.0" - }, - "devDependencies": { - "@documenso/tailwind-config": "*", - "@documenso/tsconfig": "*", - "@types/nodemailer": "^6.4.8", - "tsup": "^7.1.0" - } - }, - "packages/email/node_modules/@react-email/body": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.4.tgz", - "integrity": "sha512-NmHOumdmyjWvOXomqhQt06KbgRxhHrVznxQp/oWiPWes8nAJo2Y4L27aPHR9nTcs7JF7NmcJe9YSN42pswK+GQ==", - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/button": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.0.11.tgz", - "integrity": "sha512-mB5ySfZifwE5ybtIWwXGbmKk1uKkH4655gftL4+mMxZAZCkINVa2KXTi5pO+xZhMtJI9xtAsikOrOEU1gTDoww==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/column": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.8.tgz", - "integrity": "sha512-blChqGU8e/L6KZiB5EPww8bkZfdyHDuS0vKIvU+iS14uK+xfAw+5P5CU9BYXccEuJh2Gftfngu1bWMFp2Sc6ag==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/components": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.11.tgz", - "integrity": "sha512-wj9Sra/AGQvadb3ZABz44ll9Fb9FvXPEmODXRWbNRSc8pJTFGWorrsm4M/yj8dnewd4HtnbLkV1eDOvuiLAVLA==", - "dependencies": { "@react-email/body": "0.0.4", "@react-email/button": "0.0.11", "@react-email/column": "0.0.8", @@ -19683,244 +18991,17 @@ "@react-email/render": "0.0.9", "@react-email/row": "0.0.6", "@react-email/section": "0.0.10", - "@react-email/tailwind": "0.0.12", - "@react-email/text": "0.0.6" + "@react-email/tailwind": "0.0.13-canary.1", + "@react-email/text": "0.0.6", + "nodemailer": "^6.9.3", + "react-email": "^1.9.5", + "resend": "^2.0.0" }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/container": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.10.tgz", - "integrity": "sha512-goishY7ocq+lord0043/LZK268bqvMFW/sxpUt/dSCPJyrrZZNCbpW2t8w8HztU38cYj0qGQLxO5Qvpn/RER3w==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/font": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.4.tgz", - "integrity": "sha512-rN/pFlAcDNmfYFxpufT/rFRrM5KYBJM4nTA2uylTehlVOro6fb/q6n0zUwLF6OmQ4QIuRbqdEy7DI9mmJiNHxA==", - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/head": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.6.tgz", - "integrity": "sha512-9BrBDalb34nBOmmQVQc7/pjJotcuAeC3rhBl4G88Ohiipuv15vPIKqwy8vPJcFNi4l7yGlitfG3EESIjkLkoIw==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/heading": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.9.tgz", - "integrity": "sha512-xzkcGlm+/aFrNlJZBKzxRKkRYJ2cRx92IqmSKAuGnwuKQ/uMKomXzPsHPu3Dclmnhn3wVKj4uprkgQOoxP6uXQ==", - "dependencies": { - "@radix-ui/react-slot": "1.0.2", - "react": "18.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/email/node_modules/@react-email/hr": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.6.tgz", - "integrity": "sha512-W+wINBz7z7BRv3i9GS+QoJBae1PESNhv6ZY6eLnEpqtBI/2++suuRNJOU/KpZzE6pykeTp6I/Z7UcL0LEYKgyg==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/html": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.6.tgz", - "integrity": "sha512-8Fo20VOqxqc087gGEPjT8uos06fTXIC8NSoiJxpiwAkwiKtQnQH/jOdoLv6XaWh5Zt2clj1uokaoklnaM5rY1w==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/img": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.6.tgz", - "integrity": "sha512-Wd7xKI3b1Jvb2ZEHyVpJ9D98u0GHrRl+578b8LV24PavM/65V61Q5LN5Fr9sAhj+4VGqnHDIVeXIYEzVbWaa3Q==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/link": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.6.tgz", - "integrity": "sha512-bYYHroWGS//nDl9yhh8V6K2BrNwAsyX7N/XClSCRku3x56NrZ6D0nBKWewYDPlJ9rW9TIaJm1jDYtO9XBzLlkQ==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/preview": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.7.tgz", - "integrity": "sha512-YLfIwHdexPi8IgP1pSuVXdAmKzMQ8ctCCLEjkMttT2vkSFqT6m/e6UFWK2l30rKm2dDsLvQyEvo923mPXjnNzg==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/row": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.6.tgz", - "integrity": "sha512-msJ2TnDJNwpgDfDzUO63CvhusJHeaGLMM+8Zz86VPvxzwe/DkT7N48QKRWRCkt8urxVz5U+EgivORA9Dum9p3Q==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/section": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.10.tgz", - "integrity": "sha512-x9B2KYFqj+d8I1fK9bgeVm/3mLE4Qgn4mm/GbDtcJeSzKU/G7bTb7/3+BMDk9SARPGkg5XAuZm1XgcqQQutt2A==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/@react-email/tailwind": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.9.tgz", - "integrity": "sha512-hVGMTVjg2u51TU8dMInc8l3R6+O2t54sx0mzQnJ2mOLwJQkfibh3HA4lmEa0V1qlv8mT/nti0vzC6QshdCxqjg==", - "dependencies": { - "html-react-parser": "4.0.0", - "react": "18.2.0", - "react-dom": "18.2.0", - "tw-to-css": "0.0.11" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "packages/email/node_modules/@react-email/text": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.6.tgz", - "integrity": "sha512-PDUTAD1PjlzXFOIUrR1zuV2xxguL62yne5YLcn1k+u/dVUyzn6iU/5lFShxCfzuh3QDWCf4+JRNnXN9rmV6jzw==", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, - "packages/email/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "packages/email/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "packages/email/node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "packages/email/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "packages/email/node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/email/node_modules/tw-to-css": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.12.tgz", - "integrity": "sha512-rQAsQvOtV1lBkyCw+iypMygNHrShYAItES5r8fMsrhhaj5qrV2LkZyXc8ccEH+u5bFjHjQ9iuxe90I7Kykf6pw==", - "dependencies": { - "postcss": "8.4.31", - "postcss-css-variables": "0.18.0", - "tailwindcss": "3.3.2" - }, - "engines": { - "node": ">=16.0.0" + "devDependencies": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@types/nodemailer": "^6.4.8", + "tsup": "^7.1.0" } }, "packages/eslint-config": { @@ -19941,304 +19022,16 @@ "typescript": "5.2.2" } }, - "packages/eslint-config/node_modules/@next/eslint-plugin-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", - "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", - "dependencies": { - "glob": "7.1.7" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "packages/eslint-config/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "bin": { - "semver": "bin/semver.js" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "packages/eslint-config/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/eslint-config/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/eslint-config/node_modules/eslint-config-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", - "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", - "dependencies": { - "@next/eslint-plugin-next": "13.4.19", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "packages/eslint-config/node_modules/eslint-plugin-unused-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", - "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "packages/eslint-config/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "packages/eslint-config/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" + "node": ">=14.17" } }, "packages/lib": { @@ -20264,8 +19057,8 @@ "bcrypt": "^5.1.0", "luxon": "^3.4.0", "nanoid": "^4.0.2", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "oslo": "^0.17.0", "pdf-lib": "^1.17.1", "react": "18.2.0", @@ -20323,6 +19116,19 @@ "typescript": "5.2.2" } }, + "packages/prisma/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "packages/signing": { "name": "@documenso/signing", "version": "1.0.0", @@ -20345,7 +19151,7 @@ "dependencies": { "autoprefixer": "^10.4.13", "postcss": "^8.4.21", - "tailwindcss": "^3.2.7", + "tailwindcss": "3.3.2", "tailwindcss-animate": "^1.0.5" }, "devDependencies": { @@ -20417,7 +19223,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.279.0", "luxon": "^3.4.2", - "next": "14.0.0", + "next": "14.0.3", "pdfjs-dist": "3.6.172", "react-day-picker": "^8.7.1", "react-hook-form": "^7.45.4", @@ -20437,55 +19243,17 @@ "typescript": "5.2.2" } }, - "packages/ui/node_modules/pdfjs-dist": { - "version": "3.6.172", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.6.172.tgz", - "integrity": "sha512-bfOhCg+S9DXh/ImWhWYTOiq3aVMFSCvzGiBzsIJtdMC71kVWDBw7UXr32xh0y56qc5wMVylIeqV3hBaRsu+e+w==", - "dependencies": { - "path2d-polyfill": "^2.0.1", - "web-streams-polyfill": "^3.2.1" + "packages/ui/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "canvas": "^2.11.2" - } - }, - "packages/ui/node_modules/react-pdf": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-7.3.3.tgz", - "integrity": "sha512-d7WAxcsjOogJfJ+I+zX/mdip3VjR1yq/yDa4hax4XbQVjbbbup6rqs4c8MGx0MLSnzob17TKp1t4CsNbDZ6GeQ==", - "dependencies": { - "clsx": "^2.0.0", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.2.1", - "pdfjs-dist": "3.6.172", - "prop-types": "^15.6.2", - "tiny-invariant": "^1.0.0", - "tiny-warning": "^1.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "packages/ui/node_modules/react-pdf/node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", - "engines": { - "node": ">=6" + "node": ">=14.17" } } } diff --git a/package.json b/package.json index df6361aef..2e708363f 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,13 @@ "apps/*", "packages/*" ], - "dependencies": { - "recharts": "^2.7.2", - "react-hotkeys-hook": "^4.4.1" + "dependencies": {}, + "overrides": { + "next-auth": { + "next": "14.0.3" + }, + "next-contentlayer": { + "next": "14.0.3" + } } } diff --git a/packages/ee/package.json b/packages/ee/package.json index c153d1b1b..c711f3843 100644 --- a/packages/ee/package.json +++ b/packages/ee/package.json @@ -17,8 +17,8 @@ "@documenso/prisma": "*", "luxon": "^3.4.0", "micro": "^10.0.1", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "react": "18.2.0", "ts-pattern": "^5.0.5", "zod": "^3.22.4" diff --git a/packages/email/components.ts b/packages/email/components.ts new file mode 100644 index 000000000..552611c93 --- /dev/null +++ b/packages/email/components.ts @@ -0,0 +1,17 @@ +export * from '@react-email/body'; +export * from '@react-email/button'; +export * from '@react-email/column'; +export * from '@react-email/container'; +export * from '@react-email/font'; +export * from '@react-email/head'; +export * from '@react-email/heading'; +export * from '@react-email/hr'; +export * from '@react-email/html'; +export * from '@react-email/img'; +export * from '@react-email/link'; +export * from '@react-email/preview'; +export * from '@react-email/render'; +export * from '@react-email/row'; +export * from '@react-email/section'; +export * from '@react-email/tailwind'; +export * from '@react-email/text'; diff --git a/packages/email/package.json b/packages/email/package.json index adc98e3ff..8fcadb647 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -18,8 +18,23 @@ }, "dependencies": { "@documenso/nodemailer-resend": "2.0.0", - "@react-email/components": "^0.0.11", - "@react-email/tailwind": "0.0.9", + "@react-email/body": "0.0.4", + "@react-email/button": "0.0.11", + "@react-email/column": "0.0.8", + "@react-email/container": "0.0.10", + "@react-email/font": "0.0.4", + "@react-email/head": "0.0.6", + "@react-email/heading": "0.0.9", + "@react-email/hr": "0.0.6", + "@react-email/html": "0.0.6", + "@react-email/img": "0.0.6", + "@react-email/link": "0.0.6", + "@react-email/preview": "0.0.7", + "@react-email/render": "0.0.9", + "@react-email/row": "0.0.6", + "@react-email/section": "0.0.10", + "@react-email/tailwind": "0.0.13-canary.1", + "@react-email/text": "0.0.6", "nodemailer": "^6.9.3", "react-email": "^1.9.5", "resend": "^2.0.0" @@ -29,8 +44,5 @@ "@documenso/tsconfig": "*", "@types/nodemailer": "^6.4.8", "tsup": "^7.1.0" - }, - "overrides": { - "@react-email/tailwind": "0.0.9" } } diff --git a/packages/email/render.ts b/packages/email/render.ts index f39aa13ba..46f0d62a5 100644 --- a/packages/email/render.ts +++ b/packages/email/render.ts @@ -1 +1 @@ -export { render } from '@react-email/components'; +export { render, renderAsync } from '@react-email/render'; diff --git a/packages/email/template-components/template-confirmation-email.tsx b/packages/email/template-components/template-confirmation-email.tsx index e46582f54..1036faa3e 100644 --- a/packages/email/template-components/template-confirmation-email.tsx +++ b/packages/email/template-components/template-confirmation-email.tsx @@ -1,7 +1,4 @@ -import { Button, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export type TemplateConfirmationEmailProps = { @@ -14,15 +11,7 @@ export const TemplateConfirmationEmail = ({ assetBaseUrl, }: TemplateConfirmationEmailProps) => { return ( - + <>
@@ -47,6 +36,6 @@ export const TemplateConfirmationEmail = ({
-
+ ); }; diff --git a/packages/email/template-components/template-document-completed.tsx b/packages/email/template-components/template-document-completed.tsx index c67fb4017..573432284 100644 --- a/packages/email/template-components/template-document-completed.tsx +++ b/packages/email/template-components/template-document-completed.tsx @@ -1,7 +1,4 @@ -import { Button, Column, Img, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Column, Img, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export interface TemplateDocumentCompletedProps { @@ -20,15 +17,7 @@ export const TemplateDocumentCompleted = ({ }; return ( - + <>
@@ -72,7 +61,7 @@ export const TemplateDocumentCompleted = ({
-
+ ); }; diff --git a/packages/email/template-components/template-document-image.tsx b/packages/email/template-components/template-document-image.tsx index d18140024..bf2212f4a 100644 --- a/packages/email/template-components/template-document-image.tsx +++ b/packages/email/template-components/template-document-image.tsx @@ -1,4 +1,4 @@ -import { Column, Img, Row, Section } from '@react-email/components'; +import { Column, Img, Row, Section } from '../components'; export interface TemplateDocumentImageProps { assetBaseUrl: string; diff --git a/packages/email/template-components/template-document-invite.tsx b/packages/email/template-components/template-document-invite.tsx index 0e2837aa6..216a3183d 100644 --- a/packages/email/template-components/template-document-invite.tsx +++ b/packages/email/template-components/template-document-invite.tsx @@ -1,7 +1,4 @@ -import { Button, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export interface TemplateDocumentInviteProps { @@ -19,15 +16,7 @@ export const TemplateDocumentInvite = ({ assetBaseUrl, }: TemplateDocumentInviteProps) => { return ( - + <>
@@ -49,7 +38,7 @@ export const TemplateDocumentInvite = ({
-
+ ); }; diff --git a/packages/email/template-components/template-document-pending.tsx b/packages/email/template-components/template-document-pending.tsx index 632433ae3..f03d7bdbb 100644 --- a/packages/email/template-components/template-document-pending.tsx +++ b/packages/email/template-components/template-document-pending.tsx @@ -1,7 +1,4 @@ -import { Column, Img, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Column, Img, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export interface TemplateDocumentPendingProps { @@ -18,15 +15,7 @@ export const TemplateDocumentPending = ({ }; return ( - + <>
@@ -52,7 +41,7 @@ export const TemplateDocumentPending = ({ We'll notify you as soon as it's ready.
-
+ ); }; diff --git a/packages/email/template-components/template-document-self-signed.tsx b/packages/email/template-components/template-document-self-signed.tsx index 604dd5274..90a1d3951 100644 --- a/packages/email/template-components/template-document-self-signed.tsx +++ b/packages/email/template-components/template-document-self-signed.tsx @@ -1,7 +1,4 @@ -import { Button, Column, Img, Link, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Column, Img, Link, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export interface TemplateDocumentSelfSignedProps { @@ -20,15 +17,7 @@ export const TemplateDocumentSelfSigned = ({ }; return ( - + <>
@@ -84,7 +73,7 @@ export const TemplateDocumentSelfSigned = ({
-
+ ); }; diff --git a/packages/email/template-components/template-footer.tsx b/packages/email/template-components/template-footer.tsx index 21da49130..4a9e2c7cf 100644 --- a/packages/email/template-components/template-footer.tsx +++ b/packages/email/template-components/template-footer.tsx @@ -1,4 +1,4 @@ -import { Link, Section, Text } from '@react-email/components'; +import { Link, Section, Text } from '../components'; export type TemplateFooterProps = { isDocument?: boolean; diff --git a/packages/email/template-components/template-forgot-password.tsx b/packages/email/template-components/template-forgot-password.tsx index 1f1d0438d..c8227b2bd 100644 --- a/packages/email/template-components/template-forgot-password.tsx +++ b/packages/email/template-components/template-forgot-password.tsx @@ -1,7 +1,4 @@ -import { Button, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export type TemplateForgotPasswordProps = { @@ -14,15 +11,7 @@ export const TemplateForgotPassword = ({ assetBaseUrl, }: TemplateForgotPasswordProps) => { return ( - + <>
@@ -43,7 +32,7 @@ export const TemplateForgotPassword = ({
-
+ ); }; diff --git a/packages/email/template-components/template-reset-password.tsx b/packages/email/template-components/template-reset-password.tsx index 45f81be06..8788d60b8 100644 --- a/packages/email/template-components/template-reset-password.tsx +++ b/packages/email/template-components/template-reset-password.tsx @@ -1,7 +1,4 @@ -import { Button, Section, Tailwind, Text } from '@react-email/components'; - -import * as config from '@documenso/tailwind-config'; - +import { Button, Section, Text } from '../components'; import { TemplateDocumentImage } from './template-document-image'; export interface TemplateResetPasswordProps { @@ -12,15 +9,7 @@ export interface TemplateResetPasswordProps { export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordProps) => { return ( - + <>
@@ -41,7 +30,7 @@ export const TemplateResetPassword = ({ assetBaseUrl }: TemplateResetPasswordPro
-
+ ); }; diff --git a/packages/email/templates/confirm-email.tsx b/packages/email/templates/confirm-email.tsx index 5e917f0a3..b3acd1ecd 100644 --- a/packages/email/templates/confirm-email.tsx +++ b/packages/email/templates/confirm-email.tsx @@ -1,20 +1,8 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, -} from '@react-email/components'; - import config from '@documenso/tailwind-config'; -import { - TemplateConfirmationEmail, - TemplateConfirmationEmailProps, -} from '../template-components/template-confirmation-email'; +import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import type { TemplateConfirmationEmailProps } from '../template-components/template-confirmation-email'; +import { TemplateConfirmationEmail } from '../template-components/template-confirmation-email'; import { TemplateFooter } from '../template-components/template-footer'; export const ConfirmEmailTemplate = ({ diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx index a5a1a02ba..9ee339097 100644 --- a/packages/email/templates/document-completed.tsx +++ b/packages/email/templates/document-completed.tsx @@ -1,20 +1,8 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, -} from '@react-email/components'; - import config from '@documenso/tailwind-config'; -import { - TemplateDocumentCompleted, - TemplateDocumentCompletedProps, -} from '../template-components/template-document-completed'; +import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import type { TemplateDocumentCompletedProps } from '../template-components/template-document-completed'; +import { TemplateDocumentCompleted } from '../template-components/template-document-completed'; import { TemplateFooter } from '../template-components/template-footer'; export type DocumentCompletedEmailTemplateProps = Partial; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx index fd366ad30..d6a45d5fc 100644 --- a/packages/email/templates/document-invite.tsx +++ b/packages/email/templates/document-invite.tsx @@ -1,3 +1,5 @@ +import config from '@documenso/tailwind-config'; + import { Body, Container, @@ -10,14 +12,9 @@ import { Section, Tailwind, Text, -} from '@react-email/components'; - -import config from '@documenso/tailwind-config'; - -import { - TemplateDocumentInvite, - TemplateDocumentInviteProps, -} from '../template-components/template-document-invite'; +} from '../components'; +import type { TemplateDocumentInviteProps } from '../template-components/template-document-invite'; +import { TemplateDocumentInvite } from '../template-components/template-document-invite'; import { TemplateFooter } from '../template-components/template-footer'; export type DocumentInviteEmailTemplateProps = Partial & { diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx index 0ed768747..f14671e10 100644 --- a/packages/email/templates/document-pending.tsx +++ b/packages/email/templates/document-pending.tsx @@ -1,20 +1,8 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, -} from '@react-email/components'; - import config from '@documenso/tailwind-config'; -import { - TemplateDocumentPending, - TemplateDocumentPendingProps, -} from '../template-components/template-document-pending'; +import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import type { TemplateDocumentPendingProps } from '../template-components/template-document-pending'; +import { TemplateDocumentPending } from '../template-components/template-document-pending'; import { TemplateFooter } from '../template-components/template-footer'; export type DocumentPendingEmailTemplateProps = Partial; diff --git a/packages/email/templates/document-self-signed.tsx b/packages/email/templates/document-self-signed.tsx index 91b2d29f6..aa1c89b10 100644 --- a/packages/email/templates/document-self-signed.tsx +++ b/packages/email/templates/document-self-signed.tsx @@ -1,20 +1,8 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, -} from '@react-email/components'; - import config from '@documenso/tailwind-config'; -import { - TemplateDocumentSelfSigned, - TemplateDocumentSelfSignedProps, -} from '../template-components/template-document-self-signed'; +import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; +import type { TemplateDocumentSelfSignedProps } from '../template-components/template-document-self-signed'; +import { TemplateDocumentSelfSigned } from '../template-components/template-document-self-signed'; import { TemplateFooter } from '../template-components/template-footer'; export type DocumentSelfSignedTemplateProps = TemplateDocumentSelfSignedProps; diff --git a/packages/email/templates/forgot-password.tsx b/packages/email/templates/forgot-password.tsx index 61df2ccc3..7fe62cd20 100644 --- a/packages/email/templates/forgot-password.tsx +++ b/packages/email/templates/forgot-password.tsx @@ -1,21 +1,9 @@ -import { - Body, - Container, - Head, - Html, - Img, - Preview, - Section, - Tailwind, -} from '@react-email/components'; - import config from '@documenso/tailwind-config'; +import { Body, Container, Head, Html, Img, Preview, Section, Tailwind } from '../components'; import { TemplateFooter } from '../template-components/template-footer'; -import { - TemplateForgotPassword, - TemplateForgotPasswordProps, -} from '../template-components/template-forgot-password'; +import type { TemplateForgotPasswordProps } from '../template-components/template-forgot-password'; +import { TemplateForgotPassword } from '../template-components/template-forgot-password'; export type ForgotPasswordTemplateProps = Partial; diff --git a/packages/email/templates/reset-password.tsx b/packages/email/templates/reset-password.tsx index ed9929ec7..c6c1201c6 100644 --- a/packages/email/templates/reset-password.tsx +++ b/packages/email/templates/reset-password.tsx @@ -1,3 +1,5 @@ +import config from '@documenso/tailwind-config'; + import { Body, Container, @@ -10,15 +12,10 @@ import { Section, Tailwind, Text, -} from '@react-email/components'; - -import config from '@documenso/tailwind-config'; - +} from '../components'; import { TemplateFooter } from '../template-components/template-footer'; -import { - TemplateResetPassword, - TemplateResetPasswordProps, -} from '../template-components/template-reset-password'; +import type { TemplateResetPasswordProps } from '../template-components/template-reset-password'; +import { TemplateResetPassword } from '../template-components/template-reset-password'; export type ResetPasswordTemplateProps = Partial; diff --git a/packages/lib/package.json b/packages/lib/package.json index e9d321e5b..41558e2e0 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -34,8 +34,8 @@ "bcrypt": "^5.1.0", "luxon": "^3.4.0", "nanoid": "^4.0.2", - "next": "14.0.0", - "next-auth": "4.24.3", + "next": "14.0.3", + "next-auth": "4.24.5", "oslo": "^0.17.0", "pdf-lib": "^1.17.1", "react": "18.2.0", diff --git a/packages/lib/server-only/field/sign-field-with-token.ts b/packages/lib/server-only/field/sign-field-with-token.ts index 04c5b0ddb..3087d64a9 100644 --- a/packages/lib/server-only/field/sign-field-with-token.ts +++ b/packages/lib/server-only/field/sign-field-with-token.ts @@ -54,6 +54,7 @@ export const signFieldWithToken = async ({ field.type === FieldType.SIGNATURE || field.type === FieldType.FREE_SIGNATURE; let customText = !isSignatureField ? value : undefined; + const signatureImageAsBase64 = isSignatureField && isBase64 ? value : undefined; const typedSignature = isSignatureField && !isBase64 ? value : undefined; @@ -61,29 +62,48 @@ export const signFieldWithToken = async ({ customText = DateTime.now().toFormat('yyyy-MM-dd hh:mm a'); } - await prisma.field.update({ - where: { - id: field.id, - }, - data: { - customText, - inserted: true, - Signature: isSignatureField - ? { - upsert: { - create: { - recipientId: field.recipientId, - signatureImageAsBase64, - typedSignature, - }, - update: { - recipientId: field.recipientId, - signatureImageAsBase64, - typedSignature, - }, - }, - } - : undefined, - }, + if (isSignatureField && !signatureImageAsBase64 && !typedSignature) { + throw new Error('Signature field must have a signature'); + } + + return await prisma.$transaction(async (tx) => { + const updatedField = await tx.field.update({ + where: { + id: field.id, + }, + data: { + customText, + inserted: true, + }, + }); + + if (isSignatureField) { + if (!field.recipientId) { + throw new Error('Field has no recipientId'); + } + + const signature = await tx.signature.upsert({ + where: { + fieldId: field.id, + }, + create: { + fieldId: field.id, + recipientId: field.recipientId, + signatureImageAsBase64: signatureImageAsBase64, + typedSignature: typedSignature, + }, + update: { + signatureImageAsBase64: signatureImageAsBase64, + typedSignature: typedSignature, + }, + }); + + // Dirty but I don't want to deal with type information + Object.assign(updatedField, { + Signature: signature, + }); + } + + return updatedField; }); }; diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json index 7a2e63139..af96dc595 100644 --- a/packages/tailwind-config/package.json +++ b/packages/tailwind-config/package.json @@ -9,7 +9,7 @@ "dependencies": { "autoprefixer": "^10.4.13", "postcss": "^8.4.21", - "tailwindcss": "^3.2.7", + "tailwindcss": "3.3.2", "tailwindcss-animate": "^1.0.5" }, "devDependencies": { diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts index 924d3a9bd..9a3588259 100644 --- a/packages/trpc/server/document-router/router.ts +++ b/packages/trpc/server/document-router/router.ts @@ -1,6 +1,7 @@ import { TRPCError } from '@trpc/server'; import { getServerLimits } from '@documenso/ee/server-only/limits/server'; +import { upsertDocumentMeta } from '@documenso/lib/server-only/document-meta/upsert-document-meta'; import { createDocument } from '@documenso/lib/server-only/document/create-document'; import { deleteDraftDocument } from '@documenso/lib/server-only/document/delete-draft-document'; import { duplicateDocumentById } from '@documenso/lib/server-only/document/duplicate-document-by-id'; @@ -119,7 +120,7 @@ export const documentRouter = router({ .input(ZSetTitleForDocumentMutationSchema) .mutation(async ({ input, ctx }) => { const { documentId, title } = input; - + const userId = ctx.user.id; return await updateTitle({ @@ -176,7 +177,15 @@ export const documentRouter = router({ .input(ZSendDocumentMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { documentId } = input; + const { documentId, email } = input; + + if (email.message || email.subject) { + await upsertDocumentMeta({ + documentId, + subject: email.subject, + message: email.message, + }); + } return await sendDocument({ userId: ctx.user.id, diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts index cc010046e..53288436a 100644 --- a/packages/trpc/server/document-router/schema.ts +++ b/packages/trpc/server/document-router/schema.ts @@ -65,6 +65,10 @@ export type TSetFieldsForDocumentMutationSchema = z.infer< export const ZSendDocumentMutationSchema = z.object({ documentId: z.number(), + email: z.object({ + subject: z.string(), + message: z.string(), + }), }); export const ZResendDocumentMutationSchema = z.object({ diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index b25e14d9f..7d049df0d 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -1,15 +1,47 @@ import { TRPCError } from '@trpc/server'; import { removeSignedFieldWithToken } from '@documenso/lib/server-only/field/remove-signed-field-with-token'; +import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; import { signFieldWithToken } from '@documenso/lib/server-only/field/sign-field-with-token'; -import { procedure, router } from '../trpc'; +import { authenticatedProcedure, procedure, router } from '../trpc'; import { + ZAddFieldsMutationSchema, ZRemovedSignedFieldWithTokenMutationSchema, ZSignFieldWithTokenMutationSchema, } from './schema'; export const fieldRouter = router({ + addFields: authenticatedProcedure + .input(ZAddFieldsMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, fields } = input; + + return await setFieldsForDocument({ + documentId, + userId: ctx.user.id, + fields: fields.map((field) => ({ + id: field.nativeId, + signerEmail: field.signerEmail, + type: field.type, + pageNumber: field.pageNumber, + pageX: field.pageX, + pageY: field.pageY, + pageWidth: field.pageWidth, + pageHeight: field.pageHeight, + })), + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to sign this field. Please try again later.', + }); + } + }), + signFieldWithToken: procedure .input(ZSignFieldWithTokenMutationSchema) .mutation(async ({ input }) => { diff --git a/packages/trpc/server/field-router/schema.ts b/packages/trpc/server/field-router/schema.ts index 051636477..d9f207adb 100644 --- a/packages/trpc/server/field-router/schema.ts +++ b/packages/trpc/server/field-router/schema.ts @@ -1,5 +1,26 @@ import { z } from 'zod'; +import { FieldType } from '@documenso/prisma/client'; + +export const ZAddFieldsMutationSchema = z.object({ + documentId: z.number(), + fields: z.array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + type: z.nativeEnum(FieldType), + signerEmail: z.string().min(1), + pageNumber: z.number().min(1), + pageX: z.number().min(0), + pageY: z.number().min(0), + pageWidth: z.number().min(0), + pageHeight: z.number().min(0), + }), + ), +}); + +export type TAddFieldsMutationSchema = z.infer; + export const ZSignFieldWithTokenMutationSchema = z.object({ token: z.string(), fieldId: z.number(), diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts new file mode 100644 index 000000000..913749dde --- /dev/null +++ b/packages/trpc/server/recipient-router/router.ts @@ -0,0 +1,54 @@ +import { TRPCError } from '@trpc/server'; + +import { completeDocumentWithToken } from '@documenso/lib/server-only/document/complete-document-with-token'; +import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; + +import { authenticatedProcedure, procedure, router } from '../trpc'; +import { ZAddSignersMutationSchema, ZCompleteDocumentWithTokenMutationSchema } from './schema'; + +export const recipientRouter = router({ + addSigners: authenticatedProcedure + .input(ZAddSignersMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, signers } = input; + + return await setRecipientsForDocument({ + userId: ctx.user.id, + documentId, + recipients: signers.map((signer) => ({ + id: signer.nativeId, + email: signer.email, + name: signer.name, + })), + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to sign this field. Please try again later.', + }); + } + }), + + completeDocumentWithToken: procedure + .input(ZCompleteDocumentWithTokenMutationSchema) + .mutation(async ({ input }) => { + try { + const { token, documentId } = input; + + return await completeDocumentWithToken({ + token, + documentId, + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to sign this field. Please try again later.', + }); + } + }), +}); diff --git a/packages/trpc/server/recipient-router/schema.ts b/packages/trpc/server/recipient-router/schema.ts new file mode 100644 index 000000000..ca177a3d5 --- /dev/null +++ b/packages/trpc/server/recipient-router/schema.ts @@ -0,0 +1,33 @@ +import { z } from 'zod'; + +export const ZAddSignersMutationSchema = z + .object({ + documentId: z.number(), + signers: z.array( + z.object({ + nativeId: z.number().optional(), + email: z.string().email().min(1), + name: z.string(), + }), + ), + }) + .refine( + (schema) => { + const emails = schema.signers.map((signer) => signer.email.toLowerCase()); + + return new Set(emails).size === emails.length; + }, + // Dirty hack to handle errors when .root is populated for an array type + { message: 'Signers must have unique emails', path: ['signers__root'] }, + ); + +export type TAddSignersMutationSchema = z.infer; + +export const ZCompleteDocumentWithTokenMutationSchema = z.object({ + token: z.string(), + documentId: z.number(), +}); + +export type TCompleteDocumentWithTokenMutationSchema = z.infer< + typeof ZCompleteDocumentWithTokenMutationSchema +>; diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index 5b09478dc..bf8a03ce1 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -3,6 +3,7 @@ import { authRouter } from './auth-router/router'; import { documentRouter } from './document-router/router'; import { fieldRouter } from './field-router/router'; import { profileRouter } from './profile-router/router'; +import { recipientRouter } from './recipient-router/router'; import { shareLinkRouter } from './share-link-router/router'; import { singleplayerRouter } from './singleplayer-router/router'; import { router } from './trpc'; @@ -13,6 +14,7 @@ export const appRouter = router({ profile: profileRouter, document: documentRouter, field: fieldRouter, + recipient: recipientRouter, admin: adminRouter, shareLink: shareLinkRouter, singleplayer: singleplayerRouter, diff --git a/packages/trpc/server/singleplayer-router/router.ts b/packages/trpc/server/singleplayer-router/router.ts index 8ac885bff..65888c835 100644 --- a/packages/trpc/server/singleplayer-router/router.ts +++ b/packages/trpc/server/singleplayer-router/router.ts @@ -3,7 +3,7 @@ import { createElement } from 'react'; import { PDFDocument } from 'pdf-lib'; import { mailer } from '@documenso/email/mailer'; -import { render } from '@documenso/email/render'; +import { renderAsync } from '@documenso/email/render'; import { DocumentSelfSignedEmailTemplate } from '@documenso/email/templates/document-self-signed'; import { FROM_ADDRESS, FROM_NAME, SERVICE_USER_EMAIL } from '@documenso/lib/constants/email'; import { insertFieldInPDF } from '@documenso/lib/server-only/pdf/insert-field-in-pdf'; @@ -36,6 +36,7 @@ export const singleplayerRouter = router({ }); const doc = await PDFDocument.load(document); + const createdAt = new Date(); const isBase64 = signer.signature.startsWith('data:image/png;base64,'); @@ -149,6 +150,11 @@ export const singleplayerRouter = router({ assetBaseUrl: process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000', }); + const [html, text] = await Promise.all([ + renderAsync(template), + renderAsync(template, { plainText: true }), + ]); + // Send email to signer. await mailer.sendMail({ to: { @@ -160,8 +166,8 @@ export const singleplayerRouter = router({ address: FROM_ADDRESS, }, subject: 'Document signed', - html: render(template), - text: render(template, { plainText: true }), + html, + text, attachments: [{ content: signedPdfBuffer, filename: documentName }], }); diff --git a/packages/ui/package.json b/packages/ui/package.json index 2ba3dc5fe..ce452091e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -62,7 +62,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.279.0", "luxon": "^3.4.2", - "next": "14.0.0", + "next": "14.0.3", "pdfjs-dist": "3.6.172", "react-day-picker": "^8.7.1", "react-hook-form": "^7.45.4", From 073a050587d2056d2b0a334483c47b552b143519 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 11:09:42 +1100 Subject: [PATCH 25/51] fix: signature field race conditions --- .../app/(signing)/sign/[token]/signature-field.tsx | 12 +++++++++--- .../avatar/stack-avatars-with-tooltip.tsx | 10 +--------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx b/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx index 01923bd6c..ec3e45fe5 100644 --- a/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/signature-field.tsx @@ -6,8 +6,8 @@ import { useRouter } from 'next/navigation'; import { Loader } from 'lucide-react'; -import { Recipient } from '@documenso/prisma/client'; -import { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; +import type { Recipient } from '@documenso/prisma/client'; +import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; import { trpc } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { Dialog, DialogContent, DialogFooter, DialogTitle } from '@documenso/ui/primitives/dialog'; @@ -76,10 +76,16 @@ export const SignatureField = ({ field, recipient }: SignatureFieldProps) => { return; } + const value = source === 'local' && localSignature ? localSignature : providedSignature ?? ''; + + if (!value) { + return; + } + await signFieldWithToken({ token: recipient.token, fieldId: field.id, - value: source === 'local' && localSignature ? localSignature : providedSignature ?? '', + value, isBase64: true, }); diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx index 333cc6134..7429d8ee5 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -69,15 +69,7 @@ export const StackAvatarsWithTooltip = ({

Waiting

{waitingRecipients.map((recipient: Recipient) => ( -
- - {recipient.email} -
+ ))}
)} From 53cb38a394d3ea521dad4753f282c4df9ae12da8 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 11:14:46 +1100 Subject: [PATCH 26/51] fix: pricing page deopted into csr --- apps/marketing/src/app/(marketing)/pricing/page.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/marketing/src/app/(marketing)/pricing/page.tsx b/apps/marketing/src/app/(marketing)/pricing/page.tsx index a0289987d..92043b3b3 100644 --- a/apps/marketing/src/app/(marketing)/pricing/page.tsx +++ b/apps/marketing/src/app/(marketing)/pricing/page.tsx @@ -1,3 +1,5 @@ +'use client'; + import Link from 'next/link'; import { From 16fb90f4d2963c043185ae46b2d9e489964e0eef Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 11:57:50 +1100 Subject: [PATCH 27/51] chore: v1.2.0 --- apps/marketing/package.json | 2 +- apps/web/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/marketing/package.json b/apps/marketing/package.json index bdd1ade41..a6863c3ff 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/marketing", - "version": "0.1.0", + "version": "1.2.0", "private": true, "license": "AGPL-3.0", "scripts": { diff --git a/apps/web/package.json b/apps/web/package.json index a2ced8ae5..bd3137005 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/web", - "version": "0.1.0", + "version": "1.2.0", "private": true, "license": "AGPL-3.0", "scripts": { From 486b1cbf628954fb024978f41dcf48f8d21e6b94 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 12:43:43 +1100 Subject: [PATCH 28/51] fix: incorrect promise.all usages --- packages/lib/server-only/document/resend-document.tsx | 4 ++-- packages/lib/server-only/document/send-completed-email.ts | 4 ++-- packages/lib/server-only/document/send-document.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/lib/server-only/document/resend-document.tsx b/packages/lib/server-only/document/resend-document.tsx index 3069fc0ac..da4ffcb58 100644 --- a/packages/lib/server-only/document/resend-document.tsx +++ b/packages/lib/server-only/document/resend-document.tsx @@ -57,7 +57,7 @@ export const resendDocument = async ({ documentId, userId, recipients }: ResendD throw new Error('Can not send completed document'); } - await Promise.all([ + await Promise.all( document.Recipient.map(async (recipient) => { const { email, name } = recipient; @@ -95,5 +95,5 @@ export const resendDocument = async ({ documentId, userId, recipients }: ResendD text: render(template, { plainText: true }), }); }), - ]); + ); }; diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index bb6d06b41..226ff43ec 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -32,7 +32,7 @@ export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => const buffer = await getFile(document.documentData); - await Promise.all([ + await Promise.all( document.Recipient.map(async (recipient) => { const { email, name, token } = recipient; @@ -64,5 +64,5 @@ export const sendCompletedEmail = async ({ documentId }: SendDocumentOptions) => ], }); }), - ]); + ); }; diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx index febe619f0..25dc132ba 100644 --- a/packages/lib/server-only/document/send-document.tsx +++ b/packages/lib/server-only/document/send-document.tsx @@ -45,7 +45,7 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) throw new Error('Can not send completed document'); } - await Promise.all([ + await Promise.all( document.Recipient.map(async (recipient) => { const { email, name } = recipient; @@ -96,7 +96,7 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions) }, }); }), - ]); + ); const updatedDocument = await prisma.document.update({ where: { From fbfaca190bdc9796c2ac65321162997f4dee4c1f Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 12:43:55 +1100 Subject: [PATCH 29/51] chore: release 1.2.1 --- apps/marketing/package.json | 2 +- apps/web/package.json | 2 +- package-lock.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/marketing/package.json b/apps/marketing/package.json index a6863c3ff..4aa62f405 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/marketing", - "version": "1.2.0", + "version": "1.2.1", "private": true, "license": "AGPL-3.0", "scripts": { diff --git a/apps/web/package.json b/apps/web/package.json index bd3137005..8e4ac18cc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/web", - "version": "1.2.0", + "version": "1.2.1", "private": true, "license": "AGPL-3.0", "scripts": { diff --git a/package-lock.json b/package-lock.json index d96431451..5e5586719 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ }, "apps/marketing": { "name": "@documenso/marketing", - "version": "0.1.0", + "version": "1.2.1", "license": "AGPL-3.0", "dependencies": { "@documenso/assets": "*", @@ -85,7 +85,7 @@ }, "apps/web": { "name": "@documenso/web", - "version": "0.1.0", + "version": "1.2.1", "license": "AGPL-3.0", "dependencies": { "@documenso/assets": "*", From 7dac5072f7dac6af0698dc58629f42deb90b7efc Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 13:34:03 +1100 Subject: [PATCH 30/51] fix: revert react-email tailwind canary --- package-lock.json | 384 ++++++++++++++++++++++++++++++++---- packages/email/package.json | 2 +- 2 files changed, 345 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e5586719..4d4be5be4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5087,24 +5087,6 @@ "react": "18.2.0" } }, - "node_modules/@react-email/tailwind": { - "version": "0.0.13-canary.1", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.13-canary.1.tgz", - "integrity": "sha512-XnqYPdghS/hkH/6dD+LOHISGSdTTezzYxrpaK3V+5gnxqKRYNi3SzsdeeskhTYXQw9DUk4UU8KREfQda0dAQqw==", - "dependencies": { - "postcss": "8.4.31", - "postcss-css-variables": "0.19.0", - "react": "18.2.0", - "react-dom": "18.2.0", - "tailwindcss": "3.3.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "18.2.0" - } - }, "node_modules/@react-email/text": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.6.tgz", @@ -6473,6 +6455,35 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", @@ -8400,6 +8411,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -8458,6 +8477,22 @@ "node": ">=12" } }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -11049,6 +11084,47 @@ "node": ">=10" } }, + "node_modules/html-dom-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-4.0.0.tgz", + "integrity": "sha512-TUa3wIwi80f5NF8CVWzkopBVqVAtlawUzJoLwVLHns0XSJGynss4jiY0mTWpiDOsuyw+afP+ujjMgRh9CoZcXw==", + "dependencies": { + "domhandler": "5.0.3", + "htmlparser2": "9.0.0" + } + }, + "node_modules/html-dom-parser/node_modules/htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/html-react-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-4.0.0.tgz", + "integrity": "sha512-OzlOavs9lLyBxoRiXbXfODIX/nSShukMtdx3+WSMjon/FF1gJZRq0rBELoR5OswfbN56C0oKpAii7i3yzO/uVQ==", + "dependencies": { + "domhandler": "5.0.3", + "html-dom-parser": "4.0.0", + "react-property": "2.0.0", + "style-to-js": "1.1.3" + }, + "peerDependencies": { + "react": "0.14 || 15 || 16 || 17 || 18" + } + }, "node_modules/html-to-text": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", @@ -14746,27 +14822,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-css-variables": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.19.0.tgz", - "integrity": "sha512-Hr0WEYKLK9VCrY15anHXOd4RCvJy/xRvCnWdplGBeLInwEj6Z14hgzTb2W/39dYTCnS8hnHUfU4/F1zxX0IZuQ==", - "dependencies": { - "balanced-match": "^1.0.0", - "escape-string-regexp": "^1.0.3", - "extend": "^3.0.1" - }, - "peerDependencies": { - "postcss": "^8.2.6" - } - }, - "node_modules/postcss-css-variables/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -15771,6 +15826,11 @@ "node": ">=6" } }, + "node_modules/react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, "node_modules/react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -17325,6 +17385,22 @@ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, + "node_modules/style-to-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz", + "integrity": "sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ==", + "dependencies": { + "style-to-object": "0.4.1" + } + }, + "node_modules/style-to-js/node_modules/style-to-object": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", + "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/style-to-object": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", @@ -17955,6 +18031,220 @@ "darwin" ] }, + "node_modules/tw-to-css": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/tw-to-css/-/tw-to-css-0.0.11.tgz", + "integrity": "sha512-uIJuEBIwyHzZg9xyGyEgDWHIkbAwEC4bhEHQ4THPuN5SToR7Zlhes5ffMjqtrv+WdtTmudTHTdc9VwUldy0FxQ==", + "dependencies": { + "postcss": "8.4.21", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.2.7" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tw-to-css/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/tw-to-css/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tw-to-css/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tw-to-css/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tw-to-css/node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/tw-to-css/node_modules/postcss-css-variables": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/postcss-css-variables/-/postcss-css-variables-0.18.0.tgz", + "integrity": "sha512-lYS802gHbzn1GI+lXvy9MYIYDuGnl1WB4FTKoqMQqJ3Mab09A7a/1wZvGTkCEZJTM8mSbIyb1mJYn8f0aPye0Q==", + "dependencies": { + "balanced-match": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "extend": "^3.0.1" + }, + "peerDependencies": { + "postcss": "^8.2.6" + } + }, + "node_modules/tw-to-css/node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/tw-to-css/node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tw-to-css/node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/tw-to-css/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tw-to-css/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tw-to-css/node_modules/tailwindcss": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tw-to-css/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -18991,7 +19281,7 @@ "@react-email/render": "0.0.9", "@react-email/row": "0.0.6", "@react-email/section": "0.0.10", - "@react-email/tailwind": "0.0.13-canary.1", + "@react-email/tailwind": "0.0.9", "@react-email/text": "0.0.6", "nodemailer": "^6.9.3", "react-email": "^1.9.5", @@ -19004,6 +19294,20 @@ "tsup": "^7.1.0" } }, + "packages/email/node_modules/@react-email/tailwind": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-0.0.9.tgz", + "integrity": "sha512-hVGMTVjg2u51TU8dMInc8l3R6+O2t54sx0mzQnJ2mOLwJQkfibh3HA4lmEa0V1qlv8mT/nti0vzC6QshdCxqjg==", + "dependencies": { + "html-react-parser": "4.0.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "tw-to-css": "0.0.11" + }, + "engines": { + "node": ">=16.0.0" + } + }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", diff --git a/packages/email/package.json b/packages/email/package.json index 8fcadb647..d41a4c24c 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -33,7 +33,7 @@ "@react-email/render": "0.0.9", "@react-email/row": "0.0.6", "@react-email/section": "0.0.10", - "@react-email/tailwind": "0.0.13-canary.1", + "@react-email/tailwind": "0.0.9", "@react-email/text": "0.0.6", "nodemailer": "^6.9.3", "react-email": "^1.9.5", From 39d18e93c54389acdaf125f76ad3592041b1d566 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 13:34:36 +1100 Subject: [PATCH 31/51] chore: v1.2.2 --- apps/marketing/package.json | 2 +- apps/web/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/marketing/package.json b/apps/marketing/package.json index 4aa62f405..8bc24edbe 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/marketing", - "version": "1.2.1", + "version": "1.2.2", "private": true, "license": "AGPL-3.0", "scripts": { diff --git a/apps/web/package.json b/apps/web/package.json index 8e4ac18cc..831a100db 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/web", - "version": "1.2.1", + "version": "1.2.2", "private": true, "license": "AGPL-3.0", "scripts": { From 6b519a67c206da5f7b86a520e3946d1785fa1608 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 14:55:26 +1100 Subject: [PATCH 32/51] fix: add guard --- .../app/(dashboard)/admin/users/fetch-users.actions.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/web/src/app/(dashboard)/admin/users/fetch-users.actions.ts b/apps/web/src/app/(dashboard)/admin/users/fetch-users.actions.ts index 335f32e08..61d5e1829 100644 --- a/apps/web/src/app/(dashboard)/admin/users/fetch-users.actions.ts +++ b/apps/web/src/app/(dashboard)/admin/users/fetch-users.actions.ts @@ -1,8 +1,16 @@ 'use server'; +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; import { findUsers } from '@documenso/lib/server-only/user/get-all-users'; export async function search(search: string, page: number, perPage: number) { + const { user } = await getRequiredServerComponentSession(); + + if (!isAdmin(user)) { + throw new Error('Unauthorized'); + } + const results = await findUsers({ username: search, email: search, page, perPage }); return results; From b903de983b11edbb15e70e0747d1ee3403358765 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 2 Dec 2023 14:56:00 +1100 Subject: [PATCH 33/51] chore: v1.2.3 --- apps/marketing/package.json | 2 +- apps/web/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/marketing/package.json b/apps/marketing/package.json index 8bc24edbe..83d13d07c 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/marketing", - "version": "1.2.2", + "version": "1.2.3", "private": true, "license": "AGPL-3.0", "scripts": { diff --git a/apps/web/package.json b/apps/web/package.json index 831a100db..47d94fb63 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@documenso/web", - "version": "1.2.2", + "version": "1.2.3", "private": true, "license": "AGPL-3.0", "scripts": { From c46a69f865c8e69a9bf3376574dd5ac2171e64bc Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sat, 2 Dec 2023 22:30:10 -0500 Subject: [PATCH 34/51] feat: stepper component --- packages/ui/primitives/stepper.tsx | 80 ++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 packages/ui/primitives/stepper.tsx diff --git a/packages/ui/primitives/stepper.tsx b/packages/ui/primitives/stepper.tsx new file mode 100644 index 000000000..e4d87a7ba --- /dev/null +++ b/packages/ui/primitives/stepper.tsx @@ -0,0 +1,80 @@ +import React, { useEffect, useState } from 'react'; +import type { FC } from 'react'; + +type StepProps = { + readonly useStep: () => { + stepIndex: number; + currentStep: number; + totalSteps: number; + isFirst: boolean; + isLast: boolean; + nextStep: () => void; + previousStep: () => void; + }; +}; + +export type WithStep = T & StepProps; + +type StepperProps = { + children: React.ReactNode; + onComplete?: () => void; + onStepChanged?: (currentStep: number) => void; + currentStep?: number; + setCurrentStep?: (step: number) => void; +}; + +export const Stepper: FC = ({ + children, + onComplete, + onStepChanged, + currentStep: propCurrentStep, + setCurrentStep: propSetCurrentStep, +}) => { + const [stateCurrentStep, stateSetCurrentStep] = useState(1); + + // Determine if props are provided, otherwise use state + const isControlled = propCurrentStep !== undefined && propSetCurrentStep !== undefined; + const currentStep = isControlled ? propCurrentStep : stateCurrentStep; + const setCurrentStep = isControlled ? propSetCurrentStep : stateSetCurrentStep; + + const totalSteps = React.Children.count(children); + + const nextStep = () => { + if (currentStep < totalSteps) { + setCurrentStep(currentStep + 1); + } else { + onComplete && onComplete(); + } + }; + + const previousStep = () => { + if (currentStep > 1) { + setCurrentStep(currentStep - 1); + } + }; + + useEffect(() => { + onStepChanged && onStepChanged(currentStep); + }, [currentStep, onStepChanged]); + + const useStep = (stepIndex: number) => ({ + stepIndex, + currentStep, + totalSteps, + isFirst: currentStep === 1, + isLast: currentStep === totalSteps, + nextStep, + previousStep, + }); + + const renderStep = (child: React.ReactNode, index: number) => { + if (!React.isValidElement(child)) return null; + return index + 1 === currentStep + ? React.cloneElement(child, { + useStep: () => useStep(index), + }) + : null; + }; + + return <>{React.Children.toArray(children).map(renderStep)}; +}; From a98b429052f08accfaaebf249263f14c1160ced9 Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sat, 2 Dec 2023 22:42:59 -0500 Subject: [PATCH 35/51] feat: stepper refactor example --- .../documents/[id]/edit-document.tsx | 75 ++++++++----------- .../primitives/document-flow/add-fields.tsx | 21 +++--- .../primitives/document-flow/add-signers.tsx | 24 +++--- .../primitives/document-flow/add-subject.tsx | 22 +++--- .../ui/primitives/document-flow/add-title.tsx | 15 ++-- .../document-flow/document-flow-root.tsx | 3 +- packages/ui/primitives/document-flow/types.ts | 2 +- 7 files changed, 80 insertions(+), 82 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index e775bffdc..8aface5a6 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -5,7 +5,6 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; -import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; @@ -24,6 +23,7 @@ import { } from '@documenso/ui/primitives/document-flow/document-flow-root'; import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; +import { Stepper } from '@documenso/ui/primitives/stepper'; import { useToast } from '@documenso/ui/primitives/use-toast'; export type EditDocumentFormProps = { @@ -35,7 +35,12 @@ export type EditDocumentFormProps = { documentData: DocumentData; }; -type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; +enum EditDocumentStepEnum { + TITLE, + SIGNERS, + FIELDS, + SUBJECT, +} export const EditDocumentForm = ({ className, @@ -48,42 +53,35 @@ export const EditDocumentForm = ({ const { toast } = useToast(); const router = useRouter(); - const [step, setStep] = useState( - document.status === DocumentStatus.DRAFT ? 'title' : 'signers', - ); + // controlled stepper state + const [stepIdx, setStepIdx] = useState(0); const { mutateAsync: addTitle } = trpc.document.setTitleForDocument.useMutation(); const { mutateAsync: addFields } = trpc.field.addFields.useMutation(); const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation(); const { mutateAsync: sendDocument } = trpc.document.sendDocument.useMutation(); - const documentFlow: Record = { - title: { + // controlled stepper next + const nextStep = () => setStepIdx(stepIdx + 1); + + const documentFlow: DocumentFlowStep[] = [ + { title: 'Add Title', description: 'Add the title to the document.', - stepIndex: 1, }, - signers: { + { title: 'Add Signers', description: 'Add the people who will sign the document.', - stepIndex: 2, - onBackStep: () => document.status === DocumentStatus.DRAFT && setStep('title'), }, - fields: { + { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', - stepIndex: 3, - onBackStep: () => setStep('signers'), }, - subject: { + { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', - stepIndex: 4, - onBackStep: () => setStep('fields'), }, - }; - - const currentDocumentFlow = documentFlow[step]; + ]; const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => { try { @@ -95,7 +93,7 @@ export const EditDocumentForm = ({ router.refresh(); - setStep('signers'); + nextStep(); } catch (err) { console.error(err); @@ -116,8 +114,7 @@ export const EditDocumentForm = ({ }); router.refresh(); - - setStep('fields'); + nextStep(); } catch (err) { console.error(err); @@ -138,8 +135,7 @@ export const EditDocumentForm = ({ }); router.refresh(); - - setStep('subject'); + nextStep(); } catch (err) { console.error(err); @@ -181,6 +177,8 @@ export const EditDocumentForm = ({ } }; + const currentDocumentFlow = documentFlow[stepIdx]; + return (
- - {step === 'title' && ( + setStepIdx(step - 1)}> - )} - - {step === 'signers' && ( - )} - - {step === 'fields' && ( - )} - - {step === 'subject' && ( - )} +
diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index f662dca8b..801070d15 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -11,7 +11,8 @@ import { getBoundingClientRect } from '@documenso/lib/client-only/get-bounding-c import { useDocumentElement } from '@documenso/lib/client-only/hooks/use-document-element'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { nanoid } from '@documenso/lib/universal/id'; -import { Field, FieldType, Recipient, SendStatus } from '@documenso/prisma/client'; +import type { Field, Recipient } from '@documenso/prisma/client'; +import { FieldType, SendStatus } from '@documenso/prisma/client'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Card, CardContent } from '@documenso/ui/primitives/card'; @@ -25,7 +26,8 @@ import { import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; -import { TAddFieldsFormSchema } from './add-fields.types'; +import type { WithStep } from '../stepper'; +import type { TAddFieldsFormSchema } from './add-fields.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, @@ -33,7 +35,8 @@ import { DocumentFlowFormContainerStep, } from './document-flow-root'; import { FieldItem } from './field-item'; -import { DocumentFlowStep, FRIENDLY_FIELD_TYPE } from './types'; +import type { DocumentFlowStep } from './types'; +import { FRIENDLY_FIELD_TYPE } from './types'; const fontCaveat = Caveat({ weight: ['500'], @@ -53,7 +56,6 @@ export type AddFieldsFormProps = { hideRecipients?: boolean; recipients: Recipient[]; fields: Field[]; - numberOfSteps: number; onSubmit: (_data: TAddFieldsFormSchema) => void; }; @@ -62,10 +64,11 @@ export const AddFieldsFormPartial = ({ hideRecipients = false, recipients, fields, - numberOfSteps, onSubmit, -}: AddFieldsFormProps) => { + useStep, // Stepper +}: WithStep) => { const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement(); + const { currentStep, totalSteps, nextStep, previousStep } = useStep(); const { control, @@ -513,15 +516,15 @@ export const AddFieldsFormPartial = ({ { - documentFlow.onBackStep?.(); + previousStep(); remove(); }} onGoNextClick={() => void onFormSubmit()} diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index b623b0d4e..977f95bdd 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -9,45 +9,49 @@ import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { nanoid } from '@documenso/lib/universal/id'; -import { DocumentStatus, Field, Recipient, SendStatus } from '@documenso/prisma/client'; -import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; +import type { Field, Recipient } from '@documenso/prisma/client'; +import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; +import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { Button } from '@documenso/ui/primitives/button'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import { TAddSignersFormSchema, ZAddSignersFormSchema } from './add-signers.types'; +import type { WithStep } from '../stepper'; +import type { TAddSignersFormSchema } from './add-signers.types'; +import { ZAddSignersFormSchema } from './add-signers.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, DocumentFlowFormContainerStep, } from './document-flow-root'; -import { DocumentFlowStep } from './types'; +import type { DocumentFlowStep } from './types'; export type AddSignersFormProps = { documentFlow: DocumentFlowStep; recipients: Recipient[]; fields: Field[]; document: DocumentWithData; - numberOfSteps: number; onSubmit: (_data: TAddSignersFormSchema) => void; }; export const AddSignersFormPartial = ({ documentFlow, - numberOfSteps, recipients, document, fields: _fields, onSubmit, -}: AddSignersFormProps) => { + useStep, // Stepper +}: WithStep) => { const { toast } = useToast(); const { remaining } = useLimits(); const initialId = useId(); + const { currentStep, totalSteps, nextStep, previousStep } = useStep(); + const { control, handleSubmit, @@ -221,15 +225,15 @@ export const AddSignersFormPartial = ({ void onFormSubmit()} /> diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index 1bf3b2cb4..e2a10afa3 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -2,28 +2,29 @@ import { useForm } from 'react-hook-form'; -import { DocumentStatus, Field, Recipient } from '@documenso/prisma/client'; -import { DocumentWithData } from '@documenso/prisma/types/document-with-data'; +import type { Field, Recipient } from '@documenso/prisma/client'; +import { DocumentStatus } from '@documenso/prisma/client'; +import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { Textarea } from '@documenso/ui/primitives/textarea'; -import { TAddSubjectFormSchema } from './add-subject.types'; +import type { WithStep } from '../stepper'; +import type { TAddSubjectFormSchema } from './add-subject.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, DocumentFlowFormContainerStep, } from './document-flow-root'; -import { DocumentFlowStep } from './types'; +import type { DocumentFlowStep } from './types'; export type AddSubjectFormProps = { documentFlow: DocumentFlowStep; recipients: Recipient[]; fields: Field[]; document: DocumentWithData; - numberOfSteps: number; onSubmit: (_data: TAddSubjectFormSchema) => void; }; @@ -32,9 +33,9 @@ export const AddSubjectFormPartial = ({ recipients: _recipients, fields: _fields, document, - numberOfSteps, onSubmit, -}: AddSubjectFormProps) => { + useStep, +}: WithStep) => { const { register, handleSubmit, @@ -49,6 +50,7 @@ export const AddSubjectFormPartial = ({ }); const onFormSubmit = handleSubmit(onSubmit); + const { currentStep, totalSteps, nextStep, previousStep } = useStep(); return ( <> @@ -124,15 +126,15 @@ export const AddSubjectFormPartial = ({ void onFormSubmit()} /> diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 3ec44b17d..75cd47e93 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -8,6 +8,7 @@ import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-messa import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; +import type { WithStep } from '../stepper'; import type { TAddTitleFormSchema } from './add-title.types'; import { DocumentFlowFormContainerActions, @@ -22,7 +23,6 @@ export type AddTitleFormProps = { recipients: Recipient[]; fields: Field[]; document: DocumentWithData; - numberOfSteps: number; onSubmit: (_data: TAddTitleFormSchema) => void; }; @@ -31,9 +31,9 @@ export const AddTitleFormPartial = ({ recipients: _recipients, fields: _fields, document, - numberOfSteps, onSubmit, -}: AddTitleFormProps) => { + useStep, +}: WithStep) => { const { register, handleSubmit, @@ -46,6 +46,8 @@ export const AddTitleFormPartial = ({ const onFormSubmit = handleSubmit(onSubmit); + const { stepIndex, currentStep, totalSteps, previousStep } = useStep(); + return ( <> @@ -72,14 +74,15 @@ export const AddTitleFormPartial = ({ void onFormSubmit()} /> diff --git a/packages/ui/primitives/document-flow/document-flow-root.tsx b/packages/ui/primitives/document-flow/document-flow-root.tsx index aec74dd6c..9142f4258 100644 --- a/packages/ui/primitives/document-flow/document-flow-root.tsx +++ b/packages/ui/primitives/document-flow/document-flow-root.tsx @@ -1,6 +1,7 @@ 'use client'; -import React, { HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; +import React from 'react'; import { motion } from 'framer-motion'; diff --git a/packages/ui/primitives/document-flow/types.ts b/packages/ui/primitives/document-flow/types.ts index c9244ad05..677dc931b 100644 --- a/packages/ui/primitives/document-flow/types.ts +++ b/packages/ui/primitives/document-flow/types.ts @@ -53,7 +53,7 @@ export const FRIENDLY_FIELD_TYPE: Record = { export interface DocumentFlowStep { title: string; description: string; - stepIndex: number; + stepIndex?: number; onBackStep?: () => unknown; onNextStep?: () => unknown; } From eccf63dcfdf22a0b3cd8941ca94207f1223cb0c5 Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sat, 2 Dec 2023 23:56:07 -0500 Subject: [PATCH 36/51] chore: refactor --- packages/ui/primitives/stepper.tsx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/ui/primitives/stepper.tsx b/packages/ui/primitives/stepper.tsx index e4d87a7ba..f827139e0 100644 --- a/packages/ui/primitives/stepper.tsx +++ b/packages/ui/primitives/stepper.tsx @@ -57,8 +57,8 @@ export const Stepper: FC = ({ onStepChanged && onStepChanged(currentStep); }, [currentStep, onStepChanged]); - const useStep = (stepIndex: number) => ({ - stepIndex, + const useStep = () => ({ + stepIndex: currentStep - 1, currentStep, totalSteps, isFirst: currentStep === 1, @@ -67,14 +67,13 @@ export const Stepper: FC = ({ previousStep, }); - const renderStep = (child: React.ReactNode, index: number) => { - if (!React.isValidElement(child)) return null; - return index + 1 === currentStep - ? React.cloneElement(child, { - useStep: () => useStep(index), - }) - : null; - }; + // empty stepper + if (totalSteps === 0) return null; - return <>{React.Children.toArray(children).map(renderStep)}; + const currentChild = React.Children.toArray(children)[currentStep - 1]; + + // type validation + if (!React.isValidElement(currentChild)) return null; + + return <>{React.cloneElement(currentChild, { useStep })}; }; From 40a4ec4436224b2616a3e2c339bddff90f5675cb Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sun, 3 Dec 2023 01:15:59 -0500 Subject: [PATCH 37/51] refactor: useContext & remove enum --- .../documents/[id]/edit-document.tsx | 53 ++++++++++--------- .../primitives/document-flow/add-fields.tsx | 7 ++- .../primitives/document-flow/add-signers.tsx | 7 ++- .../primitives/document-flow/add-subject.tsx | 7 ++- .../ui/primitives/document-flow/add-title.tsx | 5 +- packages/ui/primitives/stepper.tsx | 52 +++++++++--------- 6 files changed, 66 insertions(+), 65 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 8aface5a6..73ec10a56 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -4,6 +4,7 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; +import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentData, Field, Recipient, User } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; import { trpc } from '@documenso/trpc/react'; @@ -35,12 +36,8 @@ export type EditDocumentFormProps = { documentData: DocumentData; }; -enum EditDocumentStepEnum { - TITLE, - SIGNERS, - FIELDS, - SUBJECT, -} +type EditDocumentStep = 'title' | 'signers' | 'fields' | 'subject'; +const EditDocumentSteps: EditDocumentStep[] = ['title', 'signers', 'fields', 'subject']; export const EditDocumentForm = ({ className, @@ -54,34 +51,37 @@ export const EditDocumentForm = ({ const router = useRouter(); // controlled stepper state - const [stepIdx, setStepIdx] = useState(0); + const [step, setStep] = useState( + document.status === DocumentStatus.DRAFT ? 'title' : 'signers', + ); const { mutateAsync: addTitle } = trpc.document.setTitleForDocument.useMutation(); const { mutateAsync: addFields } = trpc.field.addFields.useMutation(); const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation(); const { mutateAsync: sendDocument } = trpc.document.sendDocument.useMutation(); - // controlled stepper next - const nextStep = () => setStepIdx(stepIdx + 1); - - const documentFlow: DocumentFlowStep[] = [ - { + const documentFlow: Record = { + title: { title: 'Add Title', description: 'Add the title to the document.', + stepIndex: 1, }, - { + signers: { title: 'Add Signers', description: 'Add the people who will sign the document.', + stepIndex: 2, }, - { + fields: { title: 'Add Fields', description: 'Add all relevant fields for each recipient.', + stepIndex: 3, }, - { + subject: { title: 'Add Subject', description: 'Add the subject and message you wish to send to signers.', + stepIndex: 4, }, - ]; + }; const onAddTitleFormSubmit = async (data: TAddTitleFormSchema) => { try { @@ -93,7 +93,7 @@ export const EditDocumentForm = ({ router.refresh(); - nextStep(); + setStep('signers'); } catch (err) { console.error(err); @@ -114,7 +114,7 @@ export const EditDocumentForm = ({ }); router.refresh(); - nextStep(); + setStep('fields'); } catch (err) { console.error(err); @@ -135,7 +135,7 @@ export const EditDocumentForm = ({ }); router.refresh(); - nextStep(); + setStep('subject'); } catch (err) { console.error(err); @@ -177,7 +177,7 @@ export const EditDocumentForm = ({ } }; - const currentDocumentFlow = documentFlow[stepIdx]; + const currentDocumentFlow = documentFlow[step]; return (
@@ -199,10 +199,13 @@ export const EditDocumentForm = ({ title={currentDocumentFlow.title} description={currentDocumentFlow.description} /> - setStepIdx(step - 1)}> + setStep(EditDocumentSteps[step - 1])} + > ) => { +}: AddFieldsFormProps) => { const { isWithinPageBounds, getFieldPosition, getPage } = useDocumentElement(); - const { currentStep, totalSteps, nextStep, previousStep } = useStep(); + const { currentStep, totalSteps, previousStep } = useStep(); const { control, diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index 977f95bdd..f549b7220 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -18,7 +18,7 @@ import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; -import type { WithStep } from '../stepper'; +import { useStep } from '../stepper'; import type { TAddSignersFormSchema } from './add-signers.types'; import { ZAddSignersFormSchema } from './add-signers.types'; import { @@ -43,14 +43,13 @@ export const AddSignersFormPartial = ({ document, fields: _fields, onSubmit, - useStep, // Stepper -}: WithStep) => { +}: AddSignersFormProps) => { const { toast } = useToast(); const { remaining } = useLimits(); const initialId = useId(); - const { currentStep, totalSteps, nextStep, previousStep } = useStep(); + const { currentStep, totalSteps, previousStep } = useStep(); const { control, diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index e2a10afa3..e5456fb43 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -10,7 +10,7 @@ import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { Textarea } from '@documenso/ui/primitives/textarea'; -import type { WithStep } from '../stepper'; +import { useStep } from '../stepper'; import type { TAddSubjectFormSchema } from './add-subject.types'; import { DocumentFlowFormContainerActions, @@ -34,8 +34,7 @@ export const AddSubjectFormPartial = ({ fields: _fields, document, onSubmit, - useStep, -}: WithStep) => { +}: AddSubjectFormProps) => { const { register, handleSubmit, @@ -50,7 +49,7 @@ export const AddSubjectFormPartial = ({ }); const onFormSubmit = handleSubmit(onSubmit); - const { currentStep, totalSteps, nextStep, previousStep } = useStep(); + const { currentStep, totalSteps, previousStep } = useStep(); return ( <> diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 75cd47e93..27b6aff03 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -8,7 +8,7 @@ import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-messa import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; -import type { WithStep } from '../stepper'; +import { useStep } from '../stepper'; import type { TAddTitleFormSchema } from './add-title.types'; import { DocumentFlowFormContainerActions, @@ -32,8 +32,7 @@ export const AddTitleFormPartial = ({ fields: _fields, document, onSubmit, - useStep, -}: WithStep) => { +}: AddTitleFormProps) => { const { register, handleSubmit, diff --git a/packages/ui/primitives/stepper.tsx b/packages/ui/primitives/stepper.tsx index f827139e0..795304e8c 100644 --- a/packages/ui/primitives/stepper.tsx +++ b/packages/ui/primitives/stepper.tsx @@ -1,26 +1,24 @@ -import React, { useEffect, useState } from 'react'; +import React, { createContext, useContext, useEffect, useState } from 'react'; import type { FC } from 'react'; -type StepProps = { - readonly useStep: () => { - stepIndex: number; - currentStep: number; - totalSteps: number; - isFirst: boolean; - isLast: boolean; - nextStep: () => void; - previousStep: () => void; - }; +type StepContextType = { + stepIndex: number; + currentStep: number; + totalSteps: number; + isFirst: boolean; + isLast: boolean; + nextStep: () => void; + previousStep: () => void; }; -export type WithStep = T & StepProps; +const StepContext = createContext(null); type StepperProps = { children: React.ReactNode; onComplete?: () => void; onStepChanged?: (currentStep: number) => void; - currentStep?: number; - setCurrentStep?: (step: number) => void; + currentStep?: number; // external control prop + setCurrentStep?: (step: number) => void; // external control function }; export const Stepper: FC = ({ @@ -57,7 +55,12 @@ export const Stepper: FC = ({ onStepChanged && onStepChanged(currentStep); }, [currentStep, onStepChanged]); - const useStep = () => ({ + // Empty stepper + if (totalSteps === 0) return null; + + const currentChild = React.Children.toArray(children)[currentStep - 1]; + + const stepContextValue: StepContextType = { stepIndex: currentStep - 1, currentStep, totalSteps, @@ -65,15 +68,14 @@ export const Stepper: FC = ({ isLast: currentStep === totalSteps, nextStep, previousStep, - }); + }; - // empty stepper - if (totalSteps === 0) return null; - - const currentChild = React.Children.toArray(children)[currentStep - 1]; - - // type validation - if (!React.isValidElement(currentChild)) return null; - - return <>{React.cloneElement(currentChild, { useStep })}; + return {currentChild}; +}; + +/** Hook for children to use the step context */ +export const useStep = (): StepContextType => { + const context = useContext(StepContext); + if (!context) throw new Error('useStep must be used within a Stepper'); + return context; }; From 43b1a14415850fbe8b3758b86b2edf55506cd6b4 Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sun, 3 Dec 2023 11:21:51 -0500 Subject: [PATCH 38/51] chore: let code breath --- packages/ui/primitives/stepper.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/stepper.tsx b/packages/ui/primitives/stepper.tsx index 795304e8c..35086ff17 100644 --- a/packages/ui/primitives/stepper.tsx +++ b/packages/ui/primitives/stepper.tsx @@ -56,7 +56,9 @@ export const Stepper: FC = ({ }, [currentStep, onStepChanged]); // Empty stepper - if (totalSteps === 0) return null; + if (totalSteps === 0) { + return null; + } const currentChild = React.Children.toArray(children)[currentStep - 1]; @@ -76,6 +78,8 @@ export const Stepper: FC = ({ /** Hook for children to use the step context */ export const useStep = (): StepContextType => { const context = useContext(StepContext); - if (!context) throw new Error('useStep must be used within a Stepper'); + if (!context) { + throw new Error('useStep must be used within a Stepper'); + } return context; }; From 340c9298064bb1f667376ea0ea01142d1c4d52dc Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sun, 3 Dec 2023 11:36:18 -0500 Subject: [PATCH 39/51] refactor: edit doc --- .../src/app/(dashboard)/documents/[id]/edit-document.tsx | 9 +-------- packages/ui/primitives/document-flow/add-fields.tsx | 5 +++++ packages/ui/primitives/document-flow/add-signers.tsx | 5 +++++ packages/ui/primitives/document-flow/add-subject.tsx | 5 +++++ packages/ui/primitives/document-flow/add-title.tsx | 5 +++++ 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 73ec10a56..53da2d353 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -18,10 +18,7 @@ import { AddSubjectFormPartial } from '@documenso/ui/primitives/document-flow/ad import type { TAddSubjectFormSchema } from '@documenso/ui/primitives/document-flow/add-subject.types'; import { AddTitleFormPartial } from '@documenso/ui/primitives/document-flow/add-title'; import type { TAddTitleFormSchema } from '@documenso/ui/primitives/document-flow/add-title.types'; -import { - DocumentFlowFormContainer, - DocumentFlowFormContainerHeader, -} from '@documenso/ui/primitives/document-flow/document-flow-root'; +import { DocumentFlowFormContainer } from '@documenso/ui/primitives/document-flow/document-flow-root'; import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; import { Stepper } from '@documenso/ui/primitives/stepper'; @@ -195,10 +192,6 @@ export const EditDocumentForm = ({ className="lg:h-[calc(100vh-6rem)]" onSubmit={(e) => e.preventDefault()} > - setStep(EditDocumentSteps[step - 1])} diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index 9ffcd5d80..112f2f849 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -32,6 +32,7 @@ import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, + DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, } from './document-flow-root'; import { FieldItem } from './field-item'; @@ -289,6 +290,10 @@ export const AddFieldsFormPartial = ({ return ( <> +
{selectedField && ( diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index f549b7220..13af03d26 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -25,6 +25,7 @@ import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, + DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, } from './document-flow-root'; import type { DocumentFlowStep } from './types'; @@ -129,6 +130,10 @@ export const AddSignersFormPartial = ({ return ( <> +
diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index e5456fb43..e9e761af0 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -16,6 +16,7 @@ import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, + DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, } from './document-flow-root'; import type { DocumentFlowStep } from './types'; @@ -53,6 +54,10 @@ export const AddSubjectFormPartial = ({ return ( <> +
diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 27b6aff03..2b91e1033 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -14,6 +14,7 @@ import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, + DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, } from './document-flow-root'; import type { DocumentFlowStep } from './types'; @@ -49,6 +50,10 @@ export const AddTitleFormPartial = ({ return ( <> +
From 859b789018a4a7ff654e6e7f7ac0f2cd9a00c306 Mon Sep 17 00:00:00 2001 From: mikezzb Date: Sun, 3 Dec 2023 12:50:56 -0500 Subject: [PATCH 40/51] feat: isCompleting --- packages/ui/primitives/stepper.tsx | 38 +++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/ui/primitives/stepper.tsx b/packages/ui/primitives/stepper.tsx index 35086ff17..71a4d025c 100644 --- a/packages/ui/primitives/stepper.tsx +++ b/packages/ui/primitives/stepper.tsx @@ -1,7 +1,8 @@ -import React, { createContext, useContext, useEffect, useState } from 'react'; +import React, { createContext, useContext, useState } from 'react'; import type { FC } from 'react'; type StepContextType = { + isCompleting: boolean; stepIndex: number; currentStep: number; totalSteps: number; @@ -15,10 +16,11 @@ const StepContext = createContext(null); type StepperProps = { children: React.ReactNode; - onComplete?: () => void; + onComplete?: () => void | Promise; onStepChanged?: (currentStep: number) => void; currentStep?: number; // external control prop setCurrentStep?: (step: number) => void; // external control function + isAsyncComplete?: boolean; }; export const Stepper: FC = ({ @@ -27,8 +29,10 @@ export const Stepper: FC = ({ onStepChanged, currentStep: propCurrentStep, setCurrentStep: propSetCurrentStep, + isAsyncComplete, }) => { const [stateCurrentStep, stateSetCurrentStep] = useState(1); + const [isCompleting, setIsCompleting] = useState(false); // Determine if props are provided, otherwise use state const isControlled = propCurrentStep !== undefined && propSetCurrentStep !== undefined; @@ -37,24 +41,39 @@ export const Stepper: FC = ({ const totalSteps = React.Children.count(children); + const handleComplete = async () => { + if (!onComplete) { + return; + } + if (!isAsyncComplete) { + void onComplete(); + return; + } + setIsCompleting(true); + await onComplete(); + // handle async complete action + setIsCompleting(false); + }; + + const handleStepChange = (nextStep: number) => { + setCurrentStep(nextStep); + onStepChanged && onStepChanged(nextStep); + }; + const nextStep = () => { if (currentStep < totalSteps) { - setCurrentStep(currentStep + 1); + void handleStepChange(currentStep + 1); } else { - onComplete && onComplete(); + void handleComplete(); } }; const previousStep = () => { if (currentStep > 1) { - setCurrentStep(currentStep - 1); + void handleStepChange(currentStep - 1); } }; - useEffect(() => { - onStepChanged && onStepChanged(currentStep); - }, [currentStep, onStepChanged]); - // Empty stepper if (totalSteps === 0) { return null; @@ -63,6 +82,7 @@ export const Stepper: FC = ({ const currentChild = React.Children.toArray(children)[currentStep - 1]; const stepContextValue: StepContextType = { + isCompleting, stepIndex: currentStep - 1, currentStep, totalSteps, From bfedabdc10da834536cf75936f5b2720473c1995 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 5 Dec 2023 03:54:41 +0100 Subject: [PATCH 41/51] fix: increase e2e test timeout (#682) --- .github/workflows/e2e-tests.yml | 28 ++++++++----------- apps/web/package.json | 1 + package-lock.json | 4 +-- packages/app-tests/package.json | 2 +- packages/app-tests/playwright.config.ts | 4 +++ .../migration.sql | 5 ++++ packages/prisma/schema.prisma | 2 +- 7 files changed, 25 insertions(+), 21 deletions(-) create mode 100644 packages/prisma/migrations/20231205000309_add_cascade_delete_for_verification_tokens/migration.sql diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index a37f001d1..f2342f446 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -8,19 +8,6 @@ jobs: e2e_tests: timeout-minutes: 60 runs-on: ubuntu-latest - services: - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 @@ -28,24 +15,31 @@ jobs: node-version: 18 - name: Install dependencies run: npm ci + - name: Copy env run: cp .env.example .env + + - name: Start Services + run: npm run dx:up + - name: Install Playwright Browsers run: npx playwright install --with-deps + - name: Generate Prisma Client run: npm run prisma:generate -w @documenso/prisma + - name: Create the database run: npm run prisma:migrate-dev + - name: Run Playwright tests run: npm run ci + - uses: actions/upload-artifact@v3 if: always() with: - name: playwright-report - path: playwright-report/ + name: test-results + path: "packages/app-tests/**/test-results/*" retention-days: 30 env: - NEXT_PRIVATE_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/documenso - NEXT_PRIVATE_DIRECT_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/documenso TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ vars.TURBO_TEAM }} diff --git a/apps/web/package.json b/apps/web/package.json index 47d94fb63..150982c2d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,6 +8,7 @@ "build": "next build", "start": "next start", "lint": "next lint", + "e2e:prepare": "next build && next start", "lint:fix": "next lint --fix", "clean": "rimraf .next && rimraf node_modules", "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" diff --git a/package-lock.json b/package-lock.json index 4d4be5be4..80f31d7a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ }, "apps/marketing": { "name": "@documenso/marketing", - "version": "1.2.1", + "version": "1.2.3", "license": "AGPL-3.0", "dependencies": { "@documenso/assets": "*", @@ -85,7 +85,7 @@ }, "apps/web": { "name": "@documenso/web", - "version": "1.2.1", + "version": "1.2.3", "license": "AGPL-3.0", "dependencies": { "@documenso/assets": "*", diff --git a/packages/app-tests/package.json b/packages/app-tests/package.json index 92cfd169d..e6f09a0fc 100644 --- a/packages/app-tests/package.json +++ b/packages/app-tests/package.json @@ -6,7 +6,7 @@ "main": "index.js", "scripts": { "test:dev": "playwright test", - "test:e2e": "start-server-and-test \"(cd ../../apps/web && npm run start)\" http://localhost:3000 \"playwright test\"" + "test:e2e": "start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\"" }, "keywords": [], "author": "", diff --git a/packages/app-tests/playwright.config.ts b/packages/app-tests/playwright.config.ts index 463b6f97d..672c2f7ef 100644 --- a/packages/app-tests/playwright.config.ts +++ b/packages/app-tests/playwright.config.ts @@ -28,8 +28,12 @@ export default defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', + + video: 'retain-on-failure', }, + timeout: 30_000, + /* Configure projects for major browsers */ projects: [ { diff --git a/packages/prisma/migrations/20231205000309_add_cascade_delete_for_verification_tokens/migration.sql b/packages/prisma/migrations/20231205000309_add_cascade_delete_for_verification_tokens/migration.sql new file mode 100644 index 000000000..26d7cce51 --- /dev/null +++ b/packages/prisma/migrations/20231205000309_add_cascade_delete_for_verification_tokens/migration.sql @@ -0,0 +1,5 @@ +-- DropForeignKey +ALTER TABLE "VerificationToken" DROP CONSTRAINT "VerificationToken_userId_fkey"; + +-- AddForeignKey +ALTER TABLE "VerificationToken" ADD CONSTRAINT "VerificationToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 7407bc5c0..2c6f1113e 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -60,7 +60,7 @@ model VerificationToken { expires DateTime createdAt DateTime @default(now()) userId Int - user User @relation(fields: [userId], references: [id]) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) } enum SubscriptionStatus { From 8ab1b0cf6b088e16e37ae6d0aa6594edc06f9434 Mon Sep 17 00:00:00 2001 From: Kritarth Sharma Date: Tue, 5 Dec 2023 08:30:48 +0530 Subject: [PATCH 42/51] fix: add workspace settings for eol and tabs (#725) --- .vscode/settings.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 38d6f1e73..97d5d1948 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,8 @@ "eslint.validate": ["typescript", "typescriptreact", "javascript", "javascriptreact"], "javascript.preferences.importModuleSpecifier": "non-relative", "javascript.preferences.useAliasesForRenames": false, - "typescript.enablePromptUseWorkspaceTsdk": true + "typescript.enablePromptUseWorkspaceTsdk": true, + "files.eol": "\n", + "editor.tabSize": 2, + "editor.insertSpaces": true } From 2068d980ffca0db1b079c476b993866328c5953e Mon Sep 17 00:00:00 2001 From: Sushant Date: Wed, 6 Dec 2023 05:41:51 +0530 Subject: [PATCH 43/51] feat: allow for the deletion of any document (#711) Allow for the deletion of any document with notifications of document cancellation for pending documents. --- .github/workflows/e2e-tests.yml | 3 + .../documents/data-table-action-dropdown.tsx | 7 +- .../app/(dashboard)/documents/data-table.tsx | 15 +- ...-dialog.tsx => delete-document-dialog.tsx} | 63 +++-- .../(signing)/sign/[token]/complete/page.tsx | 24 +- .../sign/[token]/no-longer-available.tsx | 66 ++++++ .../src/app/(signing)/sign/[token]/page.tsx | 14 ++ .../(dashboard)/layout/profile-dropdown.tsx | 8 +- .../e2e/pr-711-deletion-of-documents.spec.ts | 192 +++++++++++++++ packages/app-tests/e2e/test-auth-flow.spec.ts | 8 +- packages/app-tests/package.json | 1 + packages/app-tests/tsconfig.json | 8 + .../template-document-cancel.tsx | 34 +++ packages/email/templates/document-cancel.tsx | 66 ++++++ .../server-only/document/delete-document.ts | 88 +++++++ .../document/delete-draft-document.ts | 13 -- .../server-only/document/find-documents.ts | 20 +- .../lib/server-only/document/get-stats.ts | 33 ++- .../field/sign-field-with-token.ts | 4 + .../migration.sql | 2 + packages/prisma/schema.prisma | 1 + packages/prisma/seed-database.ts | 76 +----- packages/prisma/seed/initial-seed.ts | 67 ++++++ .../seed/pr-711-deletion-of-documents.ts | 221 ++++++++++++++++++ .../trpc/server/document-router/router.ts | 8 +- .../trpc/server/document-router/schema.ts | 3 +- 26 files changed, 913 insertions(+), 132 deletions(-) rename apps/web/src/app/(dashboard)/documents/{delete-draft-document-dialog.tsx => delete-document-dialog.tsx} (53%) create mode 100644 apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx create mode 100644 packages/app-tests/e2e/pr-711-deletion-of-documents.spec.ts create mode 100644 packages/app-tests/tsconfig.json create mode 100644 packages/email/template-components/template-document-cancel.tsx create mode 100644 packages/email/templates/document-cancel.tsx create mode 100644 packages/lib/server-only/document/delete-document.ts delete mode 100644 packages/lib/server-only/document/delete-draft-document.ts create mode 100644 packages/prisma/migrations/20231202134005_deletedocuments/migration.sql create mode 100644 packages/prisma/seed/initial-seed.ts create mode 100644 packages/prisma/seed/pr-711-deletion-of-documents.ts diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index f2342f446..50c25f923 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -31,6 +31,9 @@ jobs: - name: Create the database run: npm run prisma:migrate-dev + - name: Seed the database + run: npm run prisma:seed + - name: Run Playwright tests run: npm run ci diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx index c3e1f971c..9c3532f88 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx @@ -32,7 +32,7 @@ import { } from '@documenso/ui/primitives/dropdown-menu'; import { ResendDocumentActionItem } from './_action-items/resend-document'; -import { DeleteDraftDocumentDialog } from './delete-draft-document-dialog'; +import { DeleteDocumentDialog } from './delete-document-dialog'; import { DuplicateDocumentDialog } from './duplicate-document-dialog'; export type DataTableActionDropdownProps = { @@ -60,7 +60,7 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = // const isPending = row.status === DocumentStatus.PENDING; const isComplete = row.status === DocumentStatus.COMPLETED; // const isSigned = recipient?.signingStatus === SigningStatus.SIGNED; - const isDocumentDeletable = isOwner && row.status === DocumentStatus.DRAFT; + const isDocumentDeletable = isOwner; const onDownloadClick = async () => { let document: DocumentWithData | null = null; @@ -161,8 +161,9 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = {isDocumentDeletable && ( - diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 9d07b8278..c8adb1422 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -8,6 +8,7 @@ import { useSession } from 'next-auth/react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; import type { FindResultSet } from '@documenso/lib/types/find-result-set'; import type { Document, Recipient, User } from '@documenso/prisma/client'; +import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; @@ -74,12 +75,14 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { }, { header: 'Actions', - cell: ({ row }) => ( -
- - -
- ), + cell: ({ row }) => + (!row.original.deletedAt || + row.original.status === ExtendedDocumentStatus.COMPLETED) && ( +
+ + +
+ ), }, ]} data={results.data} diff --git a/apps/web/src/app/(dashboard)/documents/delete-draft-document-dialog.tsx b/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx similarity index 53% rename from apps/web/src/app/(dashboard)/documents/delete-draft-document-dialog.tsx rename to apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx index 1a458a13d..5b4a84286 100644 --- a/apps/web/src/app/(dashboard)/documents/delete-draft-document-dialog.tsx +++ b/apps/web/src/app/(dashboard)/documents/delete-document-dialog.tsx @@ -1,5 +1,8 @@ +import { useState } from 'react'; + import { useRouter } from 'next/navigation'; +import { DocumentStatus } from '@documenso/prisma/client'; import { trpc as trpcReact } from '@documenso/trpc/react'; import { Button } from '@documenso/ui/primitives/button'; import { @@ -10,41 +13,46 @@ import { DialogHeader, DialogTitle, } from '@documenso/ui/primitives/dialog'; +import { Input } from '@documenso/ui/primitives/input'; import { useToast } from '@documenso/ui/primitives/use-toast'; type DeleteDraftDocumentDialogProps = { id: number; open: boolean; onOpenChange: (_open: boolean) => void; + status: DocumentStatus; }; -export const DeleteDraftDocumentDialog = ({ +export const DeleteDocumentDialog = ({ id, open, onOpenChange, + status, }: DeleteDraftDocumentDialogProps) => { const router = useRouter(); const { toast } = useToast(); - const { mutateAsync: deleteDocument, isLoading } = - trpcReact.document.deleteDraftDocument.useMutation({ - onSuccess: () => { - router.refresh(); + const [inputValue, setInputValue] = useState(''); + const [isDeleteEnabled, setIsDeleteEnabled] = useState(status === DocumentStatus.DRAFT); - toast({ - title: 'Document deleted', - description: 'Your document has been successfully deleted.', - duration: 5000, - }); + const { mutateAsync: deleteDocument, isLoading } = trpcReact.document.deleteDocument.useMutation({ + onSuccess: () => { + router.refresh(); - onOpenChange(false); - }, - }); + toast({ + title: 'Document deleted', + description: 'Your document has been successfully deleted.', + duration: 5000, + }); - const onDraftDelete = async () => { + onOpenChange(false); + }, + }); + + const onDelete = async () => { try { - await deleteDocument({ id }); + await deleteDocument({ id, status }); } catch { toast({ title: 'Something went wrong', @@ -55,6 +63,11 @@ export const DeleteDraftDocumentDialog = ({ } }; + const onInputChange = (event: React.ChangeEvent) => { + setInputValue(event.target.value); + setIsDeleteEnabled(event.target.value === 'delete'); + }; + return ( !isLoading && onOpenChange(value)}> @@ -67,6 +80,17 @@ export const DeleteDraftDocumentDialog = ({ + {status !== DocumentStatus.DRAFT && ( +
+ +
+ )} +
diff --git a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx index b9a8ba6d7..54757667a 100644 --- a/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/complete/page.tsx @@ -67,18 +67,24 @@ export default async function CompletedSigningPage({ />
- {match(document.status) - .with(DocumentStatus.COMPLETED, () => ( + {match({ status: document.status, deletedAt: document.deletedAt }) + .with({ status: DocumentStatus.COMPLETED }, () => (
Everyone has signed
)) - .otherwise(() => ( + .with({ deletedAt: null }, () => (
Waiting for others to sign
+ )) + .otherwise(() => ( +
+ + Document no longer available to sign +
))}

@@ -86,16 +92,22 @@ export default async function CompletedSigningPage({ "{document.title}"

- {match(document.status) - .with(DocumentStatus.COMPLETED, () => ( + {match({ status: document.status, deletedAt: document.deletedAt }) + .with({ status: DocumentStatus.COMPLETED }, () => (

Everyone has signed! You will receive an Email copy of the signed document.

)) - .otherwise(() => ( + .with({ deletedAt: null }, () => (

You will receive an Email copy of the signed document once everyone has signed.

+ )) + .otherwise(() => ( +

+ This document has been cancelled by the owner and is no longer available for others to + sign. +

))}
diff --git a/apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx b/apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx new file mode 100644 index 000000000..8c7051caa --- /dev/null +++ b/apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +import Link from 'next/link'; + +import { Clock8 } from 'lucide-react'; +import { useSession } from 'next-auth/react'; + +import signingCelebration from '@documenso/assets/images/signing-celebration.png'; +import type { Document, Signature } from '@documenso/prisma/client'; +import { SigningCard3D } from '@documenso/ui/components/signing-card'; + +type NoLongerAvailableProps = { + document: Document; + recipientName: string; + recipientSignature: Signature; +}; + +export const NoLongerAvailable = ({ + document, + recipientName, + recipientSignature, +}: NoLongerAvailableProps) => { + const { data: session } = useSession(); + + return ( +
+ + +
+
+ + Document Cancelled +
+ +

+ "{document.title}" + is no longer available to sign +

+ +

+ This document has been cancelled by the owner. +

+ + {session?.user ? ( + + Go Back Home + + ) : ( +

+ Want to send slick signing links like this one?{' '} + + Check out Documenso. + +

+ )} +
+
+ ); +}; diff --git a/apps/web/src/app/(signing)/sign/[token]/page.tsx b/apps/web/src/app/(signing)/sign/[token]/page.tsx index 67e679412..17789453e 100644 --- a/apps/web/src/app/(signing)/sign/[token]/page.tsx +++ b/apps/web/src/app/(signing)/sign/[token]/page.tsx @@ -8,6 +8,7 @@ import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document import { viewedDocument } from '@documenso/lib/server-only/document/viewed-document'; import { getFieldsForToken } from '@documenso/lib/server-only/field/get-fields-for-token'; import { getRecipientByToken } from '@documenso/lib/server-only/recipient/get-recipient-by-token'; +import { getRecipientSignatures } from '@documenso/lib/server-only/recipient/get-recipient-signatures'; import { DocumentStatus, FieldType, SigningStatus } from '@documenso/prisma/client'; import { Card, CardContent } from '@documenso/ui/primitives/card'; import { ElementVisible } from '@documenso/ui/primitives/element-visible'; @@ -17,6 +18,7 @@ import { DateField } from './date-field'; import { EmailField } from './email-field'; import { SigningForm } from './form'; import { NameField } from './name-field'; +import { NoLongerAvailable } from './no-longer-available'; import { SigningProvider } from './provider'; import { SignatureField } from './signature-field'; @@ -55,6 +57,18 @@ export default async function SigningPage({ params: { token } }: SigningPageProp redirect(`/sign/${token}/complete`); } + const recipientSignature = (await getRecipientSignatures({ recipientId: recipient.id }))[0]; + + if (document.deletedAt) { + return ( + + ); + } + return ( { return ( -
diff --git a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx index 1dcb2d76b..b7654c7cf 100644 --- a/apps/marketing/src/app/(marketing)/singleplayer/client.tsx +++ b/apps/marketing/src/app/(marketing)/singleplayer/client.tsx @@ -17,15 +17,14 @@ import { AddFieldsFormPartial } from '@documenso/ui/primitives/document-flow/add import type { TAddFieldsFormSchema } from '@documenso/ui/primitives/document-flow/add-fields.types'; import { AddSignatureFormPartial } from '@documenso/ui/primitives/document-flow/add-signature'; import type { TAddSignatureFormSchema } from '@documenso/ui/primitives/document-flow/add-signature.types'; -import { - DocumentFlowFormContainer, - DocumentFlowFormContainerHeader, -} from '@documenso/ui/primitives/document-flow/document-flow-root'; +import { DocumentFlowFormContainer } from '@documenso/ui/primitives/document-flow/document-flow-root'; import type { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer'; +import { Stepper } from '@documenso/ui/primitives/stepper'; import { useToast } from '@documenso/ui/primitives/use-toast'; -type SinglePlayerModeStep = 'fields' | 'sign'; +const SinglePlayerModeSteps = ['fields', 'sign'] as const; +type SinglePlayerModeStep = (typeof SinglePlayerModeSteps)[number]; // !: This entire file is a hack to get around failed prerendering of // !: the Single Player Mode page. This regression was introduced during @@ -226,37 +225,35 @@ export const SinglePlayerClient = () => {
- e.preventDefault()}> - - - {/* Add fields to PDF page. */} - {step === 'fields' && ( + e.preventDefault()} + > + setStep(SinglePlayerModeSteps[step - 1])} + > + {/* Add fields to PDF page. */}
- )} - {/* Enter user details and signature. */} - {step === 'sign' && ( + {/* Enter user details and signature. */} + field.type === 'NAME'))} requireSignature={Boolean(fields.find((field) => field.type === 'SIGNATURE'))} /> - )} +
diff --git a/apps/marketing/src/pages/api/trpc/[trpc].ts b/apps/marketing/src/pages/api/trpc/[trpc].ts index 0bc991a98..c43291ea1 100644 --- a/apps/marketing/src/pages/api/trpc/[trpc].ts +++ b/apps/marketing/src/pages/api/trpc/[trpc].ts @@ -4,6 +4,11 @@ import { appRouter } from '@documenso/trpc/server/router'; export const config = { maxDuration: 60, + api: { + bodyParser: { + sizeLimit: '50mb', + }, + }, }; export default trpcNext.createNextApiHandler({ diff --git a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx index 53da2d353..ffce3bd6c 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx @@ -204,6 +204,7 @@ export const EditDocumentForm = ({ document={document} onSubmit={onAddTitleFormSubmit} /> + & { disabled?: boolean; diff --git a/packages/ui/components/document/document-share-button.tsx b/packages/ui/components/document/document-share-button.tsx index 5b6e9006a..b366123fb 100644 --- a/packages/ui/components/document/document-share-button.tsx +++ b/packages/ui/components/document/document-share-button.tsx @@ -13,8 +13,9 @@ import { } from '@documenso/lib/constants/toast'; import { generateTwitterIntent } from '@documenso/lib/universal/generate-twitter-intent'; import { trpc } from '@documenso/trpc/react'; -import { cn } from '@documenso/ui/lib/utils'; -import { Button } from '@documenso/ui/primitives/button'; + +import { cn } from '../../lib/utils'; +import { Button } from '../../primitives/button'; import { Dialog, DialogContent, @@ -22,8 +23,8 @@ import { DialogHeader, DialogTitle, DialogTrigger, -} from '@documenso/ui/primitives/dialog'; -import { useToast } from '@documenso/ui/primitives/use-toast'; +} from '../../primitives/dialog'; +import { useToast } from '../../primitives/use-toast'; export type DocumentShareButtonProps = HTMLAttributes & { token?: string; diff --git a/packages/ui/components/field/field-tooltip.tsx b/packages/ui/components/field/field-tooltip.tsx index 446b14d2d..3966e9c0c 100644 --- a/packages/ui/components/field/field-tooltip.tsx +++ b/packages/ui/components/field/field-tooltip.tsx @@ -1,17 +1,18 @@ import { TooltipArrow } from '@radix-ui/react-tooltip'; -import { VariantProps, cva } from 'class-variance-authority'; +import type { VariantProps } from 'class-variance-authority'; +import { cva } from 'class-variance-authority'; import { createPortal } from 'react-dom'; import { useFieldPageCoords } from '@documenso/lib/client-only/hooks/use-field-page-coords'; -import { cn } from '@documenso/ui/lib/utils'; + +import { cn } from '../..//lib/utils'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; - -import { Field } from '.prisma/client'; +} from '../..//primitives/tooltip'; +import type { Field } from '.prisma/client'; const tooltipVariants = cva('font-semibold', { variants: { diff --git a/packages/ui/components/field/field.tsx b/packages/ui/components/field/field.tsx index 054cc6376..e40b2e3d9 100644 --- a/packages/ui/components/field/field.tsx +++ b/packages/ui/components/field/field.tsx @@ -5,9 +5,10 @@ import React, { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { useFieldPageCoords } from '@documenso/lib/client-only/hooks/use-field-page-coords'; -import { Field } from '@documenso/prisma/client'; -import { cn } from '@documenso/ui/lib/utils'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; +import type { Field } from '@documenso/prisma/client'; + +import { cn } from '../../lib/utils'; +import { Card, CardContent } from '../../primitives/card'; export type FieldRootContainerProps = { field: Field; diff --git a/packages/ui/components/signing-card.tsx b/packages/ui/components/signing-card.tsx index ab057c4e5..cda0c31c3 100644 --- a/packages/ui/components/signing-card.tsx +++ b/packages/ui/components/signing-card.tsx @@ -2,14 +2,16 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import Image, { StaticImageData } from 'next/image'; +import type { StaticImageData } from 'next/image'; +import Image from 'next/image'; import { animate, motion, useMotionTemplate, useMotionValue, useTransform } from 'framer-motion'; import { P, match } from 'ts-pattern'; -import { Signature } from '@documenso/prisma/client'; -import { cn } from '@documenso/ui/lib/utils'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; +import type { Signature } from '@documenso/prisma/client'; + +import { cn } from '../lib/utils'; +import { Card, CardContent } from '../primitives/card'; export type SigningCardProps = { className?: string; diff --git a/packages/ui/primitives/combobox.tsx b/packages/ui/primitives/combobox.tsx index 899ccd61d..85f86056d 100644 --- a/packages/ui/primitives/combobox.tsx +++ b/packages/ui/primitives/combobox.tsx @@ -3,16 +3,11 @@ import * as React from 'react'; import { Check, ChevronsUpDown } from 'lucide-react'; import { Role } from '@documenso/prisma/client'; -import { cn } from '@documenso/ui/lib/utils'; -import { Button } from '@documenso/ui/primitives/button'; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, -} from '@documenso/ui/primitives/command'; -import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; + +import { cn } from '../lib/utils'; +import { Button } from './button'; +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from './command'; +import { Popover, PopoverContent, PopoverTrigger } from './popover'; type ComboboxProps = { listValues: string[]; diff --git a/packages/ui/primitives/document-dropzone.tsx b/packages/ui/primitives/document-dropzone.tsx index 6987e9872..d81a3a7de 100644 --- a/packages/ui/primitives/document-dropzone.tsx +++ b/packages/ui/primitives/document-dropzone.tsx @@ -1,12 +1,14 @@ 'use client'; -import { Variants, motion } from 'framer-motion'; +import type { Variants } from 'framer-motion'; +import { motion } from 'framer-motion'; import { Plus } from 'lucide-react'; import { useDropzone } from 'react-dropzone'; import { megabytesToBytes } from '@documenso/lib/universal/unit-convertions'; -import { cn } from '@documenso/ui/lib/utils'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; + +import { cn } from '../lib/utils'; +import { Card, CardContent } from './card'; const DocumentDropzoneContainerVariants: Variants = { initial: { diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx index 112f2f849..a8ae9f0e3 100644 --- a/packages/ui/primitives/document-flow/add-fields.tsx +++ b/packages/ui/primitives/document-flow/add-fields.tsx @@ -13,20 +13,14 @@ import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { nanoid } from '@documenso/lib/universal/id'; import type { Field, Recipient } from '@documenso/prisma/client'; import { FieldType, SendStatus } from '@documenso/prisma/client'; -import { cn } from '@documenso/ui/lib/utils'; -import { Button } from '@documenso/ui/primitives/button'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; -import { - Command, - CommandEmpty, - CommandGroup, - CommandInput, - CommandItem, -} from '@documenso/ui/primitives/command'; -import { Popover, PopoverContent, PopoverTrigger } from '@documenso/ui/primitives/popover'; -import { Tooltip, TooltipContent, TooltipTrigger } from '@documenso/ui/primitives/tooltip'; +import { cn } from '../../lib/utils'; +import { Button } from '../button'; +import { Card, CardContent } from '../card'; +import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem } from '../command'; +import { Popover, PopoverContent, PopoverTrigger } from '../popover'; import { useStep } from '../stepper'; +import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'; import type { TAddFieldsFormSchema } from './add-fields.types'; import { DocumentFlowFormContainerActions, diff --git a/packages/ui/primitives/document-flow/add-signature.tsx b/packages/ui/primitives/document-flow/add-signature.tsx index aed252083..e4e5d9253 100644 --- a/packages/ui/primitives/document-flow/add-signature.tsx +++ b/packages/ui/primitives/document-flow/add-signature.tsx @@ -9,35 +9,38 @@ import { match } from 'ts-pattern'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { sortFieldsByPosition, validateFieldsInserted } from '@documenso/lib/utils/fields'; -import { Field, FieldType } from '@documenso/prisma/client'; -import { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; -import { FieldToolTip } from '@documenso/ui/components/field/field-tooltip'; -import { cn } from '@documenso/ui/lib/utils'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; -import { TAddSignatureFormSchema } from '@documenso/ui/primitives/document-flow/add-signature.types'; +import type { Field } from '@documenso/prisma/client'; +import { FieldType } from '@documenso/prisma/client'; +import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; + +import { FieldToolTip } from '../../components/field/field-tooltip'; +import { cn } from '../../lib/utils'; +import { Card, CardContent } from '../card'; +import { ElementVisible } from '../element-visible'; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '../form/form'; +import { Input } from '../input'; +import { SignaturePad } from '../signature-pad'; +import { useStep } from '../stepper'; +import type { TAddSignatureFormSchema } from './add-signature.types'; +import { ZAddSignatureFormSchema } from './add-signature.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, DocumentFlowFormContainerFooter, + DocumentFlowFormContainerHeader, DocumentFlowFormContainerStep, -} from '@documenso/ui/primitives/document-flow/document-flow-root'; -import { DocumentFlowStep } from '@documenso/ui/primitives/document-flow/types'; -import { ElementVisible } from '@documenso/ui/primitives/element-visible'; -import { Input } from '@documenso/ui/primitives/input'; -import { SignaturePad } from '@documenso/ui/primitives/signature-pad'; - -import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '../form/form'; -import { ZAddSignatureFormSchema } from './add-signature.types'; +} from './document-flow-root'; import { SinglePlayerModeCustomTextField, SinglePlayerModeSignatureField, } from './single-player-mode-fields'; +import type { DocumentFlowStep } from './types'; export type AddSignatureFormProps = { defaultValues?: TAddSignatureFormSchema; documentFlow: DocumentFlowStep; fields: FieldWithSignature[]; - numberOfSteps: number; + onSubmit: (_data: TAddSignatureFormSchema) => Promise | void; requireName?: boolean; requireSignature?: boolean; @@ -47,11 +50,13 @@ export const AddSignatureFormPartial = ({ defaultValues, documentFlow, fields, - numberOfSteps, + onSubmit, requireName = false, requireSignature = true, }: AddSignatureFormProps) => { + const { currentStep, totalSteps } = useStep(); + const [validateUninsertedFields, setValidateUninsertedFields] = useState(false); // Refined schema which takes into account whether to allow an empty name or signature. @@ -206,46 +211,30 @@ export const AddSignatureFormPartial = ({ }; return ( -
-
- -
- ( - - Email - - { - onFormValueChange(FieldType.EMAIL); - field.onChange(value); - }} - /> - - - - )} - /> + <> + - {requireName && ( + +
+ +
( - Name + Email { - onFormValueChange(FieldType.NAME); + onFormValueChange(FieldType.EMAIL); field.onChange(value); }} /> @@ -254,91 +243,114 @@ export const AddSignatureFormPartial = ({ )} /> - )} - {requireSignature && ( - ( - - Signature - - - - { - onFormValueChange(FieldType.SIGNATURE); - field.onChange(value); - }} - /> - - - - - - )} - /> - )} -
-
+ {requireName && ( + ( + + Name + + { + onFormValueChange(FieldType.NAME); + field.onChange(value); + }} + /> + + + + )} + /> + )} - - + {requireSignature && ( + ( + + Signature + + + + { + onFormValueChange(FieldType.SIGNATURE); + field.onChange(value); + }} + /> + + + + + + )} + /> + )} +
+
- - -
+ + - {validateUninsertedFields && uninsertedFields[0] && ( - - Click to insert field - - )} + + + - - {localFields.map((field) => - match(field.type) - .with(FieldType.DATE, FieldType.EMAIL, FieldType.NAME, () => { - return ( - + Click to insert field + + )} + + + {localFields.map((field) => + match(field.type) + .with(FieldType.DATE, FieldType.EMAIL, FieldType.NAME, () => { + return ( + + ); + }) + .with(FieldType.SIGNATURE, () => ( + - ); - }) - .with(FieldType.SIGNATURE, () => ( - - )) - .otherwise(() => { - return null; - }), - )} - - + )) + .otherwise(() => { + return null; + }), + )} +
+ + ); }; diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx index 13af03d26..71be1c069 100644 --- a/packages/ui/primitives/document-flow/add-signers.tsx +++ b/packages/ui/primitives/document-flow/add-signers.tsx @@ -12,13 +12,13 @@ import { nanoid } from '@documenso/lib/universal/id'; import type { Field, Recipient } from '@documenso/prisma/client'; import { DocumentStatus, SendStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; -import { Button } from '@documenso/ui/primitives/button'; -import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; -import { Input } from '@documenso/ui/primitives/input'; -import { Label } from '@documenso/ui/primitives/label'; -import { useToast } from '@documenso/ui/primitives/use-toast'; +import { Button } from '../button'; +import { FormErrorMessage } from '../form/form-error-message'; +import { Input } from '../input'; +import { Label } from '../label'; import { useStep } from '../stepper'; +import { useToast } from '../use-toast'; import type { TAddSignersFormSchema } from './add-signers.types'; import { ZAddSignersFormSchema } from './add-signers.types'; import { diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index e9e761af0..881d59c74 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -5,12 +5,12 @@ import { useForm } from 'react-hook-form'; import type { Field, Recipient } from '@documenso/prisma/client'; import { DocumentStatus } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; -import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; -import { Input } from '@documenso/ui/primitives/input'; -import { Label } from '@documenso/ui/primitives/label'; -import { Textarea } from '@documenso/ui/primitives/textarea'; +import { FormErrorMessage } from '../form/form-error-message'; +import { Input } from '../input'; +import { Label } from '../label'; import { useStep } from '../stepper'; +import { Textarea } from '../textarea'; import type { TAddSubjectFormSchema } from './add-subject.types'; import { DocumentFlowFormContainerActions, diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 2b91e1033..8c2a9dc7a 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -4,10 +4,10 @@ import { useForm } from 'react-hook-form'; import type { Field, Recipient } from '@documenso/prisma/client'; import type { DocumentWithData } from '@documenso/prisma/types/document-with-data'; -import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message'; -import { Input } from '@documenso/ui/primitives/input'; -import { Label } from '@documenso/ui/primitives/label'; +import { FormErrorMessage } from '../form/form-error-message'; +import { Input } from '../input'; +import { Label } from '../label'; import { useStep } from '../stepper'; import type { TAddTitleFormSchema } from './add-title.types'; import { diff --git a/packages/ui/primitives/document-flow/document-flow-root.tsx b/packages/ui/primitives/document-flow/document-flow-root.tsx index 9142f4258..42b70c58a 100644 --- a/packages/ui/primitives/document-flow/document-flow-root.tsx +++ b/packages/ui/primitives/document-flow/document-flow-root.tsx @@ -5,8 +5,8 @@ import React from 'react'; import { motion } from 'framer-motion'; -import { cn } from '@documenso/ui/lib/utils'; -import { Button } from '@documenso/ui/primitives/button'; +import { cn } from '../../lib/utils'; +import { Button } from '../button'; export type DocumentFlowFormContainerProps = HTMLAttributes & { children?: React.ReactNode; diff --git a/packages/ui/primitives/document-flow/field-item.tsx b/packages/ui/primitives/document-flow/field-item.tsx index 48e52b9a7..7583bd4b9 100644 --- a/packages/ui/primitives/document-flow/field-item.tsx +++ b/packages/ui/primitives/document-flow/field-item.tsx @@ -7,10 +7,11 @@ import { createPortal } from 'react-dom'; import { Rnd } from 'react-rnd'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; -import { cn } from '@documenso/ui/lib/utils'; -import { Card, CardContent } from '@documenso/ui/primitives/card'; -import { FRIENDLY_FIELD_TYPE, TDocumentFlowFormSchema } from './types'; +import { cn } from '../../lib/utils'; +import { Card, CardContent } from '../card'; +import type { TDocumentFlowFormSchema } from './types'; +import { FRIENDLY_FIELD_TYPE } from './types'; type Field = TDocumentFlowFormSchema['fields'][0]; diff --git a/packages/ui/primitives/document-flow/send-document-action-dialog.tsx b/packages/ui/primitives/document-flow/send-document-action-dialog.tsx index f295dadfc..a70282800 100644 --- a/packages/ui/primitives/document-flow/send-document-action-dialog.tsx +++ b/packages/ui/primitives/document-flow/send-document-action-dialog.tsx @@ -2,7 +2,8 @@ import { useState } from 'react'; import { Loader } from 'lucide-react'; -import { Button, ButtonProps } from '@documenso/ui/primitives/button'; +import type { ButtonProps } from '../button'; +import { Button } from '../button'; import { Dialog, DialogContent, @@ -11,7 +12,7 @@ import { DialogHeader, DialogTitle, DialogTrigger, -} from '@documenso/ui/primitives/dialog'; +} from '../dialog'; export type SendDocumentActionDialogProps = ButtonProps & { loading?: boolean; diff --git a/packages/ui/primitives/document-flow/single-player-mode-fields.tsx b/packages/ui/primitives/document-flow/single-player-mode-fields.tsx index 04c093efc..7cecd7131 100644 --- a/packages/ui/primitives/document-flow/single-player-mode-fields.tsx +++ b/packages/ui/primitives/document-flow/single-player-mode-fields.tsx @@ -13,9 +13,11 @@ import { MIN_HANDWRITING_FONT_SIZE, MIN_STANDARD_FONT_SIZE, } from '@documenso/lib/constants/pdf'; -import { Field, FieldType } from '@documenso/prisma/client'; -import { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; -import { FieldRootContainer } from '@documenso/ui/components/field/field'; +import type { Field } from '@documenso/prisma/client'; +import { FieldType } from '@documenso/prisma/client'; +import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; + +import { FieldRootContainer } from '../../components/field/field'; export type SinglePlayerModeFieldContainerProps = { field: FieldWithSignature; diff --git a/packages/ui/primitives/form/form-error-message.tsx b/packages/ui/primitives/form/form-error-message.tsx index bb555b7f7..e429799da 100644 --- a/packages/ui/primitives/form/form-error-message.tsx +++ b/packages/ui/primitives/form/form-error-message.tsx @@ -1,6 +1,6 @@ import { AnimatePresence, motion } from 'framer-motion'; -import { cn } from '@documenso/ui/lib/utils'; +import { cn } from '../../lib/utils'; export type FormErrorMessageProps = { className?: string; diff --git a/packages/ui/primitives/form/form.tsx b/packages/ui/primitives/form/form.tsx index 9467de3af..f500accae 100644 --- a/packages/ui/primitives/form/form.tsx +++ b/packages/ui/primitives/form/form.tsx @@ -1,19 +1,12 @@ import * as React from 'react'; -import * as LabelPrimitive from '@radix-ui/react-label'; +import type * as LabelPrimitive from '@radix-ui/react-label'; import { Slot } from '@radix-ui/react-slot'; import { AnimatePresence, motion } from 'framer-motion'; -import { - Controller, - ControllerProps, - FieldPath, - FieldValues, - FormProvider, - useFormContext, -} from 'react-hook-form'; - -import { cn } from '@documenso/ui/lib/utils'; +import type { ControllerProps, FieldPath, FieldValues } from 'react-hook-form'; +import { Controller, FormProvider, useFormContext } from 'react-hook-form'; +import { cn } from '../../lib/utils'; import { Label } from '../label'; const Form = FormProvider; diff --git a/packages/ui/primitives/pdf-viewer.tsx b/packages/ui/primitives/pdf-viewer.tsx index 62b08d2f9..07cdaf1e2 100644 --- a/packages/ui/primitives/pdf-viewer.tsx +++ b/packages/ui/primitives/pdf-viewer.tsx @@ -3,16 +3,16 @@ import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Loader } from 'lucide-react'; -import { PDFDocumentProxy } from 'pdfjs-dist'; +import type { PDFDocumentProxy } from 'pdfjs-dist'; import { Document as PDFDocument, Page as PDFPage, pdfjs } from 'react-pdf'; import 'react-pdf/dist/esm/Page/AnnotationLayer.css'; import 'react-pdf/dist/esm/Page/TextLayer.css'; import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer'; import { getFile } from '@documenso/lib/universal/upload/get-file'; -import { DocumentData } from '@documenso/prisma/client'; -import { cn } from '@documenso/ui/lib/utils'; +import type { DocumentData } from '@documenso/prisma/client'; +import { cn } from '../lib/utils'; import { useToast } from './use-toast'; export type LoadedPDFDocument = PDFDocumentProxy; diff --git a/packages/ui/primitives/signature-pad/signature-pad.tsx b/packages/ui/primitives/signature-pad/signature-pad.tsx index 107627240..3497418d7 100644 --- a/packages/ui/primitives/signature-pad/signature-pad.tsx +++ b/packages/ui/primitives/signature-pad/signature-pad.tsx @@ -1,20 +1,12 @@ 'use client'; -import { - HTMLAttributes, - MouseEvent, - PointerEvent, - TouchEvent, - useEffect, - useMemo, - useRef, - useState, -} from 'react'; +import type { HTMLAttributes, MouseEvent, PointerEvent, TouchEvent } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; -import { StrokeOptions, getStroke } from 'perfect-freehand'; - -import { cn } from '@documenso/ui/lib/utils'; +import type { StrokeOptions } from 'perfect-freehand'; +import { getStroke } from 'perfect-freehand'; +import { cn } from '../../lib/utils'; import { getSvgPathFromStroke } from './helper'; import { Point } from './point'; From cd6184406d133af049582fb8008bdba3344bb29b Mon Sep 17 00:00:00 2001 From: Mythie Date: Thu, 7 Dec 2023 15:08:16 +1100 Subject: [PATCH 49/51] chore: add e2e test for stepper --- .../e2e/pr-718-add-stepper-component.spec.ts | 75 +++++++++++++++++++ .../seed/pr-718-add-stepper-component.ts | 28 +++++++ 2 files changed, 103 insertions(+) create mode 100644 packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts create mode 100644 packages/prisma/seed/pr-718-add-stepper-component.ts diff --git a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts new file mode 100644 index 000000000..6e03979c0 --- /dev/null +++ b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts @@ -0,0 +1,75 @@ +import { expect, test } from '@playwright/test'; +import path from 'node:path'; + +import { TEST_USER } from '@documenso/prisma/seed/pr-718-add-stepper-component'; + +test(`[PR-718]: should be able to create a document`, async ({ page }) => { + await page.goto('/signin'); + + const documentTitle = `example-${Date.now()}.pdf`; + + // Sign in + await page.getByLabel('Email').fill(TEST_USER.email); + await page.getByLabel('Password', { exact: true }).fill(TEST_USER.password); + await page.getByRole('button', { name: 'Sign In' }).click(); + + // Upload document + const [fileChooser] = await Promise.all([ + page.waitForEvent('filechooser'), + page.locator('input[type=file]').evaluate((e) => { + if (e instanceof HTMLInputElement) { + e.click(); + } + }), + ]); + + await fileChooser.setFiles(path.join(__dirname, '../../../assets/example.pdf')); + + // Wait to be redirected to the edit page + await page.waitForURL(/\/documents\/\d+/); + + // Set title + await expect(page.getByRole('heading', { name: 'Add Title' })).toBeVisible(); + + await page.getByLabel('Title').fill(documentTitle); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add signers + await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible(); + + await page.getByLabel('Email*').fill('user1@example.com'); + await page.getByLabel('Name').fill('User 1'); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add fields + await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible(); + + await page.getByRole('button', { name: 'User 1 Signature' }).click(); + await page.locator('canvas').click({ + position: { + x: 100, + y: 100, + }, + }); + + await page.getByRole('button', { name: 'Email Email' }).click(); + await page.locator('canvas').click({ + position: { + x: 100, + y: 200, + }, + }); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add subject and send + await expect(page.getByRole('heading', { name: 'Add Subject' })).toBeVisible(); + await page.getByRole('button', { name: 'Send' }).click(); + + await page.waitForURL('/documents'); + + // Assert document was created + await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); +}); diff --git a/packages/prisma/seed/pr-718-add-stepper-component.ts b/packages/prisma/seed/pr-718-add-stepper-component.ts new file mode 100644 index 000000000..57a0ddc61 --- /dev/null +++ b/packages/prisma/seed/pr-718-add-stepper-component.ts @@ -0,0 +1,28 @@ +import { hashSync } from '@documenso/lib/server-only/auth/hash'; + +import { prisma } from '..'; + +// +// https://github.com/documenso/documenso/pull/713 +// + +const PULL_REQUEST_NUMBER = 718; + +const EMAIL_DOMAIN = `pr-${PULL_REQUEST_NUMBER}.documenso.com`; + +export const TEST_USER = { + name: 'User 1', + email: `user1@${EMAIL_DOMAIN}`, + password: 'Password123', +} as const; + +export const seedDatabase = async () => { + await prisma.user.create({ + data: { + name: TEST_USER.name, + email: TEST_USER.email, + password: hashSync(TEST_USER.password), + emailVerified: new Date(), + }, + }); +}; From 9a7e5d333dbabeeeb50a32b361b0f667328ce97a Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Dec 2023 15:45:44 +1100 Subject: [PATCH 50/51] fix: don't expand documentData --- .../src/app/(dashboard)/documents/data-table-action-button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index e0a56f83d..3fc9e2d42 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -58,7 +58,7 @@ export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { return; } - const documentBytes = await getFile({ data: documentData.data, type: documentData.type }); + const documentBytes = await getFile(documentData); const blob = new Blob([documentBytes], { type: 'application/pdf', From d58433c8a01569581e09121e2517dfd1b62e9581 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 7 Dec 2023 15:50:34 +1100 Subject: [PATCH 51/51] fix: destructure toast --- .../src/app/(dashboard)/documents/data-table-action-button.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx index fb10888de..54a8f6184 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table-action-button.tsx @@ -23,7 +23,7 @@ export type DataTableActionButtonProps = { export const DataTableActionButton = ({ row }: DataTableActionButtonProps) => { const { data: session } = useSession(); - const toast = useToast(); + const { toast } = useToast(); if (!session) { return null;