From e0e2f3e4400232b6a3284cfeab7e29009ef8078e Mon Sep 17 00:00:00 2001 From: Doug Andrade Date: Tue, 13 Jun 2023 23:28:25 -0400 Subject: [PATCH 01/25] improved loading state for /document/id --- .../(dashboard)/documents/[id]/loading.tsx | 28 +++++++++++++++++++ .../app/(dashboard)/documents/[id]/page.tsx | 2 +- .../(dashboard)/pdf-viewer/pdf-viewer.tsx | 6 ++-- .../src/components/forms/edit-document.tsx | 2 +- 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/loading.tsx diff --git a/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx b/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx new file mode 100644 index 000000000..e68b149dc --- /dev/null +++ b/apps/web/src/app/(dashboard)/documents/[id]/loading.tsx @@ -0,0 +1,28 @@ +import Link from 'next/link'; + +import { ChevronLeft, Loader } from 'lucide-react'; + +export default function Loading() { + return ( + + + + Documents + + + Loading Document... + + + + + + + Loading document... + + + + + + + ); +} diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index e84d463e4..a83e2949a 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -38,7 +38,7 @@ export default async function DocumentPage({ params }: DocumentPageProps) { - Dashboard + Documents onDocumentLoaded(d)} externalLinkTarget="_blank" loading={ - - + + - Loading document... + Loading document... } > diff --git a/apps/web/src/components/forms/edit-document.tsx b/apps/web/src/components/forms/edit-document.tsx index 2529f01de..25dda7695 100644 --- a/apps/web/src/components/forms/edit-document.tsx +++ b/apps/web/src/components/forms/edit-document.tsx @@ -22,7 +22,7 @@ const PDFViewer = dynamic(async () => import('~/components/(dashboard)/pdf-viewe ssr: false, loading: () => ( - + Loading document... From 3aea62e8980803cc1d4c60a3a1abcbff31c9a627 Mon Sep 17 00:00:00 2001 From: Mythie Date: Wed, 21 Jun 2023 23:48:22 +1000 Subject: [PATCH 02/25] fix: styling and semantic updates --- .../document-dropzone/document-dropzone.tsx | 2 +- .../(dashboard)/pdf-viewer/pdf-viewer.tsx | 12 ++---------- .../components/(dashboard)/pdf-viewer/types.ts | 2 ++ apps/web/src/components/(marketing)/callout.tsx | 16 ++++++++-------- apps/web/src/components/(marketing)/hero.tsx | 15 +++++++++++---- .../components/(marketing)/pricing-table.tsx | 17 +++++++++-------- 6 files changed, 33 insertions(+), 31 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/pdf-viewer/types.ts diff --git a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx index c3c53d32e..3688bdfca 100644 --- a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx +++ b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx @@ -110,7 +110,7 @@ export const DocumentDropzone = ({ className, onDrop, ...props }: DocumentDropzo )} gradient={true} degrees={120} - lightMode={theme === 'light'} + {...getRootProps()} {...props} > diff --git a/apps/web/src/components/(dashboard)/pdf-viewer/pdf-viewer.tsx b/apps/web/src/components/(dashboard)/pdf-viewer/pdf-viewer.tsx index 998a54f1a..77284a02b 100644 --- a/apps/web/src/components/(dashboard)/pdf-viewer/pdf-viewer.tsx +++ b/apps/web/src/components/(dashboard)/pdf-viewer/pdf-viewer.tsx @@ -67,16 +67,6 @@ export const PDFViewer = ({ className, document, onPageClick, ...props }: PDFVie const pageX = event.clientX - left; const pageY = event.clientY - top; - console.log({ - pageNumber, - numPages, - originalEvent: event, - pageHeight: height, - pageWidth: width, - pageX, - pageY, - }); - if (onPageClick) { onPageClick({ pageNumber, @@ -137,6 +127,8 @@ export const PDFViewer = ({ className, document, onPageClick, ...props }: PDFVie onDocumentPageClick(e, i + 1)} /> diff --git a/apps/web/src/components/(dashboard)/pdf-viewer/types.ts b/apps/web/src/components/(dashboard)/pdf-viewer/types.ts new file mode 100644 index 000000000..54c9c5d5a --- /dev/null +++ b/apps/web/src/components/(dashboard)/pdf-viewer/types.ts @@ -0,0 +1,2 @@ +export const PDF_VIEWER_CONTAINER_SELECTOR = '.react-pdf__Document'; +export const PDF_VIEWER_PAGE_SELECTOR = '.react-pdf__Page'; diff --git a/apps/web/src/components/(marketing)/callout.tsx b/apps/web/src/components/(marketing)/callout.tsx index 30a1abdbf..0c2613ec8 100644 --- a/apps/web/src/components/(marketing)/callout.tsx +++ b/apps/web/src/components/(marketing)/callout.tsx @@ -41,16 +41,16 @@ export const Callout = () => { - event('view-github')} - > - + + event('view-github')} + > Star on Github - - + + ); }; diff --git a/apps/web/src/components/(marketing)/hero.tsx b/apps/web/src/components/(marketing)/hero.tsx index b406b51cc..7f7aa6d05 100644 --- a/apps/web/src/components/(marketing)/hero.tsx +++ b/apps/web/src/components/(marketing)/hero.tsx @@ -114,12 +114,19 @@ export const Hero = ({ className, ...props }: HeroProps) => { - event('view-github')}> - + + event('view-github')} + > Star on Github - - + + { For small teams and individuals who need a simple solution
Loading document...
Host your own instance
Add all relevant fields for each recipient. @@ -62,6 +322,7 @@ export const AddFieldsFormPartial = ({ ( setSelectedSigner(signer)}> - - + setSelectedField(FieldType.SIGNATURE)} + data-selected={selectedField === FieldType.SIGNATURE ? true : undefined} + > + @@ -128,15 +392,17 @@ export const AddFieldsFormPartial = ({ - - + setSelectedField(FieldType.EMAIL)} + data-selected={selectedField === FieldType.EMAIL ? true : undefined} + > + {'Email'} @@ -147,15 +413,17 @@ export const AddFieldsFormPartial = ({ - - + setSelectedField(FieldType.NAME)} + data-selected={selectedField === FieldType.NAME ? true : undefined} + > + {'Name'} @@ -166,15 +434,17 @@ export const AddFieldsFormPartial = ({ - - + setSelectedField(FieldType.DATE)} + data-selected={selectedField === FieldType.DATE ? true : undefined} + > + {'Date'} diff --git a/apps/web/src/components/forms/edit-document/add-signers.tsx b/apps/web/src/components/forms/edit-document/add-signers.tsx index 9292d6e3a..88427eee2 100644 --- a/apps/web/src/components/forms/edit-document/add-signers.tsx +++ b/apps/web/src/components/forms/edit-document/add-signers.tsx @@ -1,8 +1,11 @@ 'use client'; +import React from 'react'; + import { AnimatePresence, motion } from 'framer-motion'; import { Plus, Trash } from 'lucide-react'; -import { Control, Controller, FieldErrors, useFieldArray } from 'react-hook-form'; +import { nanoid } from 'nanoid'; +import { Control, Controller, FieldErrors, UseFormWatch, useFieldArray } from 'react-hook-form'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -16,6 +19,7 @@ import { TEditDocumentFormSchema } from './types'; export type AddSignersFormProps = { className?: string; control: Control; + watch: UseFormWatch; errors: FieldErrors; isSubmitting: boolean; }; @@ -27,14 +31,49 @@ export const AddSignersFormPartial = ({ isSubmitting, }: AddSignersFormProps) => { const { - append, + append: appendSigner, fields: signers, - remove, + remove: removeSigner, } = useFieldArray({ control, name: 'signers', }); + const { remove: removeField, fields: fields } = useFieldArray({ + name: 'fields', + control, + }); + + const onAddSigner = () => { + appendSigner({ + formId: nanoid(12), + name: '', + email: '', + }); + }; + + const onRemoveSigner = (index: number) => { + const signer = signers[index]; + + removeSigner(index); + + const fieldsToRemove: number[] = []; + + fields.forEach((field, fieldIndex) => { + if (field.signerEmail === signer.email) { + fieldsToRemove.push(fieldIndex); + } + }); + + removeField(fieldsToRemove); + }; + + const onKeyDown = (event: React.KeyboardEvent) => { + if (event.key === 'Enter' && event.target instanceof HTMLInputElement) { + onAddSigner(); + } + }; + return ( Add Signers @@ -45,23 +84,27 @@ export const AddSignersFormPartial = ({ - + - {signers.map((field, index) => ( - + {signers.map((signer, index) => ( + - Email + + Email + * + ( )} @@ -69,17 +112,18 @@ export const AddSignersFormPartial = ({ - Name + Name ( )} @@ -89,9 +133,9 @@ export const AddSignersFormPartial = ({ remove(index)} + className="inline-flex h-10 w-10 items-center justify-center text-slate-500 hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50" + disabled={isSubmitting || signers.length === 1} + onClick={() => onRemoveSigner(index)} > @@ -106,17 +150,10 @@ export const AddSignersFormPartial = ({ + + - - append({ - email: '', - name: '', - }) - } - > + onAddSigner()}> Add Signer diff --git a/apps/web/src/components/forms/edit-document/add-subject.tsx b/apps/web/src/components/forms/edit-document/add-subject.tsx new file mode 100644 index 000000000..2aedb0127 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/add-subject.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { Control, Controller, FieldErrors, UseFormWatch } from 'react-hook-form'; + +import { cn } from '@documenso/ui/lib/utils'; +import { Input } from '@documenso/ui/primitives/input'; +import { Label } from '@documenso/ui/primitives/label'; +import { Textarea } from '@documenso/ui/primitives/textarea'; + +import { FormErrorMessage } from '~/components/form/form-error-message'; + +import { TEditDocumentFormSchema } from './types'; + +export type AddSubjectFormProps = { + className?: string; + control: Control; + watch: UseFormWatch; + errors: FieldErrors; + isSubmitting: boolean; +}; + +export const AddSubjectFormPartial = ({ + className, + control, + errors, + isSubmitting, +}: AddSubjectFormProps) => { + return ( + + Add Subject + + + Add the subject and message you wish to send to signers. + + + + + + + + Subject (Optional) + + + ( + + )} + /> + + + + + + + Message (Optional) + + + ( + + )} + /> + + + + + + + You can use the following variables in your message: + + + + + + {'{signer.name}'} + {' '} + - The signer's name + + + + {'{signer.email}'} + {' '} + - The signer's email + + + + {'{document.name}'} + {' '} + - The document's name + + + + + + ); +}; diff --git a/apps/web/src/components/forms/edit-document/field-item.tsx b/apps/web/src/components/forms/edit-document/field-item.tsx new file mode 100644 index 000000000..0f6732a34 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/field-item.tsx @@ -0,0 +1,149 @@ +import { useCallback, useEffect, useState } from 'react'; + +import { X } from 'lucide-react'; +import { createPortal } from 'react-dom'; +import { Rnd } from 'react-rnd'; + +import { cn } from '@documenso/ui/lib/utils'; +import { Card, CardContent } from '@documenso/ui/primitives/card'; + +import { PDF_VIEWER_PAGE_SELECTOR } from '~/components/(dashboard)/pdf-viewer/types'; + +import { FRIENDLY_FIELD_TYPE, TEditDocumentFormSchema } from './types'; + +type Field = TEditDocumentFormSchema['fields'][0]; + +export type FieldItemProps = { + field: Field; + passive?: boolean; + disabled?: boolean; + minHeight?: number; + minWidth?: number; + onResize?: (_node: HTMLElement) => void; + onMove?: (_node: HTMLElement) => void; + onRemove?: () => void; +}; + +export const FieldItem = ({ + field, + passive, + disabled, + minHeight, + minWidth, + onResize, + onMove, + onRemove, +}: FieldItemProps) => { + const [active, setActive] = useState(false); + const [coords, setCoords] = useState({ + pageX: 0, + pageY: 0, + pageHeight: 0, + pageWidth: 0, + }); + + const calculateCoords = useCallback(() => { + const $page = document.querySelector( + `${PDF_VIEWER_PAGE_SELECTOR}[data-page-number="${field.pageNumber}"]`, + ); + + if (!$page) { + return; + } + + const { height, width } = $page.getBoundingClientRect(); + + const top = $page.offsetTop; + const left = $page.offsetLeft; + + // X and Y are percentages of the page's height and width + const pageX = (field.pageX / 100) * width + left; + const pageY = (field.pageY / 100) * height + top; + + const pageHeight = (field.pageHeight / 100) * height; + const pageWidth = (field.pageWidth / 100) * width; + + setCoords({ + pageX: pageX, + pageY: pageY, + pageHeight: pageHeight, + pageWidth: pageWidth, + }); + }, [field.pageHeight, field.pageNumber, field.pageWidth, field.pageX, field.pageY]); + + useEffect(() => { + calculateCoords(); + }, [calculateCoords]); + + useEffect(() => { + const onResize = () => { + calculateCoords(); + }; + + window.addEventListener('resize', onResize); + + return () => { + window.removeEventListener('resize', onResize); + }; + }, [calculateCoords]); + + return createPortal( + setActive(true)} + onResizeStart={() => setActive(true)} + onResizeStop={(_e, _d, ref) => { + setActive(false); + onResize?.(ref); + }} + onDragStop={(_e, d) => { + setActive(false); + onMove?.(d.node); + }} + > + {!disabled && ( + onRemove?.()} + > + + + )} + + + + {FRIENDLY_FIELD_TYPE[field.type]} + + + {field.signerEmail} + + + + , + document.body, + ); +}; diff --git a/apps/web/src/components/forms/edit-document/provider.tsx b/apps/web/src/components/forms/edit-document/provider.tsx new file mode 100644 index 000000000..ea5d7cd62 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/provider.tsx @@ -0,0 +1,53 @@ +import React, { createContext, useRef } from 'react'; + +import { OnPDFViewerPageClick } from '~/components/(dashboard)/pdf-viewer/pdf-viewer'; + +type EditFormContextValue = { + firePageClickEvent: OnPDFViewerPageClick; + registerPageClickHandler: (_handler: OnPDFViewerPageClick) => void; + unregisterPageClickHandler: (_handler: OnPDFViewerPageClick) => void; +} | null; + +const EditFormContext = createContext(null); + +export type EditFormProviderProps = { + children: React.ReactNode; +}; + +export const useEditForm = () => { + const context = React.useContext(EditFormContext); + + if (!context) { + throw new Error('useEditForm must be used within a EditFormProvider'); + } + + return context; +}; + +export const EditFormProvider = ({ children }: EditFormProviderProps) => { + const handlers = useRef(new Set()); + + const firePageClickEvent: OnPDFViewerPageClick = (event) => { + handlers.current.forEach((handler) => handler(event)); + }; + + const registerPageClickHandler = (handler: OnPDFViewerPageClick) => { + handlers.current.add(handler); + }; + + const unregisterPageClickHandler = (handler: OnPDFViewerPageClick) => { + handlers.current.delete(handler); + }; + + return ( + + {children} + + ); +}; diff --git a/apps/web/src/components/forms/edit-document/types.ts b/apps/web/src/components/forms/edit-document/types.ts index 7ca551f48..a6b26654a 100644 --- a/apps/web/src/components/forms/edit-document/types.ts +++ b/apps/web/src/components/forms/edit-document/types.ts @@ -1,13 +1,49 @@ import { z } from 'zod'; +import { FieldType } from '@documenso/prisma/client'; + export const ZEditDocumentFormSchema = z.object({ - signers: z.array( + signers: z + .array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + email: z.string().min(1).email(), + name: z.string(), + }), + ) + .refine((signers) => { + const emails = signers.map((signer) => signer.email); + return new Set(emails).size === emails.length; + }, 'Signers must have unique emails'), + + fields: z.array( z.object({ - id: z.number().optional(), - email: z.string().min(1).email(), - name: z.string(), + 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), }), ), + + email: z.object({ + subject: z.string(), + message: z.string(), + }), }); export type TEditDocumentFormSchema = z.infer; + +export const FRIENDLY_FIELD_TYPE: Record = { + [FieldType.SIGNATURE]: 'Signature', + [FieldType.FREE_SIGNATURE]: 'Free Signature', + [FieldType.TEXT]: 'Text', + [FieldType.DATE]: 'Date', + [FieldType.EMAIL]: 'Email', + [FieldType.NAME]: 'Name', +}; diff --git a/package-lock.json b/package-lock.json index 06886b87d..bd3775a2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,6 +64,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", @@ -75,6 +76,7 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.8.0", "react-pdf": "^7.1.1", + "react-rnd": "^10.4.1", "typescript": "5.0.4", "zod": "^3.21.4" }, @@ -85,6 +87,23 @@ "@types/react-dom": "18.2.4" } }, + "apps/web/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -4199,6 +4218,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -6606,6 +6630,19 @@ "react": "^18.2.0" } }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-dropzone": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", @@ -6717,6 +6754,37 @@ } } }, + "node_modules/react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "dependencies": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "dependencies": { + "fast-memoize": "^2.5.1" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", @@ -8342,6 +8410,7 @@ "@pdf-lib/fontkit": "^1.1.1", "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "pdf-lib": "^1.17.1", @@ -8351,6 +8420,23 @@ "@types/bcrypt": "^5.0.0" } }, + "packages/lib/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "packages/prettier-config": { "name": "@documenso/prettier-config", "version": "0.0.0", @@ -8390,6 +8476,8 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", @@ -8842,10 +8930,18 @@ "@types/bcrypt": "^5.0.0", "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "pdf-lib": "^1.17.1", "stripe": "^12.7.0" + }, + "dependencies": { + "nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" + } } }, "@documenso/marketing": { @@ -8903,6 +8999,8 @@ "@documenso/trpc": { "version": "file:packages/trpc", "requires": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", @@ -8978,6 +9076,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", @@ -8989,8 +9088,16 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.8.0", "react-pdf": "^7.1.1", + "react-rnd": "^10.4.1", "typescript": "5.0.4", "zod": "^3.21.4" + }, + "dependencies": { + "nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" + } } }, "@emotion/is-prop-valid": { @@ -11693,6 +11800,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -13236,6 +13348,15 @@ "scheduler": "^0.23.0" } }, + "react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "requires": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + } + }, "react-dropzone": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", @@ -13299,6 +13420,31 @@ "tslib": "^2.0.0" } }, + "react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "requires": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "dependencies": { + "re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "requires": { + "fast-memoize": "^2.5.1" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, "react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 4d3c9fa4d..531ef30f3 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -30,7 +30,6 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { const user = await getUserByEmail({ email }).catch(() => null); if (!user || !user.password) { - console.log('no user'); return null; } diff --git a/packages/lib/package.json b/packages/lib/package.json index 202a37fe0..7e1ffc9db 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -19,6 +19,7 @@ "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", "pdf-lib": "^1.17.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "stripe": "^12.7.0" diff --git a/packages/lib/server-only/field/get-fields-for-document.ts b/packages/lib/server-only/field/get-fields-for-document.ts new file mode 100644 index 000000000..1ced3dd12 --- /dev/null +++ b/packages/lib/server-only/field/get-fields-for-document.ts @@ -0,0 +1,19 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetFieldsForDocumentOptions { + documentId: number; + userId: number; +} + +export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForDocumentOptions) => { + const fields = await prisma.field.findMany({ + where: { + documentId, + Document: { + userId, + }, + }, + }); + + return fields; +}; diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts new file mode 100644 index 000000000..7c2d3d068 --- /dev/null +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -0,0 +1,127 @@ +import { prisma } from '@documenso/prisma'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +export interface SetFieldsForDocumentOptions { + userId: number; + documentId: number; + fields: { + id?: number | null; + signerEmail: string; + pageNumber: number; + pageX: number; + pageY: number; + pageWidth: number; + pageHeight: number; + }[]; +} + +export const setFieldsForDocument = async ({ + userId, + documentId, + fields, +}: SetFieldsForDocumentOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + userId, + }, + }); + + if (!document) { + throw new Error('Document not found'); + } + + const existingFields = await prisma.field.findMany({ + where: { + documentId, + }, + include: { + Recipient: true, + }, + }); + + const removedFields = existingFields.filter( + (existingField) => + !fields.find( + (field) => + field.id === existingField.id || field.signerEmail === existingField.Recipient?.email, + ), + ); + + const linkedFields = fields.map((field) => { + const existing = existingFields.find((existingField) => existingField.id === field.id); + + return { + ...field, + ...existing, + }; + }); + + for (const field of linkedFields) { + if ( + field.Recipient?.sendStatus === SendStatus.SENT || + field.Recipient?.signingStatus === SigningStatus.SIGNED + ) { + throw new Error('Cannot modify fields after sending'); + } + } + + const persistedFields = await prisma.$transaction( + linkedFields.map((field) => + field.id + ? prisma.field.update({ + where: { + id: field.id, + recipientId: field.recipientId, + documentId, + }, + data: { + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + }, + }) + : prisma.field.create({ + data: { + type: field.type!, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + customText: '', + inserted: false, + + Document: { + connect: { + id: document.id, + }, + }, + Recipient: { + connect: { + documentId_email: { + documentId: document.id, + email: field.signerEmail, + }, + }, + }, + }, + }), + ), + ); + + if (removedFields.length > 0) { + await prisma.field.deleteMany({ + where: { + id: { + in: removedFields.map((field) => field.id), + }, + }, + }); + } + + return persistedFields; +}; diff --git a/packages/lib/server-only/recipient/get-recipients-for-document.ts b/packages/lib/server-only/recipient/get-recipients-for-document.ts new file mode 100644 index 000000000..8b64bc1e8 --- /dev/null +++ b/packages/lib/server-only/recipient/get-recipients-for-document.ts @@ -0,0 +1,22 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetRecipientsForDocumentOptions { + documentId: number; + userId: number; +} + +export const getRecipientsForDocument = async ({ + documentId, + userId, +}: GetRecipientsForDocumentOptions) => { + const recipients = await prisma.recipient.findMany({ + where: { + documentId, + Document: { + userId, + }, + }, + }); + + return recipients; +}; diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts new file mode 100644 index 000000000..bee6acfc3 --- /dev/null +++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts @@ -0,0 +1,103 @@ +import { nanoid } from 'nanoid'; + +import { prisma } from '@documenso/prisma'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +export interface SetRecipientsForDocumentOptions { + userId: number; + documentId: number; + recipients: { + id?: number | null; + email: string; + name: string; + }[]; +} + +export const setRecipientsForDocument = async ({ + userId, + documentId, + recipients, +}: SetRecipientsForDocumentOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + userId, + }, + }); + + if (!document) { + throw new Error('Document not found'); + } + + const existingRecipients = await prisma.recipient.findMany({ + where: { + documentId, + }, + }); + + const removedRecipients = existingRecipients.filter( + (existingRecipient) => + !recipients.find( + (recipient) => + recipient.id === existingRecipient.id || recipient.email === existingRecipient.email, + ), + ); + + const linkedRecipients = recipients.map((recipient) => { + const existing = existingRecipients.find( + (existingRecipient) => + existingRecipient.id === recipient.id || existingRecipient.email === recipient.email, + ); + + return { + ...recipient, + ...existing, + }; + }); + + for (const recipient of linkedRecipients) { + if ( + recipient.sendStatus === SendStatus.SENT || + recipient.signingStatus === SigningStatus.SIGNED + ) { + throw new Error('Cannot modify recipients after sending'); + } + } + + const persistedRecipients = await prisma.$transaction( + linkedRecipients.map((recipient) => + recipient.id + ? prisma.recipient.update({ + where: { + id: recipient.id, + documentId, + }, + data: { + name: recipient.name, + email: recipient.email, + documentId, + }, + }) + : prisma.recipient.create({ + data: { + name: recipient.name, + email: recipient.email, + token: nanoid(), + documentId, + }, + }), + ), + ); + + if (removedRecipients.length > 0) { + await prisma.recipient.deleteMany({ + where: { + id: { + in: removedRecipients.map((recipient) => recipient.id), + }, + }, + }); + } + + return persistedRecipients; +}; diff --git a/packages/prisma/migrations/20230617040606_add_name_field/migration.sql b/packages/prisma/migrations/20230617040606_add_name_field/migration.sql new file mode 100644 index 000000000..a3412b6e6 --- /dev/null +++ b/packages/prisma/migrations/20230617040606_add_name_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "FieldType" ADD VALUE 'NAME'; diff --git a/packages/prisma/migrations/20230617041623_add_email_field/migration.sql b/packages/prisma/migrations/20230617041623_add_email_field/migration.sql new file mode 100644 index 000000000..5608f7974 --- /dev/null +++ b/packages/prisma/migrations/20230617041623_add_email_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "FieldType" ADD VALUE 'EMAIL'; diff --git a/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql b/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql new file mode 100644 index 000000000..eb3744e81 --- /dev/null +++ b/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Field" ADD COLUMN "height" INTEGER NOT NULL DEFAULT -1, +ADD COLUMN "width" INTEGER NOT NULL DEFAULT -1; diff --git a/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql b/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql new file mode 100644 index 000000000..243b654e1 --- /dev/null +++ b/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[documentId,email]` on the table `Recipient` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Recipient_documentId_email_key" ON "Recipient"("documentId", "email"); diff --git a/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql b/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql new file mode 100644 index 000000000..2aea39805 --- /dev/null +++ b/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql @@ -0,0 +1,9 @@ +-- AlterTable +ALTER TABLE "Field" ALTER COLUMN "positionX" SET DEFAULT 0, +ALTER COLUMN "positionX" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "positionY" SET DEFAULT 0, +ALTER COLUMN "positionY" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "height" SET DEFAULT -1, +ALTER COLUMN "height" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "width" SET DEFAULT -1, +ALTER COLUMN "width" SET DATA TYPE DECIMAL(65,30); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 1bc356428..4d5f900d7 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,5 +1,6 @@ generator client { provider = "prisma-client-js" + previewFeatures = ["extendedWhereUnique"] } datasource db { @@ -123,11 +124,15 @@ model Recipient { Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) Field Field[] Signature Signature[] + + @@unique([documentId, email]) } enum FieldType { SIGNATURE FREE_SIGNATURE + NAME + EMAIL DATE TEXT } @@ -138,8 +143,10 @@ model Field { recipientId Int? type FieldType page Int - positionX Int @default(0) - positionY Int @default(0) + positionX Decimal @default(0) + positionY Decimal @default(0) + width Decimal @default(-1) + height Decimal @default(-1) customText String inserted Boolean Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 839fefab9..1497a1ad5 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -7,6 +7,8 @@ "scripts": { }, "dependencies": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts new file mode 100644 index 000000000..9d39d631b --- /dev/null +++ b/packages/trpc/server/document-router/router.ts @@ -0,0 +1,55 @@ +import { TRPCError } from '@trpc/server'; + +import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; +import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; + +import { authenticatedProcedure, router } from '../trpc'; +import { + ZSetFieldsForDocumentMutationSchema, + ZSetRecipientsForDocumentMutationSchema, +} from './schema'; + +export const documentRouter = router({ + setRecipientsForDocument: authenticatedProcedure + .input(ZSetRecipientsForDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, recipients } = input; + + return await setRecipientsForDocument({ + userId: ctx.user.id, + documentId, + recipients, + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: + 'We were unable to set the recipients for this document. Please try again later.', + }); + } + }), + + setFieldsForDocument: authenticatedProcedure + .input(ZSetFieldsForDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, fields } = input; + + return await setFieldsForDocument({ + userId: ctx.user.id, + documentId, + fields, + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to set the fields for this document. Please try again later.', + }); + } + }), +}); diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts new file mode 100644 index 000000000..1d6f7aa7c --- /dev/null +++ b/packages/trpc/server/document-router/schema.ts @@ -0,0 +1,38 @@ +import { z } from 'zod'; + +import { FieldType } from '@documenso/prisma/client'; + +export const ZSetRecipientsForDocumentMutationSchema = z.object({ + documentId: z.number(), + recipients: z.array( + z.object({ + id: z.number().nullish(), + email: z.string().min(1).email(), + name: z.string(), + }), + ), +}); + +export type TSetRecipientsForDocumentMutationSchema = z.infer< + typeof ZSetRecipientsForDocumentMutationSchema +>; + +export const ZSetFieldsForDocumentMutationSchema = z.object({ + documentId: z.number(), + fields: z.array( + z.object({ + id: z.number().nullish(), + 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 TSetFieldsForDocumentMutationSchema = z.infer< + typeof ZSetFieldsForDocumentMutationSchema +>; diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index d3f47b5c9..e83c5c192 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -1,4 +1,5 @@ import { authRouter } from './auth-router/router'; +import { documentRouter } from './document-router/router'; import { profileRouter } from './profile-router/router'; import { procedure, router } from './trpc'; @@ -6,6 +7,7 @@ export const appRouter = router({ hello: procedure.query(() => 'Hello, world!'), auth: authRouter, profile: profileRouter, + document: documentRouter, }); export type AppRouter = typeof appRouter; diff --git a/packages/ui/primitives/card.tsx b/packages/ui/primitives/card.tsx index 7030bb590..5144c4dfa 100644 --- a/packages/ui/primitives/card.tsx +++ b/packages/ui/primitives/card.tsx @@ -10,22 +10,10 @@ export type CardProps = React.HTMLAttributes & { spotlight?: boolean; gradient?: boolean; degrees?: number; - lightMode?: boolean; }; const Card = React.forwardRef( - ( - { - className, - children, - gradient = false, - spotlight = false, - degrees = 120, - lightMode = true, - ...props - }, - ref, - ) => { + ({ className, children, gradient = false, spotlight = false, degrees = 120, ...props }, ref) => { const mouseX = useMotionValue(0); const mouseY = useMotionValue(0); @@ -46,12 +34,15 @@ const Card = React.forwardRef( } as React.CSSProperties } className={cn( - 'bg-background text-foreground dark:hover:border-documenso group relative rounded-lg border-2 backdrop-blur-[2px]', + 'bg-background text-foreground group relative rounded-lg border-2 backdrop-blur-[2px]', { 'gradient-border-mask before:pointer-events-none before:absolute before:-inset-[2px] before:rounded-lg before:p-[2px] before:[background:linear-gradient(var(--card-gradient-degrees),theme(colors.documenso.DEFAULT/50%)_5%,theme(colors.border/80%)_30%)]': - gradient && lightMode, + gradient, + 'dark:gradient-border-mask before:pointer-events-none before:absolute before:-inset-[2px] before:rounded-lg before:p-[2px] before:[background:linear-gradient(var(--card-gradient-degrees),theme(colors.documenso.DEFAULT/70%)_5%,theme(colors.border/80%)_30%)]': + gradient, 'shadow-[0_0_0_4px_theme(colors.gray.100/70%),0_0_0_1px_theme(colors.gray.100/70%),0_0_0_0.5px_theme(colors.primary.DEFAULT/70%)]': - lightMode, + true, + 'dark:shadow-[0]': true, }, className, )} From 3c02331cb92f5581dcdf1292907f8fd0523e4dd1 Mon Sep 17 00:00:00 2001 From: Doug Andrade Date: Wed, 21 Jun 2023 17:57:02 -0400 Subject: [PATCH 04/25] linking card metrics to filtered /documents --- apps/web/src/app/(dashboard)/dashboard/page.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index b6bad38a9..30ee90ed9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -38,9 +38,15 @@ export default async function DashboardPage() { Dashboard - - - + + + + + + + + + From d8a094a3248e1568f32d40c88504c33447e29442 Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 23 Jun 2023 18:05:43 +1000 Subject: [PATCH 05/25] chore: use jsonprotocol --- packages/prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 4d5f900d7..21320cc69 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,6 +1,6 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["extendedWhereUnique"] + previewFeatures = ["extendedWhereUnique", "jsonProtocol"] } datasource db { From f22baca56986fb15cfe3def6dcc77b272ad8431f Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 23 Jun 2023 12:20:49 +0000 Subject: [PATCH 06/25] feat: stack recipients avatars on dashboard --- .../src/app/(dashboard)/dashboard/page.tsx | 46 +++++++++++++++++++ .../components/(dashboard)/avatar/index.tsx | 36 +++++++++++++++ .../document-dropzone/document-dropzone.tsx | 4 -- .../server-only/document/find-documents.ts | 11 ++++- packages/prisma/schema.prisma | 10 ++-- packages/tailwind-config/index.cjs | 14 ++++++ 6 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/index.tsx diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index b6bad38a9..bdac678ff 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -5,6 +5,7 @@ import { Clock, File, FileCheck } from 'lucide-react'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; +import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -14,12 +15,51 @@ import { TableRow, } from '@documenso/ui/primitives/table'; +import { StackAvatar } from '~/components/(dashboard)/avatar'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; +const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + const initials = + recipient.name + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + const type = + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; + + return ( + + ); + }); +}; + export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -54,6 +94,7 @@ export default async function DashboardPage() { ID Title + Reciepient Status Created @@ -70,6 +111,11 @@ export default async function DashboardPage() { {document.title} + + + {renderStackAvatars(document.Recipient)} + + diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/index.tsx new file mode 100644 index 000000000..a784cbbff --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/index.tsx @@ -0,0 +1,36 @@ +import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; + +export type StackAvatarProps = { + first?: boolean; + zIndex?: string; + fallbackText?: string; + type: 'unsigned' | 'waiting' | 'completed'; +}; + +export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { + let classes = ''; + switch (type) { + case 'unsigned': + classes = 'bg-dawn-400 text-dawn-900'; + break; + case 'waiting': + classes = 'bg-water text-water-700'; + break; + case 'completed': + classes = 'bg-documenso-200 text-documenso-800'; + break; + default: + break; + } + + return ( + + {fallbackText ?? 'UK'} + + ); +}; diff --git a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx index 3688bdfca..10ccba9d0 100644 --- a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx +++ b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx @@ -2,7 +2,6 @@ import { Variants, motion } from 'framer-motion'; import { Plus } from 'lucide-react'; -import { useTheme } from 'next-themes'; import { useDropzone } from 'react-dropzone'; import { cn } from '@documenso/ui/lib/utils'; @@ -92,8 +91,6 @@ export const DocumentDropzone = ({ className, onDrop, ...props }: DocumentDropzo }, }); - const { theme } = useTheme(); - return ( diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 627ceee8b..005b6614a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,5 +1,5 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; import { FindResultSet } from '../../types/find-result-set'; @@ -15,6 +15,10 @@ export interface FindDocumentsOptions { }; } +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; + export const findDocuments = async ({ userId, term, @@ -22,7 +26,7 @@ export const findDocuments = async ({ page = 1, perPage = 10, orderBy, -}: FindDocumentsOptions): Promise> => { +}: FindDocumentsOptions): Promise> => { const orderByColumn = orderBy?.column ?? 'created'; const orderByDirection = orderBy?.direction ?? 'desc'; @@ -48,6 +52,9 @@ export const findDocuments = async ({ orderBy: { [orderByColumn]: orderByDirection, }, + include: { + Recipient: true, + }, }), prisma.document.count({ where: { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 4d5f900d7..4030af769 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,5 +1,5 @@ generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" previewFeatures = ["extendedWhereUnique"] } @@ -143,10 +143,10 @@ model Field { recipientId Int? type FieldType page Int - positionX Decimal @default(0) - positionY Decimal @default(0) - width Decimal @default(-1) - height Decimal @default(-1) + positionX Decimal @default(0) + positionY Decimal @default(0) + width Decimal @default(-1) + height Decimal @default(-1) customText String inserted Boolean Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) diff --git a/packages/tailwind-config/index.cjs b/packages/tailwind-config/index.cjs index 2f6e37954..3d8288ace 100644 --- a/packages/tailwind-config/index.cjs +++ b/packages/tailwind-config/index.cjs @@ -72,6 +72,20 @@ module.exports = { 900: '#52514a', 950: '#2a2925', }, + water: { + DEFAULT: '#d7e4f3', + 50: '#f3f6fb', + 100: '#e3ebf6', + 200: '#d7e4f3', + 300: '#abc7e5', + 400: '#82abd8', + 500: '#658ecc', + 600: '#5175bf', + 700: '#4764ae', + 800: '#3e538f', + 900: '#364772', + 950: '#252d46', + }, }, backgroundImage: { 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', From 2e8e39c5a98057d7588db17f51391d0a54fea7d6 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 23 Jun 2023 20:19:25 +0000 Subject: [PATCH 07/25] feat: add tooltip on hover on stacked avatars --- .../src/app/(dashboard)/dashboard/page.tsx | 145 +++++++++++++++--- .../components/(dashboard)/avatar/index.tsx | 2 +- 2 files changed, 124 insertions(+), 23 deletions(-) diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index bdac678ff..8526a8c05 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -14,6 +14,12 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; @@ -60,6 +66,24 @@ const renderStackAvatars = (recipients: Recipient[]) => { }); }; +const renderAvatar = (recipient: Recipient) => { + const initials = + recipient.name + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; + + const type = + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; + + return ; +}; + export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -100,30 +124,107 @@ export default async function DashboardPage() { - {results.data.map((document) => ( - - {document.id} - - - {document.title} - - + {results.data.map((document) => { + const waitingRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); - - {renderStackAvatars(document.Recipient)} - + const completedRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); - - - - - - - - ))} + const uncompletedRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + {document.id} + + + {document.title} + + + + + + + + {renderStackAvatars(document.Recipient)} + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + + + + + + + + + + + + + ); + })} {results.data.length === 0 && ( diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/index.tsx index a784cbbff..2a263893a 100644 --- a/apps/web/src/components/(dashboard)/avatar/index.tsx +++ b/apps/web/src/components/(dashboard)/avatar/index.tsx @@ -11,7 +11,7 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let classes = ''; switch (type) { case 'unsigned': - classes = 'bg-dawn-400 text-dawn-900'; + classes = 'bg-dawn-200 text-dawn-900'; break; case 'waiting': classes = 'bg-water text-water-700'; From bd0db0f8fdc1474afd70ce4c68aad7620ad3fedd Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 14:59:08 +1000 Subject: [PATCH 08/25] feat: email templates adds email templates using `react-email` which will be used for invites, signing and document completion. authored by @dephraiim --- package-lock.json | 6535 ++++++++++++++++- package.json | 3 +- packages/email/.gitignore | 1 + packages/email/ambient.d.ts | 1 + packages/email/index.ts | 1 + packages/email/package.json | 22 + packages/email/static/clock.png | Bin 0 -> 2469 bytes packages/email/static/completed.png | Bin 0 -> 1812 bytes packages/email/static/document.png | Bin 0 -> 16295 bytes packages/email/static/download.png | Bin 0 -> 784 bytes packages/email/static/logo.png | Bin 0 -> 4119 bytes packages/email/static/review.png | Bin 0 -> 708 bytes packages/email/tailwind.config.js | 11 + .../email/templates/document-completed.tsx | 129 + packages/email/templates/document-invite.tsx | 127 + packages/email/templates/document-pending.tsx | 104 + packages/email/tsconfig.json | 5 + 17 files changed, 6931 insertions(+), 8 deletions(-) create mode 100644 packages/email/.gitignore create mode 100644 packages/email/ambient.d.ts create mode 100644 packages/email/index.ts create mode 100644 packages/email/package.json create mode 100644 packages/email/static/clock.png create mode 100644 packages/email/static/completed.png create mode 100644 packages/email/static/document.png create mode 100644 packages/email/static/download.png create mode 100644 packages/email/static/logo.png create mode 100644 packages/email/static/review.png create mode 100644 packages/email/tailwind.config.js create mode 100644 packages/email/templates/document-completed.tsx create mode 100644 packages/email/templates/document-invite.tsx create mode 100644 packages/email/templates/document-pending.tsx create mode 100644 packages/email/tsconfig.json diff --git a/package-lock.json b/package-lock.json index bd3775a2f..a6f2fd973 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,8 @@ "name": "documenso.next", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "packages/email/.react-email" ], "devDependencies": { "dotenv": "^16.0.3", @@ -420,6 +421,10 @@ "node": ">=6.9.0" } }, + "node_modules/@documenso/email": { + "resolved": "packages/email", + "link": true + }, "node_modules/@documenso/eslint-config": { "resolved": "packages/eslint-config", "link": true @@ -475,6 +480,358 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "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", @@ -644,6 +1001,158 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, + "node_modules/@manypkg/find-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-2.1.0.tgz", + "integrity": "sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==", + "dev": true, + "dependencies": { + "@manypkg/tools": "^1.0.0", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@manypkg/tools": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-1.1.0.tgz", + "integrity": "sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==", + "dev": true, + "dependencies": { + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "jju": "^1.4.0", + "read-yaml-file": "^1.1.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@manypkg/tools/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/tools/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/tools/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -663,6 +1172,64 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "dependencies": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "dependencies": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "dependencies": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "node_modules/@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "dependencies": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "node_modules/@next-auth/prisma-adapter": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.6.tgz", @@ -852,6 +1419,177 @@ "node": ">= 8" } }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", + "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@panva/hkdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", @@ -934,6 +1672,11 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" }, + "node_modules/@radix-ui/colors": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", + "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" + }, "node_modules/@radix-ui/number": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", @@ -1676,6 +2419,90 @@ "react-dom": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.1.tgz", + "integrity": "sha512-eye/gYvzy82xtoSSeu5Pwlzrh6N2rOcDIwAI7xMatu622Qjlg64LtwB0PSh3iWdmn6Wqy1Fjo5twNPQsp0guiw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-toggle": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.1.tgz", + "integrity": "sha512-hZIp9ZKnw4NwVqeB4evWBLa91ryaSJhAO0Ed82wkzRPgg/I29ypcY6SuBb3AMZW+GsuBZpIVujpCq+33TdEcyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.5.tgz", @@ -1802,11 +2629,260 @@ "@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/components/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==", + "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/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-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.6", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.6.tgz", + "integrity": "sha512-6zs7WZbd37TcPT1OmMPH/kcBpv0QSi+k3om7LyDnbdIcrbwOO/OstVwUaa/6zgvDvnq9Y2wOosbru7j5kUrW9A==", + "dev": true, + "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/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_modules/@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" }, + "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/@swc/helpers": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", @@ -1954,6 +3030,16 @@ "@types/node": "*" } }, + "node_modules/@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "classnames": "*" + } + }, "node_modules/@types/formidable": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", @@ -1978,6 +3064,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -2224,6 +3316,24 @@ "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-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/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2520,6 +3630,26 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcrypt": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", @@ -2533,6 +3663,12 @@ "node": ">= 10.0.0" } }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -2541,6 +3677,19 @@ "node": ">=0.6" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2549,6 +3698,23 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -2607,6 +3773,48 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -2702,6 +3910,18 @@ "node": ">=6" } }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2770,11 +3990,49 @@ } } }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -2967,6 +4225,28 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3002,6 +4282,12 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3112,6 +4398,14 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -3144,6 +4438,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -3170,6 +4476,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/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -3183,6 +4497,12 @@ "node": ">= 0.6" } }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "node_modules/detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -3196,6 +4516,123 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-package-manager/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/detect-package-manager/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/detect-package-manager/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-package-manager/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-package-manager/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-package-manager/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-package-manager/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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", @@ -3242,6 +4679,57 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -3275,6 +4763,87 @@ "node": ">=12" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, "node_modules/electron-to-chromium": { "version": "1.4.397", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", @@ -3308,6 +4877,26 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -3411,6 +5000,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.4", + "@esbuild/android-arm64": "0.16.4", + "@esbuild/android-x64": "0.16.4", + "@esbuild/darwin-arm64": "0.16.4", + "@esbuild/darwin-x64": "0.16.4", + "@esbuild/freebsd-arm64": "0.16.4", + "@esbuild/freebsd-x64": "0.16.4", + "@esbuild/linux-arm": "0.16.4", + "@esbuild/linux-arm64": "0.16.4", + "@esbuild/linux-ia32": "0.16.4", + "@esbuild/linux-loong64": "0.16.4", + "@esbuild/linux-mips64el": "0.16.4", + "@esbuild/linux-ppc64": "0.16.4", + "@esbuild/linux-riscv64": "0.16.4", + "@esbuild/linux-s390x": "0.16.4", + "@esbuild/linux-x64": "0.16.4", + "@esbuild/netbsd-x64": "0.16.4", + "@esbuild/openbsd-x64": "0.16.4", + "@esbuild/sunos-x64": "0.16.4", + "@esbuild/win32-arm64": "0.16.4", + "@esbuild/win32-ia32": "0.16.4", + "@esbuild/win32-x64": "0.16.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4013,6 +5639,15 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, "node_modules/eslint-plugin-turbo": { "version": "1.9.6", "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.9.6.tgz", @@ -4021,6 +5656,15 @@ "eslint": ">6.6.0" } }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4183,6 +5827,22 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4193,6 +5853,19 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "node_modules/fast-folder-size": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fast-folder-size/-/fast-folder-size-1.6.1.tgz", + "integrity": "sha512-F3tRpfkAzb7TT2JNKaJUglyuRjRa+jelQD94s9OSqkfEeytLmupCqQiD+H2KoIXGtp4pB5m4zNmv5m2Ktcr+LA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "unzipper": "^0.10.11" + }, + "bin": { + "fast-folder-size": "cli.js" + } + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -4353,6 +6026,20 @@ } } }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -4393,6 +6080,45 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4688,6 +6414,91 @@ "node": ">=8" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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-dom-parser/node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "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==", + "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/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", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -4734,6 +6545,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -4779,6 +6610,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "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", @@ -4792,6 +6633,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4828,6 +6678,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4865,6 +6721,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4915,6 +6776,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4959,6 +6828,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -5008,6 +6886,15 @@ "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5099,6 +6986,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -5141,6 +7040,14 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -5198,6 +7105,12 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", @@ -5206,6 +7119,76 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-beautify": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", + "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "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==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -5243,6 +7226,12 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5264,6 +7253,18 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -5276,6 +7277,17 @@ "node": ">=4.0" } }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -5289,6 +7301,14 @@ "language-subtag-registry": "~0.3.2" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5314,6 +7334,12 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5343,6 +7369,22 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5806,6 +7848,27 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6061,6 +8124,29 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6089,6 +8175,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -6105,6 +8200,36 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6181,6 +8306,14 @@ "canvas": "^2.11.2" } }, + "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/perfect-freehand": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", @@ -6245,6 +8378,27 @@ "node": "^10 || ^12 || >=14" } }, + "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/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", @@ -6483,11 +8637,44 @@ } } }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, "node_modules/prisma": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", @@ -6504,6 +8691,12 @@ "node": ">=14.17" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6522,6 +8715,16 @@ "react-is": "^16.13.1" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -6563,6 +8766,17 @@ } ] }, + "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/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -6659,6 +8873,98 @@ "react": ">= 16.8 || 18.0.0" } }, + "node_modules/react-email": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-1.9.4.tgz", + "integrity": "sha512-DNUQb7xzAlMga2ZppG57bnWhJnqOEcTYzxNvLA4IVCiYJkgPNVukFMOZVG2OuQ0W8ddiF6bLZBKDZHnnIenbpw==", + "dev": true, + "dependencies": { + "@commander-js/extra-typings": "9.4.1", + "@manypkg/find-root": "2.1.0", + "@octokit/rest": "19.0.7", + "@react-email/render": "0.0.6", + "chokidar": "3.5.3", + "commander": "9.4.1", + "detect-package-manager": "2.0.1", + "esbuild": "0.16.4", + "fs-extra": "11.1.0", + "glob": "8.0.3", + "log-symbols": "4.1.0", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "read-pkg": "5.2.0", + "shelljs": "0.8.5", + "tree-node-cli": "1.6.0" + }, + "bin": { + "email": "dist/source/index.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/react-email-client": { + "resolved": "packages/email/.react-email", + "link": true + }, + "node_modules/react-email/node_modules/@commander-js/extra-typings": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-9.4.1.tgz", + "integrity": "sha512-v0BqORYamk1koxDon6femDGLWSL7P78vYTyOU5nFaALnmNALL+ktgdHvWbxzzBBJIKS7kv3XvM/DqNwiLcgFTA==", + "dev": true, + "peerDependencies": { + "commander": "9.4.x" + } + }, + "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", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/react-email/node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/react-email/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-hook-form": { "version": "7.43.9", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", @@ -6709,6 +9015,11 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "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", @@ -6823,6 +9134,54 @@ "pify": "^2.3.0" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -6847,6 +9206,18 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -6911,6 +9282,43 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -7105,10 +9513,21 @@ "loose-envify": "^1.1.0" } }, + "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/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7124,6 +9543,12 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -7148,6 +9573,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -7161,6 +9603,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7237,6 +9684,38 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7425,6 +9904,22 @@ "node": ">=12.*" } }, + "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-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/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -7752,6 +10247,39 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tree-node-cli": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.6.0.tgz", + "integrity": "sha512-M8um5Lbl76rWU5aC8oOeEhruiCM29lFCKnwpxrwMjpRicHXJx+bb9Cak11G3zYLrMb6Glsrhnn90rHIzDJrjvg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "fast-folder-size": "1.6.1", + "pretty-bytes": "^5.6.0" + }, + "bin": { + "tree": "bin/tree.js", + "treee": "bin/tree.js" + } + }, + "node_modules/tree-node-cli/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -7888,6 +10416,171 @@ "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/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/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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7949,6 +10642,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7965,6 +10673,60 @@ "node": ">=8" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -8082,6 +10844,25 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -8192,6 +10973,14 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -8224,6 +11013,1037 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "packages/email": { + "name": "@documenso/email", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7" + }, + "devDependencies": { + "react-email": "^1.9.4" + } + }, + "packages/email/.react-email": { + "name": "react-email-client", + "version": "0.0.14", + "license": "MIT", + "dependencies": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@radix-ui/colors": "0.1.8", + "@radix-ui/react-collapsible": "1.0.1", + "@radix-ui/react-popover": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-toggle-group": "1.0.1", + "@radix-ui/react-tooltip": "1.0.2", + "@react-email/components": "^0.0.7", + "@react-email/render": "0.0.7", + "classnames": "2.3.2", + "framer-motion": "8.4.6", + "next": "13.2.4", + "prism-react-renderer": "1.3.5", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/classnames": "2.3.1", + "@types/node": "18.11.9", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", + "autoprefixer": "10.4.13", + "eslint": "8.36.0", + "eslint-config-next": "13.2.4", + "eslint-config-prettier": "8.7.0", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", + "postcss": "8.4.19", + "prettier": "2.8.4", + "tailwindcss": "3.2.4", + "typescript": "4.9.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/email/node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/email/node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "packages/email/node_modules/@next/env": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", + "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" + }, + "packages/email/node_modules/@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + } + }, + "packages/email/node_modules/@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-darwin-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", + "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-darwin-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", + "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", + "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", + "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-x64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", + "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-x64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", + "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", + "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", + "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-x64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", + "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-collapsible": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.1.tgz", + "integrity": "sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-tooltip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz", + "integrity": "sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/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==", + "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" + } + }, + "packages/email/node_modules/@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "packages/email/node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "packages/email/node_modules/@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "packages/email/node_modules/@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "packages/email/node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "packages/email/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "packages/email/node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "packages/email/node_modules/eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/eslint-config-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.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" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/email/node_modules/eslint-config-prettier": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "packages/email/node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "packages/email/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/framer-motion": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.4.6.tgz", + "integrity": "sha512-0GkpTQnhDysG5SiD2VbANtAs8yCXVQLasynVABDTZYI+Qcx1krWg+rfyveM8W78q7AX+8RTsiMz/LJ7YIRZvFw==", + "dependencies": { + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "packages/email/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/email/node_modules/next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", + "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", + "dependencies": { + "@next/env": "13.2.4", + "@swc/helpers": "0.4.14", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=14.6.0" + }, + "optionalDependencies": { + "@next/swc-android-arm-eabi": "13.2.4", + "@next/swc-android-arm64": "13.2.4", + "@next/swc-darwin-arm64": "13.2.4", + "@next/swc-darwin-x64": "13.2.4", + "@next/swc-freebsd-x64": "13.2.4", + "@next/swc-linux-arm-gnueabihf": "13.2.4", + "@next/swc-linux-arm64-gnu": "13.2.4", + "@next/swc-linux-arm64-musl": "13.2.4", + "@next/swc-linux-x64-gnu": "13.2.4", + "@next/swc-linux-x64-musl": "13.2.4", + "@next/swc-win32-arm64-msvc": "13.2.4", + "@next/swc-win32-ia32-msvc": "13.2.4", + "@next/swc-win32-x64-msvc": "13.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "packages/email/node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "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" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "packages/email/node_modules/postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "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" + } + }, + "packages/email/node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "packages/email/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==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "packages/email/node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "packages/email/node_modules/tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "packages/email/node_modules/tailwindcss/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==", + "dev": true, + "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 + } + } + }, + "packages/email/node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "packages/email/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", @@ -8787,6 +12607,617 @@ "to-fast-properties": "^2.0.0" } }, + "@documenso/email": { + "version": "file:packages/email", + "requires": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7", + "react-email": "^1.9.4" + }, + "dependencies": { + "@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@next/env": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", + "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" + }, + "@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "dev": true, + "requires": { + "glob": "7.1.7" + } + }, + "@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", + "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", + "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", + "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", + "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", + "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", + "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", + "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", + "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", + "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", + "optional": true + }, + "@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-collapsible": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.1.tgz", + "integrity": "sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-tooltip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz", + "integrity": "sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@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==", + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + }, + "@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-config-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "dev": true, + "requires": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.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" + } + }, + "eslint-config-prettier": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "dev": true, + "requires": {} + }, + "eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "framer-motion": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.4.6.tgz", + "integrity": "sha512-0GkpTQnhDysG5SiD2VbANtAs8yCXVQLasynVABDTZYI+Qcx1krWg+rfyveM8W78q7AX+8RTsiMz/LJ7YIRZvFw==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", + "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", + "requires": { + "@next/env": "13.2.4", + "@next/swc-android-arm-eabi": "13.2.4", + "@next/swc-android-arm64": "13.2.4", + "@next/swc-darwin-arm64": "13.2.4", + "@next/swc-darwin-x64": "13.2.4", + "@next/swc-freebsd-x64": "13.2.4", + "@next/swc-linux-arm-gnueabihf": "13.2.4", + "@next/swc-linux-arm64-gnu": "13.2.4", + "@next/swc-linux-arm64-musl": "13.2.4", + "@next/swc-linux-x64-gnu": "13.2.4", + "@next/swc-linux-x64-musl": "13.2.4", + "@next/swc-win32-arm64-msvc": "13.2.4", + "@next/swc-win32-ia32-msvc": "13.2.4", + "@next/swc-win32-x64-msvc": "13.2.4", + "@swc/helpers": "0.4.14", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1" + }, + "dependencies": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "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==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true + }, + "tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + } + } + }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, "@documenso/eslint-config": { "version": "file:packages/eslint-config", "requires": { @@ -9115,6 +13546,160 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "@esbuild/android-arm": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.4.tgz", + "integrity": "sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz", + "integrity": "sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -9245,6 +13830,129 @@ } } }, + "@manypkg/find-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-2.1.0.tgz", + "integrity": "sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==", + "dev": true, + "requires": { + "@manypkg/tools": "^1.0.0", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@manypkg/tools": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-1.1.0.tgz", + "integrity": "sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "jju": "^1.4.0", + "read-yaml-file": "^1.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, "@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -9261,6 +13969,64 @@ "tar": "^6.1.11" } }, + "@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "requires": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "requires": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "requires": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "requires": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "requires": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "@next-auth/prisma-adapter": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.6.tgz", @@ -9357,6 +14123,144 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true + }, + "@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "requires": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "requires": { + "@octokit/types": "^10.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } + } + }, + "@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", + "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "dev": true, + "requires": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + } + }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + }, "@panva/hkdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", @@ -9417,6 +14321,11 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" }, + "@radix-ui/colors": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", + "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" + }, "@radix-ui/number": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", @@ -10005,6 +14914,72 @@ "@radix-ui/react-use-controllable-state": "1.0.0" } }, + "@radix-ui/react-toggle-group": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.1.tgz", + "integrity": "sha512-eye/gYvzy82xtoSSeu5Pwlzrh6N2rOcDIwAI7xMatu622Qjlg64LtwB0PSh3iWdmn6Wqy1Fjo5twNPQsp0guiw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-toggle": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "dependencies": { + "@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + }, + "@radix-ui/react-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.1.tgz", + "integrity": "sha512-hZIp9ZKnw4NwVqeB4evWBLa91ryaSJhAO0Ed82wkzRPgg/I29ypcY6SuBb3AMZW+GsuBZpIVujpCq+33TdEcyg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + } + } + }, "@radix-ui/react-tooltip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.5.tgz", @@ -10102,11 +15077,207 @@ "@babel/runtime": "^7.13.10" } }, + "@react-email/body": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.2.tgz", + "integrity": "sha512-SqZrZdxZlH7viwnrLvrMnVzOKpiofVAtho09bmm2siDzy0VMDGItXRzUPLcpg9vcbVJCHZRCIKoNXqA+PtokzQ==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@react-email/components": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.7.tgz", + "integrity": "sha512-GpRKV8E7EvK9OPf61f5Z8hliB3p0hTot8tslmEUVCTtX7tdL0wM2YEcZiDWU4PJcudJ/QWHJ7Y5wGzNEARcooA==", + "requires": { + "@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" + }, + "dependencies": { + "@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==", + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + } + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "@radix-ui/react-slot": "1.0.0", + "react": "18.2.0" + }, + "dependencies": { + "@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==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + } + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==" + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "dev": true, + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + }, + "@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==" + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "html-react-parser": "3.0.9", + "react": "18.2.0", + "react-dom": "18.2.0", + "tw-to-css": "0.0.11" + } + }, + "@react-email/text": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.5.tgz", + "integrity": "sha512-LXhHiaC6oRRsNAfOzJDos4wQA22eIdVJvR6G7uu4QzUvYNOAatDMf89jRQcKGrxX7InkS640v8sHd9jl5ztM5w==", + "requires": { + "react": "18.2.0" + } + }, "@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" }, + "@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==", + "requires": { + "domhandler": "^5.0.3", + "selderee": "^0.10.0" + } + }, "@swc/helpers": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", @@ -10189,6 +15360,15 @@ "@types/node": "*" } }, + "@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "dev": true, + "requires": { + "classnames": "*" + } + }, "@types/formidable": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", @@ -10213,6 +15393,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -10362,6 +15548,21 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, + "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==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "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==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -10572,6 +15773,12 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "bcrypt": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", @@ -10581,16 +15788,49 @@ "node-addon-api": "^5.0.0" } }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -10627,6 +15867,28 @@ "update-browserslist-db": "^1.0.10" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true + }, "bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -10683,6 +15945,15 @@ "simple-get": "^3.0.3" } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10720,11 +15991,37 @@ "clsx": "1.2.1" } }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true + }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, "clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -10868,6 +16165,25 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -10891,6 +16207,12 @@ "is-what": "^4.1.8" } }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10971,6 +16293,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, "default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -10991,6 +16318,15 @@ "untildify": "^4.0.0" } }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -11005,6 +16341,11 @@ "object-keys": "^1.1.1" } }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -11015,6 +16356,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -11025,6 +16372,86 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dev": true, + "requires": { + "execa": "^5.1.1" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -11065,6 +16492,39 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -11089,6 +16549,85 @@ "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, "electron-to-chromium": { "version": "1.4.397", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", @@ -11116,6 +16655,20 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -11201,6 +16754,36 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.4", + "@esbuild/android-arm64": "0.16.4", + "@esbuild/android-x64": "0.16.4", + "@esbuild/darwin-arm64": "0.16.4", + "@esbuild/darwin-x64": "0.16.4", + "@esbuild/freebsd-arm64": "0.16.4", + "@esbuild/freebsd-x64": "0.16.4", + "@esbuild/linux-arm": "0.16.4", + "@esbuild/linux-arm64": "0.16.4", + "@esbuild/linux-ia32": "0.16.4", + "@esbuild/linux-loong64": "0.16.4", + "@esbuild/linux-mips64el": "0.16.4", + "@esbuild/linux-ppc64": "0.16.4", + "@esbuild/linux-riscv64": "0.16.4", + "@esbuild/linux-s390x": "0.16.4", + "@esbuild/linux-x64": "0.16.4", + "@esbuild/netbsd-x64": "0.16.4", + "@esbuild/openbsd-x64": "0.16.4", + "@esbuild/sunos-x64": "0.16.4", + "@esbuild/win32-arm64": "0.16.4", + "@esbuild/win32-ia32": "0.16.4", + "@esbuild/win32-x64": "0.16.4" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -11662,12 +17245,25 @@ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "requires": {} }, + "eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "requires": {} + }, "eslint-plugin-turbo": { "version": "1.9.6", "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.9.6.tgz", "integrity": "sha512-xxa+gfTg3CG7wKJbkOIqdZw2eXhriORjw/55GDjJiUrNhU4vo1tA+9HDo/glTQygZ22Pj3nxYhxINFnQ/IU3lg==", "requires": {} }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11768,6 +17364,19 @@ "strip-final-newline": "^3.0.0" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11778,6 +17387,15 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "fast-folder-size": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fast-folder-size/-/fast-folder-size-1.6.1.tgz", + "integrity": "sha512-F3tRpfkAzb7TT2JNKaJUglyuRjRa+jelQD94s9OSqkfEeytLmupCqQiD+H2KoIXGtp4pB5m4zNmv5m2Ktcr+LA==", + "dev": true, + "requires": { + "unzipper": "^0.10.11" + } + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -11893,6 +17511,17 @@ "tslib": "^2.4.0" } }, + "fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -11922,6 +17551,38 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -12121,6 +17782,73 @@ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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==", + "requires": { + "domhandler": "5.0.3", + "htmlparser2": "8.0.1" + }, + "dependencies": { + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + } + } + }, + "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==", + "requires": { + "domhandler": "5.0.3", + "html-dom-parser": "3.1.3", + "react-property": "2.0.0", + "style-to-js": "1.1.3" + } + }, + "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==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.10.0", + "deepmerge": "^4.2.2", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.1", + "selderee": "^0.10.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -12155,6 +17883,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -12188,6 +17922,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -12198,6 +17942,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -12225,6 +17975,12 @@ "is-typed-array": "^1.1.10" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -12250,6 +18006,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12276,6 +18037,11 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12302,6 +18068,12 @@ "is-docker": "^3.0.0" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -12330,6 +18102,12 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -12385,6 +18163,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -12412,6 +18196,11 @@ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.9.tgz", "integrity": "sha512-I3FU0rkVvwhgLLEs6iITwZ/JaLXe7tQcHyzupXky8jigt1vu4KM0UOqDr963j36JRvJ835EATVIm6MnGz/i1/g==" }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==" + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -12456,11 +18245,66 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" }, + "js-beautify": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", + "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + } + } + }, "js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -12485,6 +18329,12 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12503,6 +18353,16 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -12512,6 +18372,14 @@ "object.assign": "^4.1.3" } }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -12525,6 +18393,11 @@ "language-subtag-registry": "~0.3.2" } }, + "leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==" + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -12544,6 +18417,12 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12567,6 +18446,16 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -12860,6 +18749,26 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13036,6 +18945,23 @@ "word-wrap": "^1.2.3" } }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -13052,6 +18978,12 @@ "p-limit": "^3.0.2" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -13065,6 +18997,27 @@ "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseley": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz", + "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==", + "requires": { + "leac": "^0.6.0", + "peberminta": "^0.8.0" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13123,6 +19076,11 @@ "web-streams-polyfill": "^3.2.1" } }, + "peberminta": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", + "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==" + }, "perfect-freehand": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", @@ -13158,6 +19116,23 @@ "source-map-js": "^1.0.2" } }, + "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==", + "requires": { + "balanced-match": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "extend": "^3.0.1" + }, + "dependencies": { + "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==" + } + } + }, "postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -13254,11 +19229,33 @@ "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==", "requires": {} }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-format": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" }, + "prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "requires": {} + }, "prisma": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", @@ -13267,6 +19264,12 @@ "@prisma/engines": "4.14.0" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -13282,6 +19285,16 @@ "react-is": "^16.13.1" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -13300,6 +19313,11 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "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==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -13367,6 +19385,112 @@ "prop-types": "^15.8.1" } }, + "react-email": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-1.9.4.tgz", + "integrity": "sha512-DNUQb7xzAlMga2ZppG57bnWhJnqOEcTYzxNvLA4IVCiYJkgPNVukFMOZVG2OuQ0W8ddiF6bLZBKDZHnnIenbpw==", + "dev": true, + "requires": { + "@commander-js/extra-typings": "9.4.1", + "@manypkg/find-root": "2.1.0", + "@octokit/rest": "19.0.7", + "@react-email/render": "0.0.6", + "chokidar": "3.5.3", + "commander": "9.4.1", + "detect-package-manager": "2.0.1", + "esbuild": "0.16.4", + "fs-extra": "11.1.0", + "glob": "8.0.3", + "log-symbols": "4.1.0", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "read-pkg": "5.2.0", + "shelljs": "0.8.5", + "tree-node-cli": "1.6.0" + }, + "dependencies": { + "@commander-js/extra-typings": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-9.4.1.tgz", + "integrity": "sha512-v0BqORYamk1koxDon6femDGLWSL7P78vYTyOU5nFaALnmNALL+ktgdHvWbxzzBBJIKS7kv3XvM/DqNwiLcgFTA==", + "dev": true, + "requires": {} + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "react-email-client": { + "version": "file:packages/email/.react-email", + "requires": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@radix-ui/colors": "0.1.8", + "@radix-ui/react-collapsible": "1.0.1", + "@radix-ui/react-popover": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-toggle-group": "1.0.1", + "@radix-ui/react-tooltip": "1.0.2", + "@react-email/components": "^0.0.7", + "@react-email/render": "0.0.7", + "@types/classnames": "2.3.1", + "@types/node": "18.11.9", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", + "autoprefixer": "10.4.13", + "classnames": "2.3.2", + "eslint": "8.36.0", + "eslint-config-next": "13.2.4", + "eslint-config-prettier": "8.7.0", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", + "framer-motion": "8.4.6", + "next": "13.2.4", + "postcss": "8.4.19", + "prettier": "2.8.4", + "prism-react-renderer": "1.3.5", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.2.4", + "typescript": "4.9.3" + } + }, "react-hook-form": { "version": "7.43.9", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", @@ -13399,6 +19523,11 @@ "tiny-warning": "^1.0.0" } }, + "react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, "react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -13469,6 +19598,46 @@ "pify": "^2.3.0" } }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -13487,6 +19656,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -13527,6 +19705,33 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -13643,10 +19848,18 @@ "loose-envify": "^1.1.0" } }, + "selderee": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz", + "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==", + "requires": { + "parseley": "^0.11.0" + } + }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "requires": { "lru-cache": "^6.0.0" } @@ -13656,6 +19869,12 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -13674,6 +19893,17 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -13684,6 +19914,11 @@ "object-inspect": "^1.9.0" } }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -13731,6 +19966,38 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13872,6 +20139,22 @@ "qs": "^6.11.0" } }, + "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==", + "requires": { + "style-to-object": "0.4.1" + } + }, + "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==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -14107,6 +20390,31 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "tree-node-cli": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.6.0.tgz", + "integrity": "sha512-M8um5Lbl76rWU5aC8oOeEhruiCM29lFCKnwpxrwMjpRicHXJx+bb9Cak11G3zYLrMb6Glsrhnn90rHIzDJrjvg==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "fast-folder-size": "1.6.1", + "pretty-bytes": "^5.6.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -14199,6 +20507,103 @@ "dev": true, "optional": true }, + "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==", + "requires": { + "postcss": "8.4.21", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.2.7" + }, + "dependencies": { + "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==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "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==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "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==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "tailwindcss": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "requires": { + "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" + } + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14238,6 +20643,18 @@ "which-boxed-primitive": "^1.0.2" } }, + "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==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14248,6 +20665,62 @@ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" }, + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -14309,6 +20782,25 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -14395,6 +20887,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -14414,6 +20911,30 @@ "version": "3.21.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" + }, + "@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "optional": true } } } diff --git a/package.json b/package.json index 428819000..74a71ab20 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "packageManager": "npm@8.19.2", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "packages/email/.react-email" ] } diff --git a/packages/email/.gitignore b/packages/email/.gitignore new file mode 100644 index 000000000..13141bd9b --- /dev/null +++ b/packages/email/.gitignore @@ -0,0 +1 @@ +.react-email/ diff --git a/packages/email/ambient.d.ts b/packages/email/ambient.d.ts new file mode 100644 index 000000000..54b8c1d7c --- /dev/null +++ b/packages/email/ambient.d.ts @@ -0,0 +1 @@ +declare module '@documenso/tailwind-config'; diff --git a/packages/email/index.ts b/packages/email/index.ts new file mode 100644 index 000000000..40a09d7f9 --- /dev/null +++ b/packages/email/index.ts @@ -0,0 +1 @@ +export { render, renderAsync } from '@react-email/components'; diff --git a/packages/email/package.json b/packages/email/package.json new file mode 100644 index 000000000..6697c04b2 --- /dev/null +++ b/packages/email/package.json @@ -0,0 +1,22 @@ +{ + "name": "@documenso/email", + "version": "1.0.0", + "main": "./index.ts", + "types": "./index.ts", + "license": "MIT", + "files": [ + "templates/" + ], + "scripts": { + "dev": "email dev --port 3002 --dir templates" + }, + "dependencies": { + "@documenso/tsconfig": "*", + "@documenso/tailwind-config": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7" + }, + "devDependencies": { + "react-email": "^1.9.4" + } +} diff --git a/packages/email/static/clock.png b/packages/email/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=@W5L-IEDgI7y)r_|L3kNgB#S?8k7T{G^6e4%63s& zF*5;k5w8^m@kE<|`4&83Ij;hiy5H%F&<;=v+pbfbR=s7uOf0Bb!2**Uwt|kXI zZ4YgJxZOa+jf`Y;+)8CNuW!gjKs<&==5Rt|d}{EnbNOViNRLfqtO2U6N#7c_j}yE(%mU~s2axRyIUTq{8q{>xk$)FK!%?84Sn?KoT9j2sXcl^d)zQw@>V8y zgoX?VqsZ#%(claBa=7$#jv*|6%MF7i`uMKpmU`$o`;Y+>HDL3@oh?B0#EXdAPj0;S z;0%#w5=yI`$3MKhpZ0tz0ljfPIutK1fbe~!kw9_6O4=xtY686=M*ykbq6p96wy-Hm z*Njrny~CC@LbVbQtG;aazI!F|V8L)H>TYnrC0wcpRo5D@i6+qV`qAIgHS+dXpU!#C zo)tVgRHEpJg0%4-Kc-RPsx&Hy8W5UD9%sq!7gcx$w+&HABSX!m1qlM!Ug#xF;a-1{ z?A`{q8|;Xtpm1IC1qlKI*J+8iuVCh>=RCk_u0Ym;6NeKuqeu`yA?+{1!~T=&ulC@a zzzI+G$hisjZf+*e4S}7XILo6f44fmd7D&E;Wg9nx>hPbyL{0gXjxFRY4G;hPc^xC; z@i9_Fmv_ETz1=pD432sx4trnj8v?1#vhXfa|KB<=M{o>cjM?E7TbyR2P&}Rv=Rhy| z6XSvr8Ap8p3Tf*(tAEPeV;ORS)9S*>5gGN^0|^3<(pWGjq)xmH`~x|mK}nihAHC-k z97PE?Lj|L`sDG;PoNuUBb|5E|-1geAtOF-l?LyrMfpNE5^RXjShY4+t=z3nKuP65lmU!dVGFjsXGvCF&wTiy&5q z#UzmM`)4V3JhBZ4;15ePC`zi;VM^p6p%k@8g<|Ioe`kCc^v7>j%3OmP zkb#8qY+i2rNN_Y73Zoc1+w3(nQb;J(;fa|ol|ldsD~65_-`#4$j9?P9F{}L<8kfD4 zDZEFKs3ogC(#a$F05=K`0_`N$0w_jk(oY*^#G{|y9MI1J%mE>X;R1}Vw1@wXW`yE= znjokpp}5G9)SqP=*EnG=p#Mmov!|685xwL|QvJEoZ2Vk;09!)wTxkJ{>x8}=gbDLY zt_xTaif~S}z`CSInXSw#L%g_P(Sohb*t;$!deiXa9D}P@$oYv$Rgr)cE#RSYe-TX~ zu2+n!Mv~yt9cyj?EU+#yarK4kJc9*8@QK?buV$w$=~)S2EzoGh5SBANJzHB0oVI06 zy2gc+Y0svn#Nyn#tqv#7)t@~HlS+6d)hK4F5_|Ce_MxpXQYqMTg7AKpimW0L+kC9{ za?f+n^Z3VCE0f-nsY=WV!&Qqvh|M8zoFi|F#L2Yaktq1&9)U%8f*(~XnQ{@C3nequ z<`q`KZ9~5@JtdvS$Th>vRVtf_1kNca*e-H8Jx57??&)>zV(HU5oaY&KgT$K~kXDwb zU0jXJ^t4&dvKN7E-nksE<}K5mx?Da(&F(N_GPqn`q3Vopj^ZAM&)?KeLetQkv*%2X zfmY@X7;)L&o2kO|88=MaY8s`#&J7d8U~N!JtqbL8rJ%^l^g;+=uy0UN*UPojBPYrz z$uE4{9D@@QTx?b3wmDAJ6uk-K^xfrwwW1n^jYzAO26YWHY@Fm?rdIjn0N+9c9rwH9 z_X>`D59W;i=BW4&VvQGNwL+g(Y>%bQR2R5Fx%eNk{HodmS~Up(0000fd#V51=ukr*ajJ}z%~zC*hJV4IR3*B5)v6vMTFNt zOo_xP%2WhajG=f`Ku#!Pk#eOXh1Ebp%DUF~WgGtxe0=FXf>|N8c? z@7Leyb00HzW>@z8YVMp@pFVxg`JM0G-PT-0a?V+~ZLM{3Kepw1>6k2|>tT7hJ*7*B zthq=eK~Vya+*bmareS3ySk08C1d@QkI)Cz5X@6;3uN(1kwbfZ_$CS2)F6sl9VzWhj z#$v;Pu^w)z%MKIaQ<^MY6!4Wmq4YbH8CZt`itFtP=Y@6dD_vgfck!H3d)U_OdQw%G z0&`3( ze2{h8Cc3o6+GbqDB|nC-IEvt2Zj`dI&0$lWqd8{rn5TL@s=z46MzQd9*|u}+h^oiM z;@}zQlZw3j$_L%VI5(*bf$Y2pyufWf^q~)><7Na>z~lLb^>90uO{+Xd9v5w3J2L>b z0B;=bm$+uz{i*$y9JvjYqF}2^!)57Ls%uM00#E-+$K`o)8P|>8$NdB91o#42xNrad z{ndarm5x{9r}xVxlz;OV7fvT%m21yeD~$SWh+RSq^&c`g!sCE$3&?x9xom+umwQ z54`j>kmOe?zZ7zu!b2^(Po(}PzGAV<8UIpCTt(||)X4%#&IOJ|u7&-Pk|_P;CqGG$ zvmCGC2xe7h#d6}3=7S&nAUS7tUvZ!0o19d+WUqxc=C`w)ZlqZ0Q_xF-Tv0NW-za_}l`h{j<^X+ec zdq)ES`|#uW0GZrYKn>^lxV{Z@xbqJ@ z9EUi@HpC{jZ@TFw>j4yGhd-zC`?LB{9(DO&*#5h}`#Z}rIQP*bke_uOOO|Ni$o02FP;HBbhi1|SGhfCbwCpXY}70PqXf1Sr{7+$gs}C=Wo#<4MPi zA66(EpH;f=2x#b^3Fv&he4eOBJe!jHCj()jj#e7g!!QYId;vC(E)a?OymVu>@9=dB zSjDeL8V7tKr5A&J;8Y$M07C*n+-CrS-~7%0@Vaf=x4&hrUVFn#r*lQURv$5yU8s!x z?AqGu!6%=5eBRf!aN~_PS^(4oGh8DYH34M4-UQI+o_o&TdFP!qL5U^K0awEHNB|Uo z8IObOB%oo5dche9JRXmnn%psaF7bG%3m+KP<8yG_*3VHqt5E@yfzJ-`8=5Vk8T?an z-xN4r7V;8EOB_)GPyiMWr{cpA94&FlD1s8qkNe5kd5xs?YO4x#Kc(*=5`KQmRXmqy5?J7cC-28Kl$^8x?Vfz4?f~tec-}{ z<-_;ifB(VDFTWf>?mYSAlg_WZ2(kb?v;*7?VDz9s8>}y9Q4XBZA4Z!3Czad{gmnP# znP;9!FFK0+@ZkW+{NUns$fcd+>R69}C-AKiK1})C3X(#rJKQJ1YWWeGf|xFOJmUMA z7%*FvQmMBUIHDQ0O_C1=Iu;%@9ws;$^(s7gh#+t{Y~vV~csM9a@rjp>^`H5f_dRgM z?#o}d`-)wzuIq44RaI$SlLw=zy--?SUbZWKeQm8aE6d9V{W)Lp?Bv09ShaWoV z+q$@Y`*!yo-|-#h;fEhKZ+`Qe37(1|1t4+!nrp6cXcIu|k2`>k+h`|11y1+C0}lj1 zf%Af!Vja(b+!5OpczEn^?bM6eQ;@M<DQ z``7Ni`|bcFf)n)8m%bGDQ+sY2I3q+nj$s|g0akKWf|DGa_lW!Daqg4%&V6`302po% zI;;MG$(% z9%~P#z)8Vb0a`9mR<8T{lAaeoRB~7BufTEnA(xg?C$uU{N53~sqkO<^I%DbC7OxQ- z)ZiXQaJUw3LbgrUK+)PGxTvs4UC8iD2iWjXWuuNBJ!&Oq!4f*wU;gF&Z`reV&nG?S zD?W^24{2E00iwr??5+o<2crik017U-=7G58xugf{!L`~Q`t6V0eZX7NcHh2z_LZ-E zr8|4}tbP3P$IZ5F+rqN~Sh2l(_wE3yrKKes0hHQ=4@|d@;+~xK%$YMapCg|io~8fQ zbP3^D6wxIPnDob}JC-bCQ+Q6YtQn1|HlK0YS3xsl z6^2$b_6@R*3p#wO4yYu{&<{EmZeVLBLt??fOrl=LB`qZ^BZmw1969o}cXwvy{?o2q zm+jfL^D>A!vr#I2Vb)%X07P5Un%HiBJZSzfnDqd`^~T{Fyv};V`SVL}{o_CRvv(~n zoP6)k|NPG%GSNDY(j?Qfc_IwIXq@z$t(c98LQOK7tZ*UE(&QBuEoX@>dgYVnTZ2(N z9~u-1P5h#GV}}ks^`oLlLr1zsvYSfat7hMVMb-9$!+KVK) zenctIwz)Y26=cuuD_*yI&y^2&jus>gbY>Ve03k(iTm~^KtYRmvX1s4EUbx(?7M8Z3 zT#~72v8`6)sKoWMXVt4j%M`Uk)Nd;gX?Gjv4h-YG?AsPpli#;8l!SKxdD^`17cmBcS- zMxSVe@t`V7AfOe?IHdoo%=R6#|LXExJ2nA$rG4&s2f#c7Dt=Hw_HGoAz4LeO+-}aF zzwisMdey6b;{zY~z@oRP;T$(`55YC$sfLFE4s*I`gmFk_LXSjkn<3HOZRA!n#c$%2 z&Xp4tN?wMlAgdeJj8o=0*JIeLO+f@3DV`~k*MD!@x6gU- zy!>6Tm|-2$jlX z7pKLp^eLgi$DTg9`j4)Dq1g=jdJwxCp+1uw>=E(Chgn#B&aBn-Vehm&?BCb{zkCEC z#oKTH$>1!9?~ra9>Cl!@7LYVh5H!$+hb{OGO^Xdxa=2K2JVw!*{CLnCs7HX6 zn=PYnEZ~9ot)f@H^VM=1sN_Hi8OAx!<&^KaRoXKni^#!u<|N3YDt-BfEbI&6m-^C{H_cQ0t z=HQDV#lCONZ^zXXH1J%~`S`X4mqe_4#Yb}LwR+wkeZ;T-(Y_mA@>#rZ&k<|W_x1KF z>ElClKO?Ur$|puQQ@RN&a`UuhDZT(F6xK~4S8kh`(&(gtrx^|2@9a#+`k(V6J00_! z@)h0H)mL~u^4(8;?dkt<{_OI<@m%l_j?p-X8QTP;ZM&{e?eY(S2jx#V6+@wD^5U zehG{znoXe%yCJ?YNpd~g5?!!;hjBP$`j(7~=hBJoe8k|byDs1U*YM@y7#NW4a{+5J z=Xr9el&+h*T6j=3EVF9BL-ua z1AeYi{u_aomY3bhQ)gVa+jZV;QhN&)RxF-H?YFV7@vKNi zz;nJWRm5B&=G;Hn&=S+*RK9>lxvvj(vL9zHsZ+Kk!@H$2^~k(e#XF-#hPsokH`6y@ zowA10F4>-{&?sp-hkx{FOM?T1u*{}ex!E*ZSVr zGRHHyTOxLJ7mS`SQL)}kNu-aDA{}y`LFd?Cz+E&4b4ir8p&_z3ayrTNgm##&+vI=+ z&RWnTFAZvjvcg_h4y8(q)C{Q@ou`f-eR7^#lIPd{U3Xa}wWssePMC!@4I> zlxkhBExe|~STjj-n*0@J?P^V_k|(euxJP;D=}uOQ zR4ODbvYTUxmY2K1`8hV}7b!)<27tU#nvAF|vF*{Rs;t>@+4dF?_AAvo7NZ?jC3f;HG6$5dje@nS!Jv~z8tNDRt<}NOJs__` z-4FjDf(yfPWDzvk4p544Sljqwl3$PerAM2x9?^|KoNrxBYSfc@UBXN=Bss#VEx+}W zEBw}7Q^|R$Dr^_=xq*S@pacVK+B^-)mTm#Lf=k_co+1}gFD9Nkj*bAVwCRwp(5tPH zSfIl%WTDc>CxAys^VTRkZIsYs^WQ}VWeJSyR~T|Y4y%XBqZGA*1L};H2A5Oo;o_^^ zu8&A8AELAqhGq!0$w4hstNY0**|?6$$!waGl*A~UvqnYFwq=CllBV)UNbi$bS5>A^ z)rd3cyX;=_|6t_l*LII9Jmk;|_yqMp&Z{NWfPzWc+I6sGf%W^$M7tE|~ z$$_=f5Ktb?Ut>%*{$8d`f|yQ)tQOPO@{P!{iB=-(GdXum>+7t_Oom&QM0OicVRT4W zP$=tg8&yNkqodh1L#f)wSG+uQ%(d0k2jl2mVIST-)9j^cCeo@BcXckoClmQIO8(29 z>fr>8P(bq}MmWN8rq6S{x;EPGt+J&H%j3BrZ0pA4DZBe|uI1KUBKLx|oDla{vYhKR zv8p;|W@aWkDe?%6tYy)Qt?E?BP&S>;jA3_)PNzdLto5r0hi%a7NOQOhyz6SuB7V3C+z|NhQnNg_(Qe_PF zmSzwvY2uqrqhTLYeptRMRj%!bR{z`T7ocRjFvJ^&d9!9YyhpfY{Lgj(NWb3k;1sTq zRIhFJKnwNwTIT^g$@ye2w-{o}IH2T+MXsxTK~984#0fTD(8^&KVDUiYg7f{=|NLJQ zNhTcxzCP>D&S0suXkxDShQh~W#3ySuPN_cE4lr5P6x%*%Phn@vWmY_gT3me2%+1aO zG!6h)An)o3-7O))v7DWqQ4h06r%o@LQzuWo@ms#-n+|~4Ag0d&Jk`(}PDMB}uBV;e znQkCCpKPeq^JHQHC{8ahu}o$SKF#&|FL0RHvyIi~2dB)-4U)`SOr!Ui248%!X=(CP z`k$^pwr$&-*)}(;Yquv(oc6ljLs$LQZ~fL8>|iP##IL8?=3Fa@aaV}vN=hAwdJmx2 z!zgY$hQ;VOq=HFyD|@(aHl>#rf!AxG=`Xq7Kf`Djg>;>%+Iw}XnC>LWHnV$;gjL@| zlnaqv5%x78NRUExT-9o7E>c`AVHJ zC0$ZDdHc_7)@fYO zEoY38V*tg=G;;`Afny6#QH;|PTrJS|X#ET#u=7!Wx#*MoYq8ITpX1Ms@r&owVp;yx zV(EWtz5Q$4A4OTe&2`q^LH9Q! zAgs2$S|0%LL?7+U($)3!t4@7@cr3g58B=ITJkjt(&VdFJ;kER+4+7v=SuLd(a|vX# zY(&JCX#4hUW^QgW!^!nISMO25mpAKufOE66DY9YW`&?aJvup7Kz&I^Zedt-d{V9i8 zeHhoJd+sp38ZoOS&Ai0OM*La9{W2<9yH(+4GMTSNtjrQhq4VMA_qB3RI4DP_A+Ndr ziH}8A{frq8P;SU?Tw3uTW0Nbd``Zdc!^8D^iHT#@f+GU(NX6Q$f7TX2g6VPIjH#FXo@in$!>J6=^1xO7hsLq*5Wv)9jDY&u2wa z;YOKDBvnlt&@ygVIBy7P0P<^-%W#;M%*HNd-U_}&*xc5k4_pM@w!EIBO4ai<+**V(4-nnmP%zN zO6&dXm2%#zEBzb23RC8a>j7k|vR^2b-*&uGG;Wf2sqsxVMw7^Ej>lwLRovgOI8Dy& zvIs|arRxjUhvPgUA(BO%5C7DN1z8+dF|;BFOxCW=^Sx4IWCx;nu{7lposENHyX&X% z#cO_Q;e6M+F}Nzz-kSA-GLuibL}nD&4E;TBn7CUwt}z(%_Zsh2a3Hx~ckW3|LRf8e zwfi83*`>h|r{hXhifOm9DQbn8n}FZY`J5|G@R9UAR2ao?I00bfkQr(&ha#=p^{@f# z4XiW$Y+q5@z{S>AgEa*oc#AF>4`z;VbzG6q`JCEsq#ownz;RogcP^XmGA2cQI3$or z=W^8jojNy3PFmwF+%`~3ED!)pk|xfBYlStF#4h7|gVL!$$ZA<$8gA{n^pNGvD4yV) zP^hFZoJ2Q9&5OkAb)_=vtl78QTcTxIu4KHEO`$}#y=P?u0Bz!gec)ILvIfBV_f+gU znK%~+z16<_<^MNNV*~qQfFWyXDWaitPFplQgmt8U*)cgLha9T~ze$YM(l&;OJm%d4 zz2A^=S~imgj}g;rTWV+ctrdT(V!65+e{y|w@cvYncwW7+S{9tQro(tGrLkIEZ~T>7 zj?EI+xufR#SHE`r4Bjn%{(aBlUGv>@tQOY;S!IL(a0*MNg>>(=9#4tx78TjZMl6UK zEfX25WfWT@lOmbe={J$OayfK1nYlaKmHghdo9d=jWw_V%k4od+DyFCvMBN_K-bTJ# z;qQy>X!ay?eJ@A2Ji}@{hg~J;W~0kZj>#uDtsBI3NvYp1+wFvm;cV6nvF-1V$IPKJ zXn1V!t+qeietU8)#}>}*H(fQy#yF;P;Bb>x8X+;0T~C(D+o(0O43uIem1_aE zzAoOGNS}|_@1@j>G<$2yU1u%w0ex9?5D#+;%XxoAZ^keruIwyM&_y)6K>%#z^O-&X z)2)g*Tdf=jJoecQ*{vJN=W_+tCw+}+oH_Z-nYVq@H(mQF>U=SOFB}*BG}<)Rfez-- zE~^IYbIRN%=}G?35PG~PPQzZl6h$SgQCW_S6W!q9FkEYF*i7v9nlW0TKA7AfPi2IK zZf)PlYWKzGlkag#1X;%Q!>HN*6(1Ho@55?Xr<;WoJBugZo}3;-$agnP=SvErZnRUG zF64SDhtI~;YO|4K(x!N_jboZyIBlHfhx_~0zMi$1pH?QDS(B^C(omtGsz z>26`?ArR1yv05-r%P=Q1g4k{#+bE$XKR%4>40u1HfZEqWgGF)#LlKaZ2jI+1r>IX3 zB7P9c(9r5tP(5lr4}eFRO;4|J@%48 ztUHALa%>h9qsUEHi|+?Oq+MVNrcsGzoa(<3D|DivTn}PbO!k*XCLJ^x%+Rcs#7ffb znB0oc=HBSk)~NM@au|OexdvCNrOZy5U)br4dbK9tvKF|;I4+s^#WD;6*u?Vde*J|tbX(y$!9K{U)7TqkX` zw#f+JJ`i{8*luPVG9b=m^Kc;#qU-=!rM}^iSV*fSeB`tX<75 zq{GlC+_XNpY}h)i{cK(=0U7BHT!etlA!jocbBF9zf@2_&64~ z1e#T8RAQL4wgI9H#%1}^mmZ#voG%0u2)t-yr2I~{%k<4NC#0nt#QB)jVpL(uKC35p z)=>{MaNSuglUB+kX(iny!_16IB>;|J%Wwb=1Gjb;IoEQwx`4348-Bi$-pA!icWvSB zyYF5o4FDCBNb?rhES1VS5#Jrk`9x!_)crs*J9WPpnUrM!yrre3cDY^+>tD2)2oz*( znM?K#j$Vye%AY(oE)C<7*4T!>F;8~r{e;qGC0CQt4(;dDhD^7M81QNct4TwWL*U9O z5VXXku`#M~lv%r0#RQGg{$&Ruq*HOcmYZ(6sr3R#(_UIyZaJEdv}89ZE;mNak02z` z*ggkw>#)3C+lE#9TDCDJi><6O!=&$1ye0>++8ZXL<1Lh!q-+%jlm@20vRy@3ErO5E zWey62eRQw%uJ7nzb|%NlXtCW`2@Q|fuJSo-fK02x*MSt9kN(c@7S9PoxbE0qJmv<3 z)h;!1tte9Evcs;mj4hRraB$82joJb;cd@?S`-e~Ug8$ef!a{GhojbNC-Zf^uq#_u^q3W&g?TZIY6si}FQ!tk$E>Hse9?#6X2LrN7>YW#0zqbXI5lqC23 zBW5O*r|VLwU;|RDQhHS>)oPS9E5CjI!je1o^fO@!tW&2K+-dyIEV{Gj&WF@0nO3FJ zsM0!8vi{*8zWkm3{m#Z87*v|_jHz|Rg%h}Ot}%b#Ku*#aE<=c38yiJmPWXY#$=>Sz z>!_}}>Z*x!9KSSq-e4l5&SJ2=J*FRrHH|o}ZRnj%{gGOTD%K-c*mi7-%^Fw5>v4!& z*GwMfB|`$~U3dL5Q>k2>);0|QE_wI&XSCK-$?aV2zW$8-l+ zrw0Q%pUUA&eKwrZg`GG9!?lfvCYMWv7t+&G~l2spk2~w6>g@F7{P_lMSU(d_qEwODP znKbzT!IE#h@y2xl&ut)P`}Ic3W0BTe0cb>8$xz8)EkrN=lsN2PB5sGU8nTyH*ABk+ zwXb#e-g|Fgo^gW5S`UpUuc3iADiD*{H6{&>mdxG#{gLP!z0-}*I==9QFHAY#CXm(< zrA}$(&-S^hjiZkC&hL%6$4CeFWtZrSO>eZ+W_fw}0Aspw%663q$m4xqTkP` z9I$AWNKR;*vLcO8${C2@WPaeU4=j(9&*ui@@J(ra!t=!7klwO27z%?12H&kPG_v!g zkN4!s1@q-EAG+~pfA;pn?5nG@m$6jCV(5BC7Qw|43nVLcJx5|FBSs$&+Z+shl##0R zgPPK0$EX?MOjfIbVpTAD|~WHE(pEV5LSb+!5mF?5R=nffkR2ha%6MT zZ8P%A9W?P@AUR4^jO`i8`5t@hu@q(-nb^!JZ32}6$6jkjxI&~DW^XlcJs6RAuN)MJ zY4acvPD}1MC(`c5;(S@N`wDGVNt{S(bWQymM(`+F(!-SW|DGLgQHS~ov0uz_xC1qOWY5K7~uft!|%+QGvlGhmE7}F zniR=*s9hkkoOHP$8DaUt^1&ycd@@Yrh)i`#G|Bl2=h|^WN2*#xt_-UsHY-!App1g^ z;RiioBQ&*iCrh>;A`L1PlS?^zl{gkw@xv6V$B%z)9-fOgzxmDKfaHFl{rRLWX_d^$ z4TP_ms{b_i;HE*8??XAhLOiOonJ09J<4J9J6;ymk8<6sX$T}bGfS|q}^j&7Pwj9 zPK%r`Boxr#K3O+UB6jbmt}YsboEV-ljJ!`X_@ z2!;oY4tm1D{YDugO{NH${DGJ$ZJY)Tk*41<2_pCD6Q>^h^$*>33sfiu4&X|oKUWwW zI_#Qk0Am^*lZMhv+X1psgj3=d9SP&{<#il3gLn0|a$iAC!K2qdDPZ-tOodRtu zsF}N`0q2B2cWDW;A*~$-1EH161Yu^b)8nCZNF#8vE`uZM!=Wu0)0gRq=;y;az7Uw_ zW<+w+RH`i@Hz2cExLg8tePrYO(n^@#3LwKfg}xV=j^R8T+RA0sW}W&TC^?x0g0qZS z*Mb=K*+rvAPb^SvoN~fVpyq5pG6EsF6$oLqfB4cP!Oh~G%V8gTsbL+!gVf_MuXel+ zLz-r^rAu)u8!N3{ie0QD1_)o@;^JcUpRKpdrmjziL-I&KL;+}z+ zXmF&10H9_<(iJDR*YzqJ6aTSJaTDPaZKp{VFz)b#f`K8usA;;fs(NuF&^}`TB}XZ^{WbjR-dO;V4O+-azAP zA#<71tJE0`DwpJ>lIv}h1E#sxWF?U=XI=23*ya2ip(SWEe0;+q9B8+`e>>%Tn?`tN za>8dl(>Q2#bv1yGeRSpd(DP*SsB*WY{Jo7@yp^cLYDY7O!y-u0i=Z>zETb44Q+@B^ zkW{I36l=xnd$qBLIgv9bbB^65N#Kq zWp&%OZBukzLZtn0E+4`yaINK)uIVl>&m*dVcL*yNsZ=yH#M~-L=Zn%&t{W{i$Dv9# zFmgLfUkBQ&Eb=Q4AnyZn`O$;?mlcQzVT_Q)6Ru zNjreG&kz1Rq*1|8g!BUNIP?k1#4eJlE|8Rp8?kUDRYDmpqL>#4*YjUViucJ*CWEFz zm>L^fPtu_rx1}c|WU{#0&2tt}5u>MC#aO-Wgp_5-Y?P$f)dAy_8Xc#*r|7LX9TNRR z{55_pf@%gyFnmYh2v4z1Lvz1*K4>|Hp&4j+dh^@SeK&` z(E@_21-?G?@r09dtPVs|>}@jjUxn;Ql#Yh5+KNB8dWdco?5FQGhEN+>N)a1!^xBR4 z`AQYZkj(x#0CePj46lXGL;foX=Z})rGNr90s|NeTGJ-LTz5LH^yDcP;f`Q0BIC{DR z`gyJB^``Ry)=P3^(nhWp_mTTyY(5wrCW>TmJoMohXSj?hN;jMG`F5q7r8n=I#e^}R z1H(Xc3dy4oy)lQcQJaWxBp};731!^?lp_{|3uxyg{e0-T#;g{wXj(>~w(#22*0>nd zGzcU>R#sO0JFX979X>u9j*w__vKOY$TifVL+o*HBRLRPu2iurD{qDZ|?sNDtu>c*4 z*@38C=bNH$tI68RIW<0?oM{prhE~_=gYZy@(Fp=EfB>(C^v_TlM#;$d?&QQS-7VTo zCt*-<$@$pF6a6>L$TStYTS+d@!3$tnUhdkJZub#*D0F{oJuZvjdL)^0HyN=TYAtu2 zOtD=U9AwLMGK2Fy@x&AL=&{`?C){k(PGx-zQ<^??=n2lPmicQ%kF~Uq+*2?m?ss;B zoKIRqDQ&^!<60otT!9tC*dS~6Mn(WG^oFx%&)QG?!5=T_;WA1NW;=~;Y#MR6j4LkR zk#&ES&;01IlM6regWq>G)?sj5bImmv_zA|O_3t;mFt6hWcZ+Kdozm!tv|f@TlWA31 zC)~@tmONSze4o3hG4Fng&R|B2zsi&T*$~T@b zr?gd+kFV%NCNpyQR+hR4_U+pj#@C^x%QTk`NC9w|C3y~XLEk*arB*kx*SfE%f{Y5Ec_;*$_3yE3i(T!%K%caCf zWY~3L0Bj45*(mP=cLTTM$fO*3{{8QNf13WPjq~+5XREhe{ia#ZlcBz2S?cmD%U$%< zJqX~z$A=}emtjDX^Fg86IuxTHVi+STT7|Mq_$WG8e!f5iBSFUo;j4&Va5D~}x^)>EN$1cLkC-W^9Fta7Ru_KtSATT@epwhC*atTY zLTePY`}1k+^{7;K($AY&EtykUTrdC-;FF!k@k1B}UkzL?W<;`Cmc%IBuu1v>0$N)v*2eZ<8fO*MYazZZY( zAVw2|amZ9E*$q~V%@URocuChI=bNat>+;@ek`f@vju~DP^RF2s7=#<_*7u*kuw=$1 zf>8dG?H<9p=Xx@2Dlrnyx53d0S^@+UeLy<4t3z#>E=baWXPE3C_`tt>YU#qc-#B?{ z!At^xgGd9j&nd?TrGA>vM=&C?@!Z*SX4lTk!nQWj_Pdsxbe2H5{eNGu4 z{D@XZpT(P29r02IAwadbc-EXb{jAx$=L*;9R9OlX)-edA*Y`p|5dZ!AzyEvt zvX{Ng!PNH(u)X1i8-mGy?X}m2%KzqX{>EN&%{5^i`DaW6I(qbIu%?e4JC-%3+wE4q z-ukOw{i?nC>Z{H1v6swyJycHd;0Y0 z)Q&&>(?5Ut3tq72+MTV3O+}JJR`592V>?n= z*YEV>Tt3)O(#_TJ{tFUm^C_m=UByH%pOeo8*(}oVz|a{GZejOBml^v6<{S{1OrAqKw$5T`FeoWJ9qA^KmF-XTjY{~4jnpVZoc{E+Jg!S zspcgwd5N2wo2!}l=t1YO4nTT9I6ZltuX~Nx0>EZxXVaIAx+2gVfcfGVzZgpg-~pt( zXY9wh*pF?jV~O+pu}~kD?|IMdU;L3Dx%K{^yzR&T{afF1>#euG>5bq1@&EFB*M9lX z;ak6U?D#JqJ$B+A|NGprW6vy}KD}rbpFN8SR)Sd6VJ`V-IdpC5SqrdQaqr>P#BHnV z;(AmSLNo#+QmxeW{Oz~jzQ*J9UO;uido-dlzT>zrd*+iCzjnmR13RYf$0esgB_Zz1 zBvZ~@2tp?#nE9U5g;5W@o>+N~6>iJ}#bO=Y5P*EmYhGhL7j)o^emiv0BnQQk$2=%3 zKiF!39w#()=HL?6J@`a87bmO`ZcLt_d-8`0!zieLOBXD!3(H1~@1=B*wLS z!3$mhE*ZcAj(N{L_ujmB@1E;+U2(;?cRDk#=v4N)?c28941LUhAc0fP%+9#V=KW%= zNO#u&1W9QiI9!AK$>X3CCr+D#2mjC2KlgJ#x43)v?ix}=PV6U#J1)#19;=(o@EDrp zhy_XfMy0c1^~!)VrpABCvfQR}4K9uuy1@43wgL45of2@W$$G+>YzurlX>OY839{aJ4 zW14GvP}Sgk_(iT5xTvpV&0k~9-%pM606>U+0MEB2aL>iX#rlpr{`Dj8dCyPZ|C4Y3 z@elvlTYvZ+|K!!*`Q3l<7oYscU-`=6TaO(-e&^SY9>3?<(G#CP_VhE0r%o@JXP-M~ z;2&LDTFHRr#P}-Q7F^HBeSB|y>%X@Rqi?0#{iBb6{NoD%9*hj6!g+4TNnRS<&WVvn zOCP}`$rf%zDxOx93)>L63_2U32kMHEZ0b2)c&Q$IRZLo}IBf!e$qX3)@~W$@s=QbZ zU?!(yUFXi7s{l?Y%;=`c{nQ`91p!8^V?WB`e4H0KXxNA2EEBJb^rDK#pnt}XLUO;L zN&s*ux3aQQ`RfH$fSd?m_UCi}Vt~VQ!%FL*IRD6zBNaIqme3`yy!xu^c5K^zv+Y!` zn5jC~&25`|`OHkm%+B=m$gn;;>w1=JT@>G?ZA@)-^3>_W$Dcm>#`nJWy@#+5T<>Ea z``DW84Qo&%Jx*jW^PTE?CHOao^TlPG=yiI@8OX80WJD~HXbMp2IUV8v;x*H-@YTs- zHeUVeSFa&E2K%6&Aae%m2z-CncYRmjlmIUB2R%rG;R1pY;{maX<1c*S3)i4qVjbrL zESFt&nL`wYEWu$3RB%$11IWNlu@6877d>_AR1Kg?9Thrg6#WKm z00#x&$VCBQ=$KdsNb!5uyMAi^)*rm({@1_$dp`U<-~H-$y!N%Pe$8L}_xt|w;X{Yt z^z@07cRu~}iT`};>64%Hzr|-xp0?nU=fKUp1zR#!NQmX0KC`%R{M5qRKm6ejALcX1 zJAsD+h9dJa5i*UcR61YO>0E#C(24t-GFOYXu-Fino8Y|haGZ^1=OXA3Wan{aN<=|8 zj&sljA&RLR%K5&K;)Ab~0~TUm9P>G>BONIAHMNW>b7)tNxZSo7qn047uf=(DUFUJ0&v`D{=|G1JFQfMF1);PH z7nUD9cJ#=5Kk|`}9FF6$B;asHNxD~>tDy-+__6xiCzI<;=)7lW^e9n7(f z&<$=LV2qhC;l&Yn04mlANIVn(7LM!qg{I*gs7s=A^8*h&P;rzjTG+_6Mvfus!Zzmu zMj7}X0V+M9ksMc$;N-Axas-S4!hT<8I*$5&`?r7RduO+A-#ycr-Ho)ChaP(5Q@{3WzqE*Y zpkwq;grb{{{$^mfTCgid#1N~E~0n|SwNI|HFGpI|B3qS*SIENGE zk=t^}5P(wx8la_m0HX@)wA!&x0u0*`sKEzH@}Psb2d9N9V0fM=@4SJQxH&!y=IfCF zHpvj;(#4l9C7A?a=Ih-I&R1zsJ4nV$j%f3~zCqk#d=K`1q7R9{L%GWz`~0J2mvZzM@nNcb{Q4*01i;oX)Fh4r|%VEP)vEivG?%I6!4ORS-fXUf2i3cswB`# zoKH4DnDZ&_XM}}>MgvF`#azZj1iDXBVnXZ_;s{J;%MiR+2N`yNYy*JaSPI*?77Z*pYbVE10S5zz1jw-MxtpQUg(c3zkQZ2w{=2Y^ zkBS4fqn)^~C}zX`kvVX-7x@Vp{?)F4K6x{(<5FCGIKwQAxDnd>Iy^Ylx{q z0(jwE9G7)~$oXI~3+vs+&QcZXAUNZPl=NA05&%GUzNSS9V4>{*5wbFbM# zCWR8GPK0l)iQtsFpUeA$gcmO?r;KB|ehkq`P-15sGsNh1NsKX*lk$=>|4?vDE9#M5 z0)v|-Hd=B=6FbUV_F3k*b+iUiC)+JRo49OrGliYPy}|y_DUF@nlsYAk;e2w?2p9{a z2Z|HnP5|G^iIL^G06KI{fJ^#A z<%c9gT-1TFF7-2()q1LIR2=Zf$vR}6Qm-Ze#q)B*^nSBhBwZ}r*82*4xlMU7pTfYC~1HuD({W45smFJ6E-_DqRofn;3wP>pW&e-4%b_7bn$AKhv9P z3c78Fbz^+vnm}I z<%V)NGeoovt4njXSYJ_x8=}XK%$4;s-z?gCWIxZT@KW?V#f?-XaV)duB`M238y(7+ zER~(d=@GC-xVc1|!U?ADLP@%{x~|jh+*IpUUfWD*qNG8nwi}@1{&;TNc?4IMW^Y9# zr!Cs#+;AMV0g(I5Cee(U(nLvey%KVPMW*OVGZx^prwfgF}}M_)$E)e-c?47?_rNx;TbZFut90Ht>moKQ~%lyf13E{aKvGpx7ed z#G%-d(QFW6ekE;1-HO|H&%3ZP?Q8lUC+*=R`sm_4`4xPNEdF}rUXa*-L2mEHy( zwk=R%Oi^j*VVN+I!AQu#jp>93gCwVdGBJWzgaiui?485N{mzuv;?C*Hrjn|~L6!#( zRr?;VvRv+QLi0hukM38dTbaD4PVjCJt(&}e+3yW(Gqn`k8T@~&bn2hRx395E^$f3$ z>K|*J28RC)wnEQ1JUHtE|9_Zh^}&!cnDxmY=~*h_48bgG?Ed%{u}su*c=$gdPeGGO zy=!n~Y%XSPSH?`^!kRzKo- zq`+~R<95@0(`!4P^HdmZYhO4oQJ&XZk?p_yZA13t`_;+2U&q${Y27MzfBG?diQpa2 zc{)DdP`mu9@DFB{oCW-En8#%LGXOj_l16nHZgo(8<=7iu2r5G7_M=K)kOB~ z>a%*YwODfWjdWQC@ZM6{yj=I7|Zl z-aQ6|N~Kb%JR9_5=y2-L{m_l^DwRs5^2B+Ev_tp97L`h+QhBnFlMao{Z!wI{4Zf9@pO63U>a_V~wYwc66#^cqwS1OfCVg7-;`dQ>Wv$_j9fU1J!jhv>b(?*CtKzMLXKVQ`#pCdb@TkBZ3rI5Vxe z98iuPL*D1sSEW*^%z~CZrpq8Ss@6E)4CT;-mQvr%O7Q;&9<`gG!}R$>eq7+?&b&4}tS;sYM|T${jIA}KV3H8>;J%$#`aC;!r*@Amu>JliNcYOCq z&&FOF{xz6W{|cw|xaKufcskci;WRI6Kj_jeer;2u;vV`mVrh!&SP%Jm^AkjY>Kz z+G4)3xPJ%LHVMP=b%o&%Z1!x5m6qY;L(7IURi}bjb8ITgVJs3*s!nU!Dk!LJZFHT6*T-!&SJ#d@Q3| zvgEWw8DpJewB(RVH5Lj@A}zf@)@RS?G65MQklA8>qm`tQ3UnP5cofQX#8P{);M-5m zNIg{U4U>n>0{yWd@jD7->snIQKhXhUE6kuqSv1a#T?OJZuU8l+Ju>u4nQVi{RoApHiHFSDd0 zEio$!rJHo_Do|i6%wUJ|Tm|y;8DYm}1Nm99nUaF5XoY2P&M|fo4dlkqjX~;&B}Ut2 zq@NpfAU%!wjoW9>=rREr1HO)zl(|$VnQ8|+p$;lbGX`n7Vs>f;X_Y9qj-+n{vR}r! zxgFzM$o8um#Muh-?dqUI-o8roI`6#5vGv^dfl5$V2Zi$sy^F-%d+{vRfvaSNWpKT^ ziO6+=ywTd8-{9zXBamHcv}7k1r}aZ=?`Nj1F+aaPd*s)-fxMwoUYwJlzjM~z??!p2 zqZ7)SaFIp%57`SK+ec|4=~~G09V+)7eR+*}jwQsN(Pc0%&oNoT3guIEC%Ka!?jrI0N?)VXS!x&@d*nAbZWJQfbd}td z6RLLuzD_iFI49+IXqt)NK+Ycdjn05Cw?ppyQg+(INkuZDz=X;A|$;saWu3mZUGK zJKxbMCVmGQl=g=)pS!V4Zbr7rOjBYfgcj&I8}u2-8sfAvFZoaqaO%8bjaGwikW1kz zS78}@Hg-$xxr<)#%Z4VNId2Jj>UUP zXy$wm`Kt)-nDf*yLTmIXeua!4gA-~a;Q`N!7QFp&=YI!J&z%1*aP0d;{CniJoBPB$ zh5Y5vR+v7;<7~oD`#~T>&T)%!`-VR-=gH=K$l$*3e9{(Qta-YWk?~y;i;M(UW$l>ad%BwKe zAvt!+?9VtlMmkA%zr6JX+cDm|i6ZLZrmy5Ji5m4!FVN2jI}86kCm-=VdBdFVz2Dz6 z@mu6U9YM+%)#QJ!QTO<^UhwrCP=fP2lua+kH%MkFOYjG$DK=xco*Z)yo*Z%uz9Ul1 z`5tl}#`r1`XEVn6b18 z;d=NUdE`1)F8;LRQB2$(m8VAOcKX!P<7lzWH&FXD7&^ZWvX{4|=#htb`RUa}z#pMo zgq=H0nWw$5LitSxh0_Y_5uU13{;YTGEuN=SQQ!^XAs|zdI>LV0JT*uAHLxf*@G}@3 z{1%r%+&*7T{%;?{f4%b-=bNMtfp}{hOvqVNzN~kQE?A4_iDu5bHE{n}r6Q%;%Yeo3 zWwsV&uy|tMDE2?JK}$0JM&usno1{I~MG4ODy<_CmEuJsjT}Gje7V*?fh+@wFfpWSk zmxr^L9%TncJ)SP)&uD+pEwB85WzW7?9M|5Z?<|*gpo2ahpvFdE{)~-h)q@?BZ*T5>-ZAuFNk9iDQ3@Zwr6#PUE<7>b_Ad zh5S-G`Q3xx?Bv>!A3sIXu@m+&{ClEE#S}!&FGYF3`^5Pc&)cb!^W*MB=y5(nA;>6F zBYo~ZT0b9}iIY2PBl~F~gJz50Mb7<(ysvcS3^WwJ9k@Fy6e=ywZB}C#)pN6I?fs_q zq7w0QIt?v|^Z)kwIuYrCIoIQuX(}*1{q*}puAhV$&Y4UbBK4BjlixjF?%JTcWmGZo z+Q@OPw|65C$*AC35NE3AVa%6CT4xI$h4gJ`^q|w!vG+*h?5btrZSd_mGg>ZCk#lrB zcNF<8(Bk+|6nDF%!qGmdu2b!b{N^oWaGlD@efF<0AG+D!Es0P=3T3dz`CT*)g=J3d zxuYTb3|)`-E`AICK@Dyh&B1N{v^eiz$#6B&X_G_lk%lwc*845#=(pf)=L5byTBPfn z&Pg3RIW4-z4`XmkgFTKN|5F*1QC<~>w(=d0ZRTnW} zmWgj6hf7;~@wqprTJR|F_Ttkp@g?tz;dC63G4tHxv~h-TJ&wdtxe@&hc*COfEaD^4 z4tWir6o(53N!cU~mBKb6`(7a1CDP{_jFUHkw6~Di!rXM7{CgbVWxj*_BL)Y&JjYI0 z$lGfO1-{MiW~6H&r(<+!Fa9l-m6`07v$-Z9rv>R!Sxi7yLFUwV$l%Tsz7ohN45KTJ z@P+>zDU_QgDPcNujbSN=3x?Piqe57rPI71s2195dcW@?=wnE<5n3}O{OViduc}b(n zP2V8Df#>FbS3pNBAJV}TUnve33UlfuXL%6O&!h92&(XlI_qgf!khRs+;&O%Pd=+Xh1wd~Z{QVfOlJ|7vJWxPscruBZ` zAdd$OPj~$sIZwxbME>TApO1UIEauh=ZT|Eqi+_)A3~I?Y`5d z#X9d)lG@DIfb8@m%F|}XEZn;MQG%sFs#`(Gj+Jz*LGfhF8#re z!-|3GMq?QYVYCY}kT$;mX}(Tt8=0UeTjlpMuUdMTT+ zjJ$=Mj?twfa+0<3wQO~RawB((1!$xTL{6lcgdOJJ7reo7?bn44>59;}EQb{Wl~bcE zc0qn<&2GtvOJkYwlEcmIP;Qa8Avzu97$&X>q{qoL;L(hZT>%}Ed=LuDu9?(kEXp}6 zF29H_<%EdswY2?00uQ4Bmp}};CG@3vfhRK^jxNKZqa%e`!u7D0nKBmxqRnBNO*Jdor zwds!0r3E?^^6d10fj!NUV&uO}@ePq?O)Ui7hju-q5&U-EG{kBLu_mESc7Qz+okMVem`T>VZrBb;l z7U3zSKUKTJ`9^5&RIE~|R4Nz3BD^kTFpTJL5nflas8lMI%9F)Hz8OK`sowWmsZ=VJ z2^##4Z->j@vRJ89DwPE&47c?7_ZZV}i~4chN~KaMPVQYXOVAh`eZBRpQmIr{GZx^prwfgF}}M_)$E)e-c?47?>hGT^vIy7~kIA8+h13;OIwo69!os*#IU* z$r2__!6^>x7Z{!0)K)N98OYwy6ui^t({TK-;?F1LyX*GP?EN9}`rkC2vlS{1E-p*@ z4%?Vl?y}iz6W@C_d0tC{&@b2g+=JK8+MMTP+Uc@CP)^J~rbYTk)QQ}m(SJ~7LX7MA#KX}v?Dr=*Qf7kB;Jm2mrz`-_0Mnq!ClbL>~2VppSoK=fZh zNY%%j|B*4*1^2LTa4nTRSk3U*%Bh9nSZ<33W6x=hiA)mZf{R!U)+xF0B;0Z7kUFrV zL%^~j)6VG&!?Kqgy9ExINGFCf%~&WXwCzB3gXZ$X4%HItwwy@*m+pJU{GihLixcbv z8h)|m{6CaNdvI%=*pvf*FWq<h)PbYyBc~d4)%j7p|cJiBN2t?Ai>(!M}Dm;Xj-{2LzM;ZC{A%%=BGP3V!$ zna#&~_T_$LJhpM~1LO0OM`E5=vK`c|*&DokM)ZW(M00-k&ri3RD=z#m@M%lKY@c?o z?W@+;cAsqd_vgRNU(v!T+?)EJ-Y~r&JLj%kq>Ia~FT9Z&XI`EDmShi1bPS%ZelF{r G5}E)N*(c8c literal 0 HcmV?d00001 diff --git a/packages/email/tailwind.config.js b/packages/email/tailwind.config.js new file mode 100644 index 000000000..81816bdfb --- /dev/null +++ b/packages/email/tailwind.config.js @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const baseConfig = require('@documenso/tailwind-config'); +const path = require('path'); + +module.exports = { + ...baseConfig, + content: [ + `templates/**/*.{ts,tsx}`, + `${path.join(require.resolve('@documenso/ui'), '..')}/**/*.{ts,tsx}`, + ], +}; diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx new file mode 100644 index 000000000..d49d0831e --- /dev/null +++ b/packages/email/templates/document-completed.tsx @@ -0,0 +1,129 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentCompletedEmailTemplateProps { + downloadLink?: string; + reviewLink?: string; + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentCompletedEmailTemplate = ({ + downloadLink = 'https://documenso.com', + reviewLink = 'https://documenso.com', + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentCompletedEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Completed + + + + “{documentName}” was signed by all signers + + + + Continue by downloading or reviewing the document. + + + + + + Review + + + + Download + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentCompletedEmailTemplate; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx new file mode 100644 index 000000000..8a24b4f0e --- /dev/null +++ b/packages/email/templates/document-invite.tsx @@ -0,0 +1,127 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentInviteEmailTemplateProps { + inviterName?: string; + inviterEmail?: string; + documentName?: string; + signDocumentLink?: string; + assetBaseUrl?: string; +} + +export const DocumentInviteEmailTemplate = ({ + inviterName = 'Lucas Smith', + inviterEmail = 'lucas@documenso.com', + documentName = 'Open Source Pledge.pdf', + signDocumentLink = 'https://documenso.com', + assetBaseUrl = 'http://localhost:3002', +}: DocumentInviteEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + {inviterName} has invited you to sign "{documentName}" + + + + Continue by signing the document. + + + + + Sign Document + + + + + + + + + + {inviterName}{' '} + + ({inviterEmail}) + + + + + {inviterName} has invited you to sign the document "{documentName}". + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentInviteEmailTemplate; diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx new file mode 100644 index 000000000..6840e6525 --- /dev/null +++ b/packages/email/templates/document-pending.tsx @@ -0,0 +1,104 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentPendingEmailTemplateProps { + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentPendingEmailTemplate = ({ + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentPendingEmailTemplateProps) => { + const previewText = `Pending Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Waiting for others + + + + “{documentName}” has been signed + + + + We're still waiting for other signers to sign this document. + + We'll notify you as soon as it's ready. + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentPendingEmailTemplate; diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 000000000..4aefcb98c --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@documenso/tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} From 60b150cc587df6279f31ffe288baa8e44f051b11 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 15:01:18 +1000 Subject: [PATCH 09/25] fix: add shadow to metric-card --- .../src/components/(dashboard)/metric-card/metric-card.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx index c9c36cc47..9e5b1db0e 100644 --- a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx +++ b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx @@ -13,7 +13,12 @@ export type CardMetricProps = { export const CardMetric = ({ icon: Icon, title, value, className }: CardMetricProps) => { return ( - + {Icon && } From dbcf7771b91d8ed8f4006c0e3ad043ede1c40ff7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 14:23:18 +0000 Subject: [PATCH 10/25] chore: refactor stacked avatars into component --- .../src/app/(dashboard)/dashboard/page.tsx | 82 +++++-------------- .../(dashboard)/avatar/stack-avatars.tsx | 36 ++++++++ .../lib/client-only/recipient-initials.ts | 6 ++ packages/lib/client-only/recipient-type.ts | 8 ++ 4 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx create mode 100644 packages/lib/client-only/recipient-initials.ts create mode 100644 packages/lib/client-only/recipient-type.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index 8526a8c05..cf4848ec9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; @@ -22,68 +24,13 @@ import { } from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; +import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; -const renderStackAvatars = (recipients: Recipient[]) => { - const zIndex = 50; - const itemsToRender = recipients.slice(0, 5); - const remainingItems = recipients.length - itemsToRender.length; - - return itemsToRender.map((recipient: Recipient, index: number) => { - const first = index === 0 ? true : false; - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const lastItemText = - index === itemsToRender.length - 1 && remainingItems > 0 - ? `+${remainingItems + 1}` - : undefined; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ( - - ); - }); -}; - -const renderAvatar = (recipient: Recipient) => { - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ; -}; - export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -156,7 +103,7 @@ export default async function DashboardPage() { - {renderStackAvatars(document.Recipient)} + @@ -168,7 +115,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -185,7 +137,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -202,7 +159,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx new file mode 100644 index 000000000..69c2fae7e --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; + +import { StackAvatar } from '.'; + +export function StackAvatars({ recipients }: { recipients: Recipient[] }) { + const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + return ( + + ); + }); + }; + + return <>{renderStackAvatars(recipients)}>; +} diff --git a/packages/lib/client-only/recipient-initials.ts b/packages/lib/client-only/recipient-initials.ts new file mode 100644 index 000000000..0712ccd7d --- /dev/null +++ b/packages/lib/client-only/recipient-initials.ts @@ -0,0 +1,6 @@ +export const initials = (text: string) => + text + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts new file mode 100644 index 000000000..dbcf5baaf --- /dev/null +++ b/packages/lib/client-only/recipient-type.ts @@ -0,0 +1,8 @@ +import { Recipient } from '@documenso/prisma/client'; + +export const type = (recipient: Recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; From aa884310eb71a2fa6fba4590462858f30249dec7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 15:14:48 +0000 Subject: [PATCH 11/25] feat: add recipients avatars on all tables --- .../src/app/(dashboard)/dashboard/page.tsx | 104 +----------------- .../app/(dashboard)/documents/data-table.tsx | 12 +- .../avatar/{index.tsx => stack-avatar.tsx} | 0 .../avatar/stack-avatars-with-tooltip.tsx | 90 +++++++++++++++ .../(dashboard)/avatar/stack-avatars.tsx | 2 +- .../server-only/document/find-documents.ts | 7 +- packages/lib/types/document-with-recipient.ts | 5 + 7 files changed, 110 insertions(+), 110 deletions(-) rename apps/web/src/components/(dashboard)/avatar/{index.tsx => stack-avatar.tsx} (100%) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx create mode 100644 packages/lib/types/document-with-recipient.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index cf4848ec9..2f5f259ab 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,12 +2,9 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; -import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; -import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -16,15 +13,8 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; -import { StackAvatar } from '~/components/(dashboard)/avatar'; -import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -72,21 +62,6 @@ export default async function DashboardPage() { {results.data.map((document) => { - const waitingRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - - const completedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', - ); - - const uncompletedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - return ( {document.id} @@ -100,82 +75,7 @@ export default async function DashboardPage() { - - - - - - - - {completedRecipients.length > 0 && ( - - Completed - {completedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {waitingRecipients.length > 0 && ( - - Waiting - {waitingRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {uncompletedRecipients.length > 0 && ( - - Uncompleted - {uncompletedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - - - + diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 58b6eb1ac..264b3596e 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,16 +7,17 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { Document } from '@documenso/prisma/client'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; export type DocumentsDataTableProps = { - results: FindResultSet; + results: FindResultSet; }; export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { @@ -49,6 +50,13 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { ), }, + { + header: 'Recipient', + accessorKey: 'recipient', + cell: ({ row }) => { + return ; + }, + }, { header: 'Status', accessorKey: 'status', diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx similarity index 100% rename from apps/web/src/components/(dashboard)/avatar/index.tsx rename to apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx 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 new file mode 100644 index 000000000..8a918fce0 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -0,0 +1,90 @@ +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; + +import { StackAvatar } from './stack-avatar'; +import { StackAvatars } from './stack-avatars'; + +export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[] }) => { + const waitingRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + const completedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + + + + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index 69c2fae7e..c8d63bb82 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -4,7 +4,7 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; import { type } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; -import { StackAvatar } from '.'; +import { StackAvatar } from './stack-avatar'; export function StackAvatars({ recipients }: { recipients: Recipient[] }) { const renderStackAvatars = (recipients: Recipient[]) => { diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 005b6614a..60fe8a5b3 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,6 +1,7 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { @@ -15,10 +16,6 @@ export interface FindDocumentsOptions { }; } -export type DocumentWithReciepient = Document & { - Recipient: Recipient[]; -}; - export const findDocuments = async ({ userId, term, diff --git a/packages/lib/types/document-with-recipient.ts b/packages/lib/types/document-with-recipient.ts new file mode 100644 index 000000000..208fb2b68 --- /dev/null +++ b/packages/lib/types/document-with-recipient.ts @@ -0,0 +1,5 @@ +import { Document, Recipient } from '@documenso/prisma/client'; + +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; From 88d15376e30ad57c5c10f881cd006bb38b4575a1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:38:37 +0000 Subject: [PATCH 12/25] feat: update stack avatar with changes from code review --- .../(dashboard)/avatar/stack-avatar.tsx | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 2a263893a..3737e9ccf 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -9,6 +9,9 @@ export type StackAvatarProps = { export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { let classes = ''; + let zIndexClass = ''; + const firstClass = first ? '' : '-ml-3'; + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -23,12 +26,32 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } + switch (zIndex) { + case '10': + zIndexClass = 'z-10'; + break; + case '20': + zIndexClass = 'z-20'; + break; + case '30': + zIndexClass = 'z-30'; + break; + case '40': + zIndexClass = 'z-40'; + break; + case '50': + zIndexClass = 'z-50'; + break; + default: + break; + } + return ( {fallbackText ?? 'UK'} From b50f64d4ad2777e4fef0c035228142f3ee388a52 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:49:34 +0000 Subject: [PATCH 13/25] fix: update types from code review --- .../app/(dashboard)/documents/data-table.tsx | 2 +- .../avatar/stack-avatars-with-tooltip.tsx | 8 ++++---- .../(dashboard)/avatar/stack-avatars.tsx | 4 ++-- packages/lib/client-only/recipient-type.ts | 17 +++++++++++------ .../lib/server-only/document/find-documents.ts | 2 +- .../types/document-with-recipient.ts | 0 6 files changed, 19 insertions(+), 14 deletions(-) rename packages/{lib => prisma}/types/document-with-recipient.ts (100%) diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 264b3596e..35fdfb4b1 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,8 +7,8 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; 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 8a918fce0..dbd1dc712 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 @@ -1,5 +1,5 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { Tooltip, @@ -40,7 +40,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -57,7 +57,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -74,7 +74,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index c8d63bb82..97af9dc9e 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { StackAvatar } from './stack-avatar'; @@ -25,7 +25,7 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) { key={recipient.id} first={first} zIndex={String(zIndex - index * 10)} - type={lastItemText && index === 4 ? 'unsigned' : type(recipient)} + type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)} fallbackText={lastItemText ? lastItemText : initials(recipient.name)} /> ); diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts index dbcf5baaf..8250eb707 100644 --- a/packages/lib/client-only/recipient-type.ts +++ b/packages/lib/client-only/recipient-type.ts @@ -1,8 +1,13 @@ import { Recipient } from '@documenso/prisma/client'; -export const type = (recipient: Recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; +export const getRecipientType = (recipient: Recipient) => { + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED') { + return 'completed'; + } + + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED') { + return 'waiting'; + } + + return 'unsigned'; +}; diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 60fe8a5b3..41e9c858a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,7 +1,7 @@ import { prisma } from '@documenso/prisma'; import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; -import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { diff --git a/packages/lib/types/document-with-recipient.ts b/packages/prisma/types/document-with-recipient.ts similarity index 100% rename from packages/lib/types/document-with-recipient.ts rename to packages/prisma/types/document-with-recipient.ts From a5334ca6e6219386d14f079eb03ff852c63624f1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 5 Jul 2023 20:47:12 +0000 Subject: [PATCH 14/25] refactor: read z-index values from an object --- .../(dashboard)/avatar/stack-avatar.tsx | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 3737e9ccf..e79a2e71b 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -1,5 +1,13 @@ import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; +const ZIndexes: { [key: string]: string } = { + '10': 'z-10', + '20': 'z-20', + '30': 'z-30', + '40': 'z-40', + '50': 'z-50', +}; + export type StackAvatarProps = { first?: boolean; zIndex?: string; @@ -12,6 +20,10 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let zIndexClass = ''; const firstClass = first ? '' : '-ml-3'; + if (zIndex) { + zIndexClass = ZIndexes[zIndex] ?? ''; + } + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -26,26 +38,6 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } - switch (zIndex) { - case '10': - zIndexClass = 'z-10'; - break; - case '20': - zIndexClass = 'z-20'; - break; - case '30': - zIndexClass = 'z-30'; - break; - case '40': - zIndexClass = 'z-40'; - break; - case '50': - zIndexClass = 'z-50'; - break; - default: - break; - } - return ( Date: Wed, 26 Jul 2023 18:52:53 +1000 Subject: [PATCH 15/25] feat: use server-actions for authoring flow This change actually makes the authoring flow work for the most part by tying in emailing and more. We have also done a number of quality of life updates to simplify the codebase overall making it easier to continue work on the refresh. --- .env.example | 43 +- apps/marketing/package.json | 2 +- apps/web/next.config.js | 16 +- apps/web/package.json | 2 +- apps/web/public/static/clock.png | Bin 0 -> 2469 bytes apps/web/public/static/completed.png | Bin 0 -> 1812 bytes apps/web/public/static/document.png | Bin 0 -> 16295 bytes apps/web/public/static/download.png | Bin 0 -> 784 bytes apps/web/public/static/logo.png | Bin 0 -> 4119 bytes apps/web/public/static/review.png | Bin 0 -> 708 bytes .../documents/[id]/edit-document.tsx | 111 ++ .../documents/[id]/loadable-pdf-card.tsx | 2 +- .../(dashboard)/documents/[id]/loading.tsx | 8 +- .../app/(dashboard)/documents/[id]/page.tsx | 17 +- .../(dashboard)/documents/[id]/sent/page.tsx | 18 + apps/web/src/app/layout.tsx | 5 +- .../document-dropzone/document-dropzone.tsx | 14 +- .../(dashboard)/metric-card/metric-card.tsx | 6 +- .../components/formatter/document-status.tsx | 17 +- .../src/components/forms/edit-document.tsx | 251 --- .../forms/edit-document/add-fields.action.ts | 31 + .../forms/edit-document/add-fields.tsx | 616 +++++--- .../forms/edit-document/add-fields.types.ts | 21 + .../forms/edit-document/add-signers.action.ts | 26 + .../forms/edit-document/add-signers.tsx | 170 ++- .../forms/edit-document/add-signers.types.ts | 19 + .../forms/edit-document/add-subject.action.ts | 21 + .../forms/edit-document/add-subject.tsx | 206 ++- .../forms/edit-document/add-subject.types.ts | 10 + .../forms/edit-document/container.tsx | 152 ++ .../forms/edit-document/field-item.tsx | 39 +- .../send-document-action-dialog.tsx | 64 + apps/web/src/components/forms/password.tsx | 2 +- apps/web/src/helpers/getBoundingClientRect.ts | 10 + .../web/src/pages/api/stripe/webhook/index.ts | 8 +- package-lock.json | 1346 +++++++++++++++-- packages/email/index.ts | 2 +- packages/email/mailer.ts | 50 + packages/email/package.json | 16 +- packages/email/render.ts | 1 + packages/email/templates/document-pending.tsx | 1 - packages/email/transports/mailchannels.ts | 154 ++ packages/eslint-config/package.json | 2 +- packages/lib/package.json | 4 +- .../server-only/document/send-document.tsx | 94 ++ .../field/set-fields-for-document.ts | 30 +- .../recipient/set-recipients-for-document.ts | 35 +- packages/tailwind-config/index.cjs | 4 + .../trpc/server/document-router/router.ts | 22 + .../trpc/server/document-router/schema.ts | 6 + packages/tsconfig/base.json | 3 +- packages/tsconfig/process-env.d.ts | 36 + packages/ui/primitives/tooltip.tsx | 20 +- turbo.json | 17 +- 54 files changed, 2891 insertions(+), 859 deletions(-) create mode 100644 apps/web/public/static/clock.png create mode 100644 apps/web/public/static/completed.png create mode 100644 apps/web/public/static/document.png create mode 100644 apps/web/public/static/download.png create mode 100644 apps/web/public/static/logo.png create mode 100644 apps/web/public/static/review.png create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx delete mode 100644 apps/web/src/components/forms/edit-document.tsx create mode 100644 apps/web/src/components/forms/edit-document/add-fields.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-fields.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.types.ts create mode 100644 apps/web/src/components/forms/edit-document/container.tsx create mode 100644 apps/web/src/components/forms/edit-document/send-document-action-dialog.tsx create mode 100644 apps/web/src/helpers/getBoundingClientRect.ts create mode 100644 packages/email/mailer.ts create mode 100644 packages/email/render.ts create mode 100644 packages/email/transports/mailchannels.ts create mode 100644 packages/lib/server-only/document/send-document.tsx create mode 100644 packages/tsconfig/process-env.d.ts diff --git a/.env.example b/.env.example index fea246621..3ce57722b 100644 --- a/.env.example +++ b/.env.example @@ -1,19 +1,56 @@ +# [[AUTH]] NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[APP]] NEXT_PUBLIC_SITE_URL="http://localhost:3000" NEXT_PUBLIC_APP_URL="http://localhost:3000" +# [[DATABASE]] NEXT_PRIVATE_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +# [[SMTP]] +# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels +NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth" +# OPTIONAL: Defines the host to use for sending emails. +NEXT_PRIVATE_SMTP_HOST="127.0.0.1" +# OPTIONAL: Defines the port to use for sending emails. +NEXT_PRIVATE_SMTP_PORT=2500 +# OPTIONAL: Defines the username to use with the SMTP server. +NEXT_PRIVATE_SMTP_USERNAME="documenso" +# OPTIONAL: Defines the password to use with the SMTP server. +NEXT_PRIVATE_SMTP_PASSWORD="password" +# OPTIONAL: Defines the API key user to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY_USER= +# OPTIONAL: Defines the API key to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY= +# OPTIONAL: Defines whether to force the use of TLS. +NEXT_PRIVATE_SMTP_SECURE= +# REQUIRED: Defines the sender name to use for the from address. +NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" +# REQUIRED: Defines the email address to use as the from address. +NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" +# OPTIONAL: The API key to use for the MailChannels proxy endpoint. +NEXT_PRIVATE_MAILCHANNELS_API_KEY= +# OPTIONAL: The endpoint to use for the MailChannels API if using a proxy. +NEXT_PRIVATE_MAILCHANNELS_ENDPOINT= +# OPTIONAL: The domain to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN= +# OPTIONAL: The selector to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR= +# OPTIONAL: The private key to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY= + +# [[STRIPE]] +NEXT_PRIVATE_STRIPE_API_KEY= +NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID= -NEXT_PRIVATE_STRIPE_API_KEY= -NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= - +# [[FEATURES]] NEXT_PUBLIC_SUBSCRIPTIONS_ENABLED=false # This is only required for the marketing site +# [[REDIS]] NEXT_PRIVATE_REDIS_URL= NEXT_PRIVATE_REDIS_TOKEN= diff --git a/apps/marketing/package.json b/apps/marketing/package.json index e34c66b99..523a23a90 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -18,7 +18,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "perfect-freehand": "^1.2.0", diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b57b41780..09760f806 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -7,9 +7,23 @@ const { parsed: env } = require('dotenv').config({ /** @type {import('next').NextConfig} */ const config = { + experimental: { + serverActions: true, + }, reactStrictMode: true, - transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + transpilePackages: [ + '@documenso/lib', + '@documenso/prisma', + '@documenso/trpc', + '@documenso/ui', + '@documenso/email', + ], env, + modularizeImports: { + 'lucide-react': { + transform: 'lucide-react/dist/esm/icons/{{ kebabCase member }}', + }, + }, }; module.exports = config; diff --git a/apps/web/package.json b/apps/web/package.json index d493b92d9..32d0d61b3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,7 +22,7 @@ "lucide-react": "^0.214.0", "micro": "^10.0.1", "nanoid": "^4.0.2", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "next-themes": "^0.2.1", diff --git a/apps/web/public/static/clock.png b/apps/web/public/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=
@@ -128,15 +392,17 @@ export const AddFieldsFormPartial = ({
{'Email'} @@ -147,15 +413,17 @@ export const AddFieldsFormPartial = ({
{'Name'} @@ -166,15 +434,17 @@ export const AddFieldsFormPartial = ({
{'Date'} diff --git a/apps/web/src/components/forms/edit-document/add-signers.tsx b/apps/web/src/components/forms/edit-document/add-signers.tsx index 9292d6e3a..88427eee2 100644 --- a/apps/web/src/components/forms/edit-document/add-signers.tsx +++ b/apps/web/src/components/forms/edit-document/add-signers.tsx @@ -1,8 +1,11 @@ 'use client'; +import React from 'react'; + import { AnimatePresence, motion } from 'framer-motion'; import { Plus, Trash } from 'lucide-react'; -import { Control, Controller, FieldErrors, useFieldArray } from 'react-hook-form'; +import { nanoid } from 'nanoid'; +import { Control, Controller, FieldErrors, UseFormWatch, useFieldArray } from 'react-hook-form'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; @@ -16,6 +19,7 @@ import { TEditDocumentFormSchema } from './types'; export type AddSignersFormProps = { className?: string; control: Control; + watch: UseFormWatch; errors: FieldErrors; isSubmitting: boolean; }; @@ -27,14 +31,49 @@ export const AddSignersFormPartial = ({ isSubmitting, }: AddSignersFormProps) => { const { - append, + append: appendSigner, fields: signers, - remove, + remove: removeSigner, } = useFieldArray({ control, name: 'signers', }); + const { remove: removeField, fields: fields } = useFieldArray({ + name: 'fields', + control, + }); + + const onAddSigner = () => { + appendSigner({ + formId: nanoid(12), + name: '', + email: '', + }); + }; + + const onRemoveSigner = (index: number) => { + const signer = signers[index]; + + removeSigner(index); + + const fieldsToRemove: number[] = []; + + fields.forEach((field, fieldIndex) => { + if (field.signerEmail === signer.email) { + fieldsToRemove.push(fieldIndex); + } + }); + + removeField(fieldsToRemove); + }; + + const onKeyDown = (event: React.KeyboardEvent) => { + if (event.key === 'Enter' && event.target instanceof HTMLInputElement) { + onAddSigner(); + } + }; + return ( Add Signers @@ -45,23 +84,27 @@ export const AddSignersFormPartial = ({ - + - {signers.map((field, index) => ( - + {signers.map((signer, index) => ( + - Email + + Email + * + ( )} @@ -69,17 +112,18 @@ export const AddSignersFormPartial = ({ - Name + Name ( )} @@ -89,9 +133,9 @@ export const AddSignersFormPartial = ({ remove(index)} + className="inline-flex h-10 w-10 items-center justify-center text-slate-500 hover:opacity-80 disabled:cursor-not-allowed disabled:opacity-50" + disabled={isSubmitting || signers.length === 1} + onClick={() => onRemoveSigner(index)} > @@ -106,17 +150,10 @@ export const AddSignersFormPartial = ({ + + - - append({ - email: '', - name: '', - }) - } - > + onAddSigner()}> Add Signer diff --git a/apps/web/src/components/forms/edit-document/add-subject.tsx b/apps/web/src/components/forms/edit-document/add-subject.tsx new file mode 100644 index 000000000..2aedb0127 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/add-subject.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { Control, Controller, FieldErrors, UseFormWatch } from 'react-hook-form'; + +import { cn } from '@documenso/ui/lib/utils'; +import { Input } from '@documenso/ui/primitives/input'; +import { Label } from '@documenso/ui/primitives/label'; +import { Textarea } from '@documenso/ui/primitives/textarea'; + +import { FormErrorMessage } from '~/components/form/form-error-message'; + +import { TEditDocumentFormSchema } from './types'; + +export type AddSubjectFormProps = { + className?: string; + control: Control; + watch: UseFormWatch; + errors: FieldErrors; + isSubmitting: boolean; +}; + +export const AddSubjectFormPartial = ({ + className, + control, + errors, + isSubmitting, +}: AddSubjectFormProps) => { + return ( + + Add Subject + + + Add the subject and message you wish to send to signers. + + + + + + + + Subject (Optional) + + + ( + + )} + /> + + + + + + + Message (Optional) + + + ( + + )} + /> + + + + + + + You can use the following variables in your message: + + + + + + {'{signer.name}'} + {' '} + - The signer's name + + + + {'{signer.email}'} + {' '} + - The signer's email + + + + {'{document.name}'} + {' '} + - The document's name + + + + + + ); +}; diff --git a/apps/web/src/components/forms/edit-document/field-item.tsx b/apps/web/src/components/forms/edit-document/field-item.tsx new file mode 100644 index 000000000..0f6732a34 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/field-item.tsx @@ -0,0 +1,149 @@ +import { useCallback, useEffect, useState } from 'react'; + +import { X } from 'lucide-react'; +import { createPortal } from 'react-dom'; +import { Rnd } from 'react-rnd'; + +import { cn } from '@documenso/ui/lib/utils'; +import { Card, CardContent } from '@documenso/ui/primitives/card'; + +import { PDF_VIEWER_PAGE_SELECTOR } from '~/components/(dashboard)/pdf-viewer/types'; + +import { FRIENDLY_FIELD_TYPE, TEditDocumentFormSchema } from './types'; + +type Field = TEditDocumentFormSchema['fields'][0]; + +export type FieldItemProps = { + field: Field; + passive?: boolean; + disabled?: boolean; + minHeight?: number; + minWidth?: number; + onResize?: (_node: HTMLElement) => void; + onMove?: (_node: HTMLElement) => void; + onRemove?: () => void; +}; + +export const FieldItem = ({ + field, + passive, + disabled, + minHeight, + minWidth, + onResize, + onMove, + onRemove, +}: FieldItemProps) => { + const [active, setActive] = useState(false); + const [coords, setCoords] = useState({ + pageX: 0, + pageY: 0, + pageHeight: 0, + pageWidth: 0, + }); + + const calculateCoords = useCallback(() => { + const $page = document.querySelector( + `${PDF_VIEWER_PAGE_SELECTOR}[data-page-number="${field.pageNumber}"]`, + ); + + if (!$page) { + return; + } + + const { height, width } = $page.getBoundingClientRect(); + + const top = $page.offsetTop; + const left = $page.offsetLeft; + + // X and Y are percentages of the page's height and width + const pageX = (field.pageX / 100) * width + left; + const pageY = (field.pageY / 100) * height + top; + + const pageHeight = (field.pageHeight / 100) * height; + const pageWidth = (field.pageWidth / 100) * width; + + setCoords({ + pageX: pageX, + pageY: pageY, + pageHeight: pageHeight, + pageWidth: pageWidth, + }); + }, [field.pageHeight, field.pageNumber, field.pageWidth, field.pageX, field.pageY]); + + useEffect(() => { + calculateCoords(); + }, [calculateCoords]); + + useEffect(() => { + const onResize = () => { + calculateCoords(); + }; + + window.addEventListener('resize', onResize); + + return () => { + window.removeEventListener('resize', onResize); + }; + }, [calculateCoords]); + + return createPortal( + setActive(true)} + onResizeStart={() => setActive(true)} + onResizeStop={(_e, _d, ref) => { + setActive(false); + onResize?.(ref); + }} + onDragStop={(_e, d) => { + setActive(false); + onMove?.(d.node); + }} + > + {!disabled && ( + onRemove?.()} + > + + + )} + + + + {FRIENDLY_FIELD_TYPE[field.type]} + + + {field.signerEmail} + + + + , + document.body, + ); +}; diff --git a/apps/web/src/components/forms/edit-document/provider.tsx b/apps/web/src/components/forms/edit-document/provider.tsx new file mode 100644 index 000000000..ea5d7cd62 --- /dev/null +++ b/apps/web/src/components/forms/edit-document/provider.tsx @@ -0,0 +1,53 @@ +import React, { createContext, useRef } from 'react'; + +import { OnPDFViewerPageClick } from '~/components/(dashboard)/pdf-viewer/pdf-viewer'; + +type EditFormContextValue = { + firePageClickEvent: OnPDFViewerPageClick; + registerPageClickHandler: (_handler: OnPDFViewerPageClick) => void; + unregisterPageClickHandler: (_handler: OnPDFViewerPageClick) => void; +} | null; + +const EditFormContext = createContext(null); + +export type EditFormProviderProps = { + children: React.ReactNode; +}; + +export const useEditForm = () => { + const context = React.useContext(EditFormContext); + + if (!context) { + throw new Error('useEditForm must be used within a EditFormProvider'); + } + + return context; +}; + +export const EditFormProvider = ({ children }: EditFormProviderProps) => { + const handlers = useRef(new Set()); + + const firePageClickEvent: OnPDFViewerPageClick = (event) => { + handlers.current.forEach((handler) => handler(event)); + }; + + const registerPageClickHandler = (handler: OnPDFViewerPageClick) => { + handlers.current.add(handler); + }; + + const unregisterPageClickHandler = (handler: OnPDFViewerPageClick) => { + handlers.current.delete(handler); + }; + + return ( + + {children} + + ); +}; diff --git a/apps/web/src/components/forms/edit-document/types.ts b/apps/web/src/components/forms/edit-document/types.ts index 7ca551f48..a6b26654a 100644 --- a/apps/web/src/components/forms/edit-document/types.ts +++ b/apps/web/src/components/forms/edit-document/types.ts @@ -1,13 +1,49 @@ import { z } from 'zod'; +import { FieldType } from '@documenso/prisma/client'; + export const ZEditDocumentFormSchema = z.object({ - signers: z.array( + signers: z + .array( + z.object({ + formId: z.string().min(1), + nativeId: z.number().optional(), + email: z.string().min(1).email(), + name: z.string(), + }), + ) + .refine((signers) => { + const emails = signers.map((signer) => signer.email); + return new Set(emails).size === emails.length; + }, 'Signers must have unique emails'), + + fields: z.array( z.object({ - id: z.number().optional(), - email: z.string().min(1).email(), - name: z.string(), + 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), }), ), + + email: z.object({ + subject: z.string(), + message: z.string(), + }), }); export type TEditDocumentFormSchema = z.infer; + +export const FRIENDLY_FIELD_TYPE: Record = { + [FieldType.SIGNATURE]: 'Signature', + [FieldType.FREE_SIGNATURE]: 'Free Signature', + [FieldType.TEXT]: 'Text', + [FieldType.DATE]: 'Date', + [FieldType.EMAIL]: 'Email', + [FieldType.NAME]: 'Name', +}; diff --git a/package-lock.json b/package-lock.json index 06886b87d..bd3775a2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,6 +64,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", @@ -75,6 +76,7 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.8.0", "react-pdf": "^7.1.1", + "react-rnd": "^10.4.1", "typescript": "5.0.4", "zod": "^3.21.4" }, @@ -85,6 +87,23 @@ "@types/react-dom": "18.2.4" } }, + "apps/web/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -4199,6 +4218,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -6606,6 +6630,19 @@ "react": "^18.2.0" } }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-dropzone": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", @@ -6717,6 +6754,37 @@ } } }, + "node_modules/react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "dependencies": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "dependencies": { + "fast-memoize": "^2.5.1" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, "node_modules/react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", @@ -8342,6 +8410,7 @@ "@pdf-lib/fontkit": "^1.1.1", "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "pdf-lib": "^1.17.1", @@ -8351,6 +8420,23 @@ "@types/bcrypt": "^5.0.0" } }, + "packages/lib/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, "packages/prettier-config": { "name": "@documenso/prettier-config", "version": "0.0.0", @@ -8390,6 +8476,8 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", @@ -8842,10 +8930,18 @@ "@types/bcrypt": "^5.0.0", "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "pdf-lib": "^1.17.1", "stripe": "^12.7.0" + }, + "dependencies": { + "nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" + } } }, "@documenso/marketing": { @@ -8903,6 +8999,8 @@ "@documenso/trpc": { "version": "file:packages/trpc", "requires": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", @@ -8978,6 +9076,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", @@ -8989,8 +9088,16 @@ "react-hook-form": "^7.43.9", "react-icons": "^4.8.0", "react-pdf": "^7.1.1", + "react-rnd": "^10.4.1", "typescript": "5.0.4", "zod": "^3.21.4" + }, + "dependencies": { + "nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==" + } } }, "@emotion/is-prop-valid": { @@ -11693,6 +11800,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -13236,6 +13348,15 @@ "scheduler": "^0.23.0" } }, + "react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "requires": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + } + }, "react-dropzone": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", @@ -13299,6 +13420,31 @@ "tslib": "^2.0.0" } }, + "react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "requires": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "dependencies": { + "re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "requires": { + "fast-memoize": "^2.5.1" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, "react-ssr-prepass": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/react-ssr-prepass/-/react-ssr-prepass-1.5.0.tgz", diff --git a/packages/lib/next-auth/auth-options.ts b/packages/lib/next-auth/auth-options.ts index 4d3c9fa4d..531ef30f3 100644 --- a/packages/lib/next-auth/auth-options.ts +++ b/packages/lib/next-auth/auth-options.ts @@ -30,7 +30,6 @@ export const NEXT_AUTH_OPTIONS: AuthOptions = { const user = await getUserByEmail({ email }).catch(() => null); if (!user || !user.password) { - console.log('no user'); return null; } diff --git a/packages/lib/package.json b/packages/lib/package.json index 202a37fe0..7e1ffc9db 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -19,6 +19,7 @@ "@upstash/redis": "^1.20.6", "bcrypt": "^5.1.0", "pdf-lib": "^1.17.1", + "nanoid": "^4.0.2", "next": "13.4.1", "next-auth": "^4.22.1", "stripe": "^12.7.0" diff --git a/packages/lib/server-only/field/get-fields-for-document.ts b/packages/lib/server-only/field/get-fields-for-document.ts new file mode 100644 index 000000000..1ced3dd12 --- /dev/null +++ b/packages/lib/server-only/field/get-fields-for-document.ts @@ -0,0 +1,19 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetFieldsForDocumentOptions { + documentId: number; + userId: number; +} + +export const getFieldsForDocument = async ({ documentId, userId }: GetFieldsForDocumentOptions) => { + const fields = await prisma.field.findMany({ + where: { + documentId, + Document: { + userId, + }, + }, + }); + + return fields; +}; diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts new file mode 100644 index 000000000..7c2d3d068 --- /dev/null +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -0,0 +1,127 @@ +import { prisma } from '@documenso/prisma'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +export interface SetFieldsForDocumentOptions { + userId: number; + documentId: number; + fields: { + id?: number | null; + signerEmail: string; + pageNumber: number; + pageX: number; + pageY: number; + pageWidth: number; + pageHeight: number; + }[]; +} + +export const setFieldsForDocument = async ({ + userId, + documentId, + fields, +}: SetFieldsForDocumentOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + userId, + }, + }); + + if (!document) { + throw new Error('Document not found'); + } + + const existingFields = await prisma.field.findMany({ + where: { + documentId, + }, + include: { + Recipient: true, + }, + }); + + const removedFields = existingFields.filter( + (existingField) => + !fields.find( + (field) => + field.id === existingField.id || field.signerEmail === existingField.Recipient?.email, + ), + ); + + const linkedFields = fields.map((field) => { + const existing = existingFields.find((existingField) => existingField.id === field.id); + + return { + ...field, + ...existing, + }; + }); + + for (const field of linkedFields) { + if ( + field.Recipient?.sendStatus === SendStatus.SENT || + field.Recipient?.signingStatus === SigningStatus.SIGNED + ) { + throw new Error('Cannot modify fields after sending'); + } + } + + const persistedFields = await prisma.$transaction( + linkedFields.map((field) => + field.id + ? prisma.field.update({ + where: { + id: field.id, + recipientId: field.recipientId, + documentId, + }, + data: { + type: field.type, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + }, + }) + : prisma.field.create({ + data: { + type: field.type!, + page: field.pageNumber, + positionX: field.pageX, + positionY: field.pageY, + width: field.pageWidth, + height: field.pageHeight, + customText: '', + inserted: false, + + Document: { + connect: { + id: document.id, + }, + }, + Recipient: { + connect: { + documentId_email: { + documentId: document.id, + email: field.signerEmail, + }, + }, + }, + }, + }), + ), + ); + + if (removedFields.length > 0) { + await prisma.field.deleteMany({ + where: { + id: { + in: removedFields.map((field) => field.id), + }, + }, + }); + } + + return persistedFields; +}; diff --git a/packages/lib/server-only/recipient/get-recipients-for-document.ts b/packages/lib/server-only/recipient/get-recipients-for-document.ts new file mode 100644 index 000000000..8b64bc1e8 --- /dev/null +++ b/packages/lib/server-only/recipient/get-recipients-for-document.ts @@ -0,0 +1,22 @@ +import { prisma } from '@documenso/prisma'; + +export interface GetRecipientsForDocumentOptions { + documentId: number; + userId: number; +} + +export const getRecipientsForDocument = async ({ + documentId, + userId, +}: GetRecipientsForDocumentOptions) => { + const recipients = await prisma.recipient.findMany({ + where: { + documentId, + Document: { + userId, + }, + }, + }); + + return recipients; +}; diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts new file mode 100644 index 000000000..bee6acfc3 --- /dev/null +++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts @@ -0,0 +1,103 @@ +import { nanoid } from 'nanoid'; + +import { prisma } from '@documenso/prisma'; +import { SendStatus, SigningStatus } from '@documenso/prisma/client'; + +export interface SetRecipientsForDocumentOptions { + userId: number; + documentId: number; + recipients: { + id?: number | null; + email: string; + name: string; + }[]; +} + +export const setRecipientsForDocument = async ({ + userId, + documentId, + recipients, +}: SetRecipientsForDocumentOptions) => { + const document = await prisma.document.findFirst({ + where: { + id: documentId, + userId, + }, + }); + + if (!document) { + throw new Error('Document not found'); + } + + const existingRecipients = await prisma.recipient.findMany({ + where: { + documentId, + }, + }); + + const removedRecipients = existingRecipients.filter( + (existingRecipient) => + !recipients.find( + (recipient) => + recipient.id === existingRecipient.id || recipient.email === existingRecipient.email, + ), + ); + + const linkedRecipients = recipients.map((recipient) => { + const existing = existingRecipients.find( + (existingRecipient) => + existingRecipient.id === recipient.id || existingRecipient.email === recipient.email, + ); + + return { + ...recipient, + ...existing, + }; + }); + + for (const recipient of linkedRecipients) { + if ( + recipient.sendStatus === SendStatus.SENT || + recipient.signingStatus === SigningStatus.SIGNED + ) { + throw new Error('Cannot modify recipients after sending'); + } + } + + const persistedRecipients = await prisma.$transaction( + linkedRecipients.map((recipient) => + recipient.id + ? prisma.recipient.update({ + where: { + id: recipient.id, + documentId, + }, + data: { + name: recipient.name, + email: recipient.email, + documentId, + }, + }) + : prisma.recipient.create({ + data: { + name: recipient.name, + email: recipient.email, + token: nanoid(), + documentId, + }, + }), + ), + ); + + if (removedRecipients.length > 0) { + await prisma.recipient.deleteMany({ + where: { + id: { + in: removedRecipients.map((recipient) => recipient.id), + }, + }, + }); + } + + return persistedRecipients; +}; diff --git a/packages/prisma/migrations/20230617040606_add_name_field/migration.sql b/packages/prisma/migrations/20230617040606_add_name_field/migration.sql new file mode 100644 index 000000000..a3412b6e6 --- /dev/null +++ b/packages/prisma/migrations/20230617040606_add_name_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "FieldType" ADD VALUE 'NAME'; diff --git a/packages/prisma/migrations/20230617041623_add_email_field/migration.sql b/packages/prisma/migrations/20230617041623_add_email_field/migration.sql new file mode 100644 index 000000000..5608f7974 --- /dev/null +++ b/packages/prisma/migrations/20230617041623_add_email_field/migration.sql @@ -0,0 +1,2 @@ +-- AlterEnum +ALTER TYPE "FieldType" ADD VALUE 'EMAIL'; diff --git a/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql b/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql new file mode 100644 index 000000000..eb3744e81 --- /dev/null +++ b/packages/prisma/migrations/20230621130930_add_width_and_height_for_fields/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Field" ADD COLUMN "height" INTEGER NOT NULL DEFAULT -1, +ADD COLUMN "width" INTEGER NOT NULL DEFAULT -1; diff --git a/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql b/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql new file mode 100644 index 000000000..243b654e1 --- /dev/null +++ b/packages/prisma/migrations/20230621131348_add_document_id_and_email_index/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[documentId,email]` on the table `Recipient` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Recipient_documentId_email_key" ON "Recipient"("documentId", "email"); diff --git a/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql b/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql new file mode 100644 index 000000000..2aea39805 --- /dev/null +++ b/packages/prisma/migrations/20230621133446_migrate_field_position_to_float/migration.sql @@ -0,0 +1,9 @@ +-- AlterTable +ALTER TABLE "Field" ALTER COLUMN "positionX" SET DEFAULT 0, +ALTER COLUMN "positionX" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "positionY" SET DEFAULT 0, +ALTER COLUMN "positionY" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "height" SET DEFAULT -1, +ALTER COLUMN "height" SET DATA TYPE DECIMAL(65,30), +ALTER COLUMN "width" SET DEFAULT -1, +ALTER COLUMN "width" SET DATA TYPE DECIMAL(65,30); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 1bc356428..4d5f900d7 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,5 +1,6 @@ generator client { provider = "prisma-client-js" + previewFeatures = ["extendedWhereUnique"] } datasource db { @@ -123,11 +124,15 @@ model Recipient { Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) Field Field[] Signature Signature[] + + @@unique([documentId, email]) } enum FieldType { SIGNATURE FREE_SIGNATURE + NAME + EMAIL DATE TEXT } @@ -138,8 +143,10 @@ model Field { recipientId Int? type FieldType page Int - positionX Int @default(0) - positionY Int @default(0) + positionX Decimal @default(0) + positionY Decimal @default(0) + width Decimal @default(-1) + height Decimal @default(-1) customText String inserted Boolean Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) diff --git a/packages/trpc/package.json b/packages/trpc/package.json index 839fefab9..1497a1ad5 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -7,6 +7,8 @@ "scripts": { }, "dependencies": { + "@documenso/lib": "*", + "@documenso/prisma": "*", "@tanstack/react-query": "^4.29.5", "@trpc/client": "^10.25.1", "@trpc/next": "^10.25.1", diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts new file mode 100644 index 000000000..9d39d631b --- /dev/null +++ b/packages/trpc/server/document-router/router.ts @@ -0,0 +1,55 @@ +import { TRPCError } from '@trpc/server'; + +import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document'; +import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document'; + +import { authenticatedProcedure, router } from '../trpc'; +import { + ZSetFieldsForDocumentMutationSchema, + ZSetRecipientsForDocumentMutationSchema, +} from './schema'; + +export const documentRouter = router({ + setRecipientsForDocument: authenticatedProcedure + .input(ZSetRecipientsForDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, recipients } = input; + + return await setRecipientsForDocument({ + userId: ctx.user.id, + documentId, + recipients, + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: + 'We were unable to set the recipients for this document. Please try again later.', + }); + } + }), + + setFieldsForDocument: authenticatedProcedure + .input(ZSetFieldsForDocumentMutationSchema) + .mutation(async ({ input, ctx }) => { + try { + const { documentId, fields } = input; + + return await setFieldsForDocument({ + userId: ctx.user.id, + documentId, + fields, + }); + } catch (err) { + console.error(err); + + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'We were unable to set the fields for this document. Please try again later.', + }); + } + }), +}); diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts new file mode 100644 index 000000000..1d6f7aa7c --- /dev/null +++ b/packages/trpc/server/document-router/schema.ts @@ -0,0 +1,38 @@ +import { z } from 'zod'; + +import { FieldType } from '@documenso/prisma/client'; + +export const ZSetRecipientsForDocumentMutationSchema = z.object({ + documentId: z.number(), + recipients: z.array( + z.object({ + id: z.number().nullish(), + email: z.string().min(1).email(), + name: z.string(), + }), + ), +}); + +export type TSetRecipientsForDocumentMutationSchema = z.infer< + typeof ZSetRecipientsForDocumentMutationSchema +>; + +export const ZSetFieldsForDocumentMutationSchema = z.object({ + documentId: z.number(), + fields: z.array( + z.object({ + id: z.number().nullish(), + 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 TSetFieldsForDocumentMutationSchema = z.infer< + typeof ZSetFieldsForDocumentMutationSchema +>; diff --git a/packages/trpc/server/router.ts b/packages/trpc/server/router.ts index d3f47b5c9..e83c5c192 100644 --- a/packages/trpc/server/router.ts +++ b/packages/trpc/server/router.ts @@ -1,4 +1,5 @@ import { authRouter } from './auth-router/router'; +import { documentRouter } from './document-router/router'; import { profileRouter } from './profile-router/router'; import { procedure, router } from './trpc'; @@ -6,6 +7,7 @@ export const appRouter = router({ hello: procedure.query(() => 'Hello, world!'), auth: authRouter, profile: profileRouter, + document: documentRouter, }); export type AppRouter = typeof appRouter; diff --git a/packages/ui/primitives/card.tsx b/packages/ui/primitives/card.tsx index 7030bb590..5144c4dfa 100644 --- a/packages/ui/primitives/card.tsx +++ b/packages/ui/primitives/card.tsx @@ -10,22 +10,10 @@ export type CardProps = React.HTMLAttributes & { spotlight?: boolean; gradient?: boolean; degrees?: number; - lightMode?: boolean; }; const Card = React.forwardRef( - ( - { - className, - children, - gradient = false, - spotlight = false, - degrees = 120, - lightMode = true, - ...props - }, - ref, - ) => { + ({ className, children, gradient = false, spotlight = false, degrees = 120, ...props }, ref) => { const mouseX = useMotionValue(0); const mouseY = useMotionValue(0); @@ -46,12 +34,15 @@ const Card = React.forwardRef( } as React.CSSProperties } className={cn( - 'bg-background text-foreground dark:hover:border-documenso group relative rounded-lg border-2 backdrop-blur-[2px]', + 'bg-background text-foreground group relative rounded-lg border-2 backdrop-blur-[2px]', { 'gradient-border-mask before:pointer-events-none before:absolute before:-inset-[2px] before:rounded-lg before:p-[2px] before:[background:linear-gradient(var(--card-gradient-degrees),theme(colors.documenso.DEFAULT/50%)_5%,theme(colors.border/80%)_30%)]': - gradient && lightMode, + gradient, + 'dark:gradient-border-mask before:pointer-events-none before:absolute before:-inset-[2px] before:rounded-lg before:p-[2px] before:[background:linear-gradient(var(--card-gradient-degrees),theme(colors.documenso.DEFAULT/70%)_5%,theme(colors.border/80%)_30%)]': + gradient, 'shadow-[0_0_0_4px_theme(colors.gray.100/70%),0_0_0_1px_theme(colors.gray.100/70%),0_0_0_0.5px_theme(colors.primary.DEFAULT/70%)]': - lightMode, + true, + 'dark:shadow-[0]': true, }, className, )} From 3c02331cb92f5581dcdf1292907f8fd0523e4dd1 Mon Sep 17 00:00:00 2001 From: Doug Andrade Date: Wed, 21 Jun 2023 17:57:02 -0400 Subject: [PATCH 04/25] linking card metrics to filtered /documents --- apps/web/src/app/(dashboard)/dashboard/page.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index b6bad38a9..30ee90ed9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -38,9 +38,15 @@ export default async function DashboardPage() { Dashboard - - - + + + + + + + + + From d8a094a3248e1568f32d40c88504c33447e29442 Mon Sep 17 00:00:00 2001 From: Mythie Date: Fri, 23 Jun 2023 18:05:43 +1000 Subject: [PATCH 05/25] chore: use jsonprotocol --- packages/prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 4d5f900d7..21320cc69 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,6 +1,6 @@ generator client { provider = "prisma-client-js" - previewFeatures = ["extendedWhereUnique"] + previewFeatures = ["extendedWhereUnique", "jsonProtocol"] } datasource db { From f22baca56986fb15cfe3def6dcc77b272ad8431f Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 23 Jun 2023 12:20:49 +0000 Subject: [PATCH 06/25] feat: stack recipients avatars on dashboard --- .../src/app/(dashboard)/dashboard/page.tsx | 46 +++++++++++++++++++ .../components/(dashboard)/avatar/index.tsx | 36 +++++++++++++++ .../document-dropzone/document-dropzone.tsx | 4 -- .../server-only/document/find-documents.ts | 11 ++++- packages/prisma/schema.prisma | 10 ++-- packages/tailwind-config/index.cjs | 14 ++++++ 6 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/index.tsx diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index b6bad38a9..bdac678ff 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -5,6 +5,7 @@ import { Clock, File, FileCheck } from 'lucide-react'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; +import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -14,12 +15,51 @@ import { TableRow, } from '@documenso/ui/primitives/table'; +import { StackAvatar } from '~/components/(dashboard)/avatar'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; +const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + const initials = + recipient.name + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + const type = + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; + + return ( + + ); + }); +}; + export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -54,6 +94,7 @@ export default async function DashboardPage() { ID Title + Reciepient Status Created @@ -70,6 +111,11 @@ export default async function DashboardPage() { {document.title} + + + {renderStackAvatars(document.Recipient)} + + diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/index.tsx new file mode 100644 index 000000000..a784cbbff --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/index.tsx @@ -0,0 +1,36 @@ +import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; + +export type StackAvatarProps = { + first?: boolean; + zIndex?: string; + fallbackText?: string; + type: 'unsigned' | 'waiting' | 'completed'; +}; + +export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { + let classes = ''; + switch (type) { + case 'unsigned': + classes = 'bg-dawn-400 text-dawn-900'; + break; + case 'waiting': + classes = 'bg-water text-water-700'; + break; + case 'completed': + classes = 'bg-documenso-200 text-documenso-800'; + break; + default: + break; + } + + return ( + + {fallbackText ?? 'UK'} + + ); +}; diff --git a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx index 3688bdfca..10ccba9d0 100644 --- a/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx +++ b/apps/web/src/components/(dashboard)/document-dropzone/document-dropzone.tsx @@ -2,7 +2,6 @@ import { Variants, motion } from 'framer-motion'; import { Plus } from 'lucide-react'; -import { useTheme } from 'next-themes'; import { useDropzone } from 'react-dropzone'; import { cn } from '@documenso/ui/lib/utils'; @@ -92,8 +91,6 @@ export const DocumentDropzone = ({ className, onDrop, ...props }: DocumentDropzo }, }); - const { theme } = useTheme(); - return ( diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 627ceee8b..005b6614a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,5 +1,5 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; import { FindResultSet } from '../../types/find-result-set'; @@ -15,6 +15,10 @@ export interface FindDocumentsOptions { }; } +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; + export const findDocuments = async ({ userId, term, @@ -22,7 +26,7 @@ export const findDocuments = async ({ page = 1, perPage = 10, orderBy, -}: FindDocumentsOptions): Promise> => { +}: FindDocumentsOptions): Promise> => { const orderByColumn = orderBy?.column ?? 'created'; const orderByDirection = orderBy?.direction ?? 'desc'; @@ -48,6 +52,9 @@ export const findDocuments = async ({ orderBy: { [orderByColumn]: orderByDirection, }, + include: { + Recipient: true, + }, }), prisma.document.count({ where: { diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 4d5f900d7..4030af769 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -1,5 +1,5 @@ generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" previewFeatures = ["extendedWhereUnique"] } @@ -143,10 +143,10 @@ model Field { recipientId Int? type FieldType page Int - positionX Decimal @default(0) - positionY Decimal @default(0) - width Decimal @default(-1) - height Decimal @default(-1) + positionX Decimal @default(0) + positionY Decimal @default(0) + width Decimal @default(-1) + height Decimal @default(-1) customText String inserted Boolean Document Document @relation(fields: [documentId], references: [id], onDelete: Cascade) diff --git a/packages/tailwind-config/index.cjs b/packages/tailwind-config/index.cjs index 2f6e37954..3d8288ace 100644 --- a/packages/tailwind-config/index.cjs +++ b/packages/tailwind-config/index.cjs @@ -72,6 +72,20 @@ module.exports = { 900: '#52514a', 950: '#2a2925', }, + water: { + DEFAULT: '#d7e4f3', + 50: '#f3f6fb', + 100: '#e3ebf6', + 200: '#d7e4f3', + 300: '#abc7e5', + 400: '#82abd8', + 500: '#658ecc', + 600: '#5175bf', + 700: '#4764ae', + 800: '#3e538f', + 900: '#364772', + 950: '#252d46', + }, }, backgroundImage: { 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', From 2e8e39c5a98057d7588db17f51391d0a54fea7d6 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 23 Jun 2023 20:19:25 +0000 Subject: [PATCH 07/25] feat: add tooltip on hover on stacked avatars --- .../src/app/(dashboard)/dashboard/page.tsx | 145 +++++++++++++++--- .../components/(dashboard)/avatar/index.tsx | 2 +- 2 files changed, 124 insertions(+), 23 deletions(-) diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index bdac678ff..8526a8c05 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -14,6 +14,12 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; @@ -60,6 +66,24 @@ const renderStackAvatars = (recipients: Recipient[]) => { }); }; +const renderAvatar = (recipient: Recipient) => { + const initials = + recipient.name + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; + + const type = + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; + + return ; +}; + export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -100,30 +124,107 @@ export default async function DashboardPage() { - {results.data.map((document) => ( - - {document.id} - - - {document.title} - - + {results.data.map((document) => { + const waitingRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); - - {renderStackAvatars(document.Recipient)} - + const completedRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); - - - - - - - - ))} + const uncompletedRecipients = document.Recipient.filter( + (recipient) => + recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + {document.id} + + + {document.title} + + + + + + + + {renderStackAvatars(document.Recipient)} + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + {renderAvatar(recipient)} + + {recipient.email} + + + ))} + + )} + + + + + + + + + + + + + + ); + })} {results.data.length === 0 && ( diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/index.tsx index a784cbbff..2a263893a 100644 --- a/apps/web/src/components/(dashboard)/avatar/index.tsx +++ b/apps/web/src/components/(dashboard)/avatar/index.tsx @@ -11,7 +11,7 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let classes = ''; switch (type) { case 'unsigned': - classes = 'bg-dawn-400 text-dawn-900'; + classes = 'bg-dawn-200 text-dawn-900'; break; case 'waiting': classes = 'bg-water text-water-700'; From bd0db0f8fdc1474afd70ce4c68aad7620ad3fedd Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 14:59:08 +1000 Subject: [PATCH 08/25] feat: email templates adds email templates using `react-email` which will be used for invites, signing and document completion. authored by @dephraiim --- package-lock.json | 6535 ++++++++++++++++- package.json | 3 +- packages/email/.gitignore | 1 + packages/email/ambient.d.ts | 1 + packages/email/index.ts | 1 + packages/email/package.json | 22 + packages/email/static/clock.png | Bin 0 -> 2469 bytes packages/email/static/completed.png | Bin 0 -> 1812 bytes packages/email/static/document.png | Bin 0 -> 16295 bytes packages/email/static/download.png | Bin 0 -> 784 bytes packages/email/static/logo.png | Bin 0 -> 4119 bytes packages/email/static/review.png | Bin 0 -> 708 bytes packages/email/tailwind.config.js | 11 + .../email/templates/document-completed.tsx | 129 + packages/email/templates/document-invite.tsx | 127 + packages/email/templates/document-pending.tsx | 104 + packages/email/tsconfig.json | 5 + 17 files changed, 6931 insertions(+), 8 deletions(-) create mode 100644 packages/email/.gitignore create mode 100644 packages/email/ambient.d.ts create mode 100644 packages/email/index.ts create mode 100644 packages/email/package.json create mode 100644 packages/email/static/clock.png create mode 100644 packages/email/static/completed.png create mode 100644 packages/email/static/document.png create mode 100644 packages/email/static/download.png create mode 100644 packages/email/static/logo.png create mode 100644 packages/email/static/review.png create mode 100644 packages/email/tailwind.config.js create mode 100644 packages/email/templates/document-completed.tsx create mode 100644 packages/email/templates/document-invite.tsx create mode 100644 packages/email/templates/document-pending.tsx create mode 100644 packages/email/tsconfig.json diff --git a/package-lock.json b/package-lock.json index bd3775a2f..a6f2fd973 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,8 @@ "name": "documenso.next", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "packages/email/.react-email" ], "devDependencies": { "dotenv": "^16.0.3", @@ -420,6 +421,10 @@ "node": ">=6.9.0" } }, + "node_modules/@documenso/email": { + "resolved": "packages/email", + "link": true + }, "node_modules/@documenso/eslint-config": { "resolved": "packages/eslint-config", "link": true @@ -475,6 +480,358 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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" + ], + "dev": true, + "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", @@ -644,6 +1001,158 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, + "node_modules/@manypkg/find-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-2.1.0.tgz", + "integrity": "sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==", + "dev": true, + "dependencies": { + "@manypkg/tools": "^1.0.0", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "node_modules/@manypkg/find-root/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/find-root/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@manypkg/find-root/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@manypkg/find-root/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@manypkg/tools": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-1.1.0.tgz", + "integrity": "sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==", + "dev": true, + "dependencies": { + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "jju": "^1.4.0", + "read-yaml-file": "^1.1.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@manypkg/tools/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@manypkg/tools/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@manypkg/tools/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -663,6 +1172,64 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "dependencies": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "dependencies": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "dependencies": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "node_modules/@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "dependencies": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "node_modules/@next-auth/prisma-adapter": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.6.tgz", @@ -852,6 +1419,177 @@ "node": ">= 8" } }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", + "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/@panva/hkdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", @@ -934,6 +1672,11 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" }, + "node_modules/@radix-ui/colors": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", + "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" + }, "node_modules/@radix-ui/number": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", @@ -1676,6 +2419,90 @@ "react-dom": "^16.8 || ^17.0 || ^18.0" } }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.1.tgz", + "integrity": "sha512-eye/gYvzy82xtoSSeu5Pwlzrh6N2rOcDIwAI7xMatu622Qjlg64LtwB0PSh3iWdmn6Wqy1Fjo5twNPQsp0guiw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-toggle": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.1.tgz", + "integrity": "sha512-hZIp9ZKnw4NwVqeB4evWBLa91ryaSJhAO0Ed82wkzRPgg/I29ypcY6SuBb3AMZW+GsuBZpIVujpCq+33TdEcyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.5.tgz", @@ -1802,11 +2629,260 @@ "@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/components/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==", + "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/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-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.6", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-0.0.6.tgz", + "integrity": "sha512-6zs7WZbd37TcPT1OmMPH/kcBpv0QSi+k3om7LyDnbdIcrbwOO/OstVwUaa/6zgvDvnq9Y2wOosbru7j5kUrW9A==", + "dev": true, + "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/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_modules/@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" }, + "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/@swc/helpers": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", @@ -1954,6 +3030,16 @@ "@types/node": "*" } }, + "node_modules/@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "deprecated": "This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "classnames": "*" + } + }, "node_modules/@types/formidable": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", @@ -1978,6 +3064,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -2224,6 +3316,24 @@ "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-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/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -2520,6 +3630,26 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcrypt": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", @@ -2533,6 +3663,12 @@ "node": ">= 10.0.0" } }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -2541,6 +3677,19 @@ "node": ">=0.6" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2549,6 +3698,23 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -2607,6 +3773,48 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -2702,6 +3910,18 @@ "node": ">=6" } }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2770,11 +3990,49 @@ } } }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -2967,6 +4225,28 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3002,6 +4282,12 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3112,6 +4398,14 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -3144,6 +4438,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -3170,6 +4476,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/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -3183,6 +4497,12 @@ "node": ">= 0.6" } }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "node_modules/detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -3196,6 +4516,123 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-package-manager/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/detect-package-manager/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/detect-package-manager/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-package-manager/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-package-manager/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-package-manager/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-package-manager/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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", @@ -3242,6 +4679,57 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -3275,6 +4763,87 @@ "node": ">=12" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, "node_modules/electron-to-chromium": { "version": "1.4.397", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", @@ -3308,6 +4877,26 @@ "node": ">=8.6" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -3411,6 +5000,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.4", + "@esbuild/android-arm64": "0.16.4", + "@esbuild/android-x64": "0.16.4", + "@esbuild/darwin-arm64": "0.16.4", + "@esbuild/darwin-x64": "0.16.4", + "@esbuild/freebsd-arm64": "0.16.4", + "@esbuild/freebsd-x64": "0.16.4", + "@esbuild/linux-arm": "0.16.4", + "@esbuild/linux-arm64": "0.16.4", + "@esbuild/linux-ia32": "0.16.4", + "@esbuild/linux-loong64": "0.16.4", + "@esbuild/linux-mips64el": "0.16.4", + "@esbuild/linux-ppc64": "0.16.4", + "@esbuild/linux-riscv64": "0.16.4", + "@esbuild/linux-s390x": "0.16.4", + "@esbuild/linux-x64": "0.16.4", + "@esbuild/netbsd-x64": "0.16.4", + "@esbuild/openbsd-x64": "0.16.4", + "@esbuild/sunos-x64": "0.16.4", + "@esbuild/win32-arm64": "0.16.4", + "@esbuild/win32-ia32": "0.16.4", + "@esbuild/win32-x64": "0.16.4" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4013,6 +5639,15 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, "node_modules/eslint-plugin-turbo": { "version": "1.9.6", "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.9.6.tgz", @@ -4021,6 +5656,15 @@ "eslint": ">6.6.0" } }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -4183,6 +5827,22 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4193,6 +5853,19 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "node_modules/fast-folder-size": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fast-folder-size/-/fast-folder-size-1.6.1.tgz", + "integrity": "sha512-F3tRpfkAzb7TT2JNKaJUglyuRjRa+jelQD94s9OSqkfEeytLmupCqQiD+H2KoIXGtp4pB5m4zNmv5m2Ktcr+LA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "unzipper": "^0.10.11" + }, + "bin": { + "fast-folder-size": "cli.js" + } + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -4353,6 +6026,20 @@ } } }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -4393,6 +6080,45 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -4688,6 +6414,91 @@ "node": ">=8" } }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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-dom-parser/node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "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==", + "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/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", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -4734,6 +6545,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -4779,6 +6610,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "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", @@ -4792,6 +6633,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4828,6 +6678,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4865,6 +6721,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4915,6 +6776,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4959,6 +6828,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -5008,6 +6886,15 @@ "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5099,6 +6986,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -5141,6 +7040,14 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -5198,6 +7105,12 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", @@ -5206,6 +7119,76 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-beautify": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", + "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-beautify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "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==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -5243,6 +7226,12 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5264,6 +7253,18 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -5276,6 +7277,17 @@ "node": ">=4.0" } }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -5289,6 +7301,14 @@ "language-subtag-registry": "~0.3.2" } }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5314,6 +7334,12 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5343,6 +7369,22 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5806,6 +7848,27 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6061,6 +8124,29 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6089,6 +8175,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -6105,6 +8200,36 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6181,6 +8306,14 @@ "canvas": "^2.11.2" } }, + "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/perfect-freehand": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", @@ -6245,6 +8378,27 @@ "node": "^10 || ^12 || >=14" } }, + "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/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", @@ -6483,11 +8637,44 @@ } } }, + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, "node_modules/prisma": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", @@ -6504,6 +8691,12 @@ "node": ">=14.17" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -6522,6 +8715,16 @@ "react-is": "^16.13.1" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -6563,6 +8766,17 @@ } ] }, + "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/railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -6659,6 +8873,98 @@ "react": ">= 16.8 || 18.0.0" } }, + "node_modules/react-email": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-1.9.4.tgz", + "integrity": "sha512-DNUQb7xzAlMga2ZppG57bnWhJnqOEcTYzxNvLA4IVCiYJkgPNVukFMOZVG2OuQ0W8ddiF6bLZBKDZHnnIenbpw==", + "dev": true, + "dependencies": { + "@commander-js/extra-typings": "9.4.1", + "@manypkg/find-root": "2.1.0", + "@octokit/rest": "19.0.7", + "@react-email/render": "0.0.6", + "chokidar": "3.5.3", + "commander": "9.4.1", + "detect-package-manager": "2.0.1", + "esbuild": "0.16.4", + "fs-extra": "11.1.0", + "glob": "8.0.3", + "log-symbols": "4.1.0", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "read-pkg": "5.2.0", + "shelljs": "0.8.5", + "tree-node-cli": "1.6.0" + }, + "bin": { + "email": "dist/source/index.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/react-email-client": { + "resolved": "packages/email/.react-email", + "link": true + }, + "node_modules/react-email/node_modules/@commander-js/extra-typings": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-9.4.1.tgz", + "integrity": "sha512-v0BqORYamk1koxDon6femDGLWSL7P78vYTyOU5nFaALnmNALL+ktgdHvWbxzzBBJIKS7kv3XvM/DqNwiLcgFTA==", + "dev": true, + "peerDependencies": { + "commander": "9.4.x" + } + }, + "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", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/react-email/node_modules/commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/react-email/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-hook-form": { "version": "7.43.9", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", @@ -6709,6 +9015,11 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "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", @@ -6823,6 +9134,54 @@ "pify": "^2.3.0" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -6847,6 +9206,18 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -6911,6 +9282,43 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -7105,10 +9513,21 @@ "loose-envify": "^1.1.0" } }, + "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/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7124,6 +9543,12 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -7148,6 +9573,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -7161,6 +9603,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7237,6 +9684,38 @@ "node": ">=0.10.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7425,6 +9904,22 @@ "node": ">=12.*" } }, + "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-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/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -7752,6 +10247,39 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/tree-node-cli": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.6.0.tgz", + "integrity": "sha512-M8um5Lbl76rWU5aC8oOeEhruiCM29lFCKnwpxrwMjpRicHXJx+bb9Cak11G3zYLrMb6Glsrhnn90rHIzDJrjvg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "fast-folder-size": "1.6.1", + "pretty-bytes": "^5.6.0" + }, + "bin": { + "tree": "bin/tree.js", + "treee": "bin/tree.js" + } + }, + "node_modules/tree-node-cli/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -7888,6 +10416,171 @@ "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/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/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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7949,6 +10642,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7965,6 +10673,60 @@ "node": ">=8" } }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -8082,6 +10844,25 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -8192,6 +10973,14 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -8224,6 +11013,1037 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "packages/email": { + "name": "@documenso/email", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7" + }, + "devDependencies": { + "react-email": "^1.9.4" + } + }, + "packages/email/.react-email": { + "name": "react-email-client", + "version": "0.0.14", + "license": "MIT", + "dependencies": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@radix-ui/colors": "0.1.8", + "@radix-ui/react-collapsible": "1.0.1", + "@radix-ui/react-popover": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-toggle-group": "1.0.1", + "@radix-ui/react-tooltip": "1.0.2", + "@react-email/components": "^0.0.7", + "@react-email/render": "0.0.7", + "classnames": "2.3.2", + "framer-motion": "8.4.6", + "next": "13.2.4", + "prism-react-renderer": "1.3.5", + "react": "18.2.0", + "react-dom": "18.2.0" + }, + "devDependencies": { + "@types/classnames": "2.3.1", + "@types/node": "18.11.9", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", + "autoprefixer": "10.4.13", + "eslint": "8.36.0", + "eslint-config-next": "13.2.4", + "eslint-config-prettier": "8.7.0", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", + "postcss": "8.4.19", + "prettier": "2.8.4", + "tailwindcss": "3.2.4", + "typescript": "4.9.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/email/node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/email/node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "packages/email/node_modules/@next/env": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", + "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" + }, + "packages/email/node_modules/@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + } + }, + "packages/email/node_modules/@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-darwin-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", + "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-darwin-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", + "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", + "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-arm64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", + "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-x64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", + "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-linux-x64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", + "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", + "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", + "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@next/swc-win32-x64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", + "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "packages/email/node_modules/@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-collapsible": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.1.tgz", + "integrity": "sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-tooltip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz", + "integrity": "sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "packages/email/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==", + "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" + } + }, + "packages/email/node_modules/@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "packages/email/node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "packages/email/node_modules/@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "packages/email/node_modules/@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "packages/email/node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "packages/email/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "packages/email/node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "packages/email/node_modules/eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/eslint-config-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.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" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/email/node_modules/eslint-config-prettier": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "packages/email/node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "packages/email/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/email/node_modules/framer-motion": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.4.6.tgz", + "integrity": "sha512-0GkpTQnhDysG5SiD2VbANtAs8yCXVQLasynVABDTZYI+Qcx1krWg+rfyveM8W78q7AX+8RTsiMz/LJ7YIRZvFw==", + "dependencies": { + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "packages/email/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "packages/email/node_modules/next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", + "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", + "dependencies": { + "@next/env": "13.2.4", + "@swc/helpers": "0.4.14", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=14.6.0" + }, + "optionalDependencies": { + "@next/swc-android-arm-eabi": "13.2.4", + "@next/swc-android-arm64": "13.2.4", + "@next/swc-darwin-arm64": "13.2.4", + "@next/swc-darwin-x64": "13.2.4", + "@next/swc-freebsd-x64": "13.2.4", + "@next/swc-linux-arm-gnueabihf": "13.2.4", + "@next/swc-linux-arm64-gnu": "13.2.4", + "@next/swc-linux-arm64-musl": "13.2.4", + "@next/swc-linux-x64-gnu": "13.2.4", + "@next/swc-linux-x64-musl": "13.2.4", + "@next/swc-win32-arm64-msvc": "13.2.4", + "@next/swc-win32-ia32-msvc": "13.2.4", + "@next/swc-win32-x64-msvc": "13.2.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.0", + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "packages/email/node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "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" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "packages/email/node_modules/postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "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" + } + }, + "packages/email/node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "packages/email/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==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "packages/email/node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "packages/email/node_modules/tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "packages/email/node_modules/tailwindcss/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==", + "dev": true, + "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 + } + } + }, + "packages/email/node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "packages/email/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", @@ -8787,6 +12607,617 @@ "to-fast-properties": "^2.0.0" } }, + "@documenso/email": { + "version": "file:packages/email", + "requires": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7", + "react-email": "^1.9.4" + }, + "dependencies": { + "@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@next/env": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.4.tgz", + "integrity": "sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==" + }, + "@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "dev": true, + "requires": { + "glob": "7.1.7" + } + }, + "@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz", + "integrity": "sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz", + "integrity": "sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz", + "integrity": "sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz", + "integrity": "sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz", + "integrity": "sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz", + "integrity": "sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz", + "integrity": "sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz", + "integrity": "sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz", + "integrity": "sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==", + "optional": true + }, + "@radix-ui/react-arrow": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.1.tgz", + "integrity": "sha512-1yientwXqXcErDHEv8av9ZVNEBldH8L9scVR3is20lL+jOCfcJyMFZFEY5cgIrgexsq1qggSXqiEL/d/4f+QXA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-collapsible": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.1.tgz", + "integrity": "sha512-0maX4q91iYa4gjt3PsNf7dq/yqSR+HGAE8I5p54dQ6gnveS+ETWlMoijxrhmgV1k8svxpm34mQAtqIrJt4XZmA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.2.tgz", + "integrity": "sha512-WjJzMrTWROozDqLB0uRWYvj4UuXsM/2L19EmQ3Au+IJWqwvwq9Bwd+P8ivo0Deg9JDPArR1I6MbWNi1CmXsskg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.2" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.1.tgz", + "integrity": "sha512-Ej2MQTit8IWJiS2uuujGUmxXjF/y5xZptIIQnyd2JHLwtV0R2j9NRVoRj/1j/gJ7e3REdaBw4Hjf4a1ImhkZcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0" + } + }, + "@radix-ui/react-popover": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.2.tgz", + "integrity": "sha512-4tqZEl9w95R5mlZ/sFdgBnfhCBOEPepLIurBA5kt/qaAhldJ1tNQd0ngr0ET0AHbPotT4mwxMPr7a+MA/wbK0g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.1", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, + "@radix-ui/react-popper": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.0.1.tgz", + "integrity": "sha512-J4Vj7k3k+EHNWgcKrE+BLlQfpewxA7Zd76h5I0bIa+/EqaIZ3DuwrbPj49O3wqN+STnXsBuxiHLiF0iU3yfovw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "0.7.2", + "@radix-ui/react-arrow": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.0", + "@radix-ui/react-use-rect": "1.0.0", + "@radix-ui/react-use-size": "1.0.0", + "@radix-ui/rect": "1.0.0" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.1.tgz", + "integrity": "sha512-NY2vUWI5WENgAT1nfC6JS7RU5xRYBfjZVLq0HmgEN1Ezy3rk/UruMV4+Rd0F40PEaFC5SrLS1ixYvcYIQrb4Ig==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-tooltip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.2.tgz", + "integrity": "sha512-11gUlok2rv5mu+KBtxniOKKNKjqC/uTbgFHWoQdbF46vMV+zjDaBvCtVDK9+MTddlpmlisGPGvvojX7Qm0yr+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.2", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-popper": "1.0.1", + "@radix-ui/react-portal": "1.0.1", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0", + "@radix-ui/react-visually-hidden": "1.0.1" + } + }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.1.tgz", + "integrity": "sha512-K1hJcCMfWfiYUibRqf3V8r5Drpyf7rh44jnrwAbdvI5iCCijilBBeyQv9SKidYNZIopMdCyR9FnIjkHxHN0FcQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.1" + } + }, + "@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==", + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + }, + "@swc/helpers": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", + "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/react": { + "version": "18.0.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", + "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.0.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", + "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-config-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "dev": true, + "requires": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.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" + } + }, + "eslint-config-prettier": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", + "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", + "dev": true, + "requires": {} + }, + "eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "framer-motion": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-8.4.6.tgz", + "integrity": "sha512-0GkpTQnhDysG5SiD2VbANtAs8yCXVQLasynVABDTZYI+Qcx1krWg+rfyveM8W78q7AX+8RTsiMz/LJ7YIRZvFw==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "^2.4.0" + } + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.2.4.tgz", + "integrity": "sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==", + "requires": { + "@next/env": "13.2.4", + "@next/swc-android-arm-eabi": "13.2.4", + "@next/swc-android-arm64": "13.2.4", + "@next/swc-darwin-arm64": "13.2.4", + "@next/swc-darwin-x64": "13.2.4", + "@next/swc-freebsd-x64": "13.2.4", + "@next/swc-linux-arm-gnueabihf": "13.2.4", + "@next/swc-linux-arm64-gnu": "13.2.4", + "@next/swc-linux-arm64-musl": "13.2.4", + "@next/swc-linux-x64-gnu": "13.2.4", + "@next/swc-linux-x64-musl": "13.2.4", + "@next/swc-win32-arm64-msvc": "13.2.4", + "@next/swc-win32-ia32-msvc": "13.2.4", + "@next/swc-win32-x64-msvc": "13.2.4", + "@swc/helpers": "0.4.14", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1" + }, + "dependencies": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "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==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true + }, + "tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + } + } + }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, "@documenso/eslint-config": { "version": "file:packages/eslint-config", "requires": { @@ -9115,6 +13546,160 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "@esbuild/android-arm": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.4.tgz", + "integrity": "sha512-rZzb7r22m20S1S7ufIc6DC6W659yxoOrl7sKP1nCYhuvUlnCFHVSbATG4keGUtV8rDz11sRRDbWkvQZpzPaHiw==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.4.tgz", + "integrity": "sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.4.tgz", + "integrity": "sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==", + "dev": true, + "optional": true + }, + "@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==", + "dev": true, + "optional": true + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -9245,6 +13830,129 @@ } } }, + "@manypkg/find-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-2.1.0.tgz", + "integrity": "sha512-NEYRVlZCJYhRTqQURhv+WBpDcvmsp/M423Wcdvggv8lYJYD4GtqnTMLrQaTjA10fYt/PIc3tSdwV+wxJnWqPfQ==", + "dev": true, + "requires": { + "@manypkg/tools": "^1.0.0", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@manypkg/tools": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-1.1.0.tgz", + "integrity": "sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "jju": "^1.4.0", + "read-yaml-file": "^1.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, "@mapbox/node-pre-gyp": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", @@ -9261,6 +13969,64 @@ "tar": "^6.1.11" } }, + "@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "requires": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "requires": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "requires": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "requires": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "requires": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, "@next-auth/prisma-adapter": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@next-auth/prisma-adapter/-/prisma-adapter-1.0.6.tgz", @@ -9357,6 +14123,144 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true + }, + "@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "requires": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "requires": { + "@octokit/types": "^10.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + } + } + }, + "@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "requires": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", + "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "dev": true, + "requires": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + } + }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.0" + } + }, "@panva/hkdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", @@ -9417,6 +14321,11 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" }, + "@radix-ui/colors": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-0.1.8.tgz", + "integrity": "sha512-jwRMXYwC0hUo0mv6wGpuw254Pd9p/R6Td5xsRpOmaWkUHlooNWqVcadgyzlRumMq3xfOTXwJReU0Jv+EIy4Jbw==" + }, "@radix-ui/number": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", @@ -10005,6 +14914,72 @@ "@radix-ui/react-use-controllable-state": "1.0.0" } }, + "@radix-ui/react-toggle-group": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.1.tgz", + "integrity": "sha512-eye/gYvzy82xtoSSeu5Pwlzrh6N2rOcDIwAI7xMatu622Qjlg64LtwB0PSh3iWdmn6Wqy1Fjo5twNPQsp0guiw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-roving-focus": "1.0.1", + "@radix-ui/react-toggle": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + }, + "dependencies": { + "@radix-ui/react-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.1.tgz", + "integrity": "sha512-uuiFbs+YCKjn3X1DTSx9G7BHApu4GHbi3kgiwsnFUbOKCrwejAJv4eE4Vc8C0Oaxt9T0aV4ox0WCOdx+39Xo+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-roving-focus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.1.tgz", + "integrity": "sha512-TB76u5TIxKpqMpUAuYH2VqMhHYKa+4Vs1NHygo/llLvlffN6mLVsFhz0AnSFlSBAvTBYVHYAkHAyEt7x1gPJOA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-collection": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + }, + "@radix-ui/react-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.1.tgz", + "integrity": "sha512-hZIp9ZKnw4NwVqeB4evWBLa91ryaSJhAO0Ed82wkzRPgg/I29ypcY6SuBb3AMZW+GsuBZpIVujpCq+33TdEcyg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.0" + } + } + } + }, "@radix-ui/react-tooltip": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.5.tgz", @@ -10102,11 +15077,207 @@ "@babel/runtime": "^7.13.10" } }, + "@react-email/body": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.0.2.tgz", + "integrity": "sha512-SqZrZdxZlH7viwnrLvrMnVzOKpiofVAtho09bmm2siDzy0VMDGItXRzUPLcpg9vcbVJCHZRCIKoNXqA+PtokzQ==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@react-email/components": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@react-email/components/-/components-0.0.7.tgz", + "integrity": "sha512-GpRKV8E7EvK9OPf61f5Z8hliB3p0hTot8tslmEUVCTtX7tdL0wM2YEcZiDWU4PJcudJ/QWHJ7Y5wGzNEARcooA==", + "requires": { + "@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" + }, + "dependencies": { + "@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==", + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + } + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "@radix-ui/react-slot": "1.0.0", + "react": "18.2.0" + }, + "dependencies": { + "@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==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + } + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==" + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "dev": true, + "requires": { + "html-to-text": "9.0.3", + "pretty": "2.0.0", + "react": "18.2.0", + "react-dom": "18.2.0" + } + }, + "@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==" + }, + "@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==", + "requires": { + "react": "18.2.0" + } + }, + "@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==", + "requires": { + "html-react-parser": "3.0.9", + "react": "18.2.0", + "react-dom": "18.2.0", + "tw-to-css": "0.0.11" + } + }, + "@react-email/text": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.0.5.tgz", + "integrity": "sha512-LXhHiaC6oRRsNAfOzJDos4wQA22eIdVJvR6G7uu4QzUvYNOAatDMf89jRQcKGrxX7InkS640v8sHd9jl5ztM5w==", + "requires": { + "react": "18.2.0" + } + }, "@rushstack/eslint-patch": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==" }, + "@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==", + "requires": { + "domhandler": "^5.0.3", + "selderee": "^0.10.0" + } + }, "@swc/helpers": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", @@ -10189,6 +15360,15 @@ "@types/node": "*" } }, + "@types/classnames": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.3.1.tgz", + "integrity": "sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==", + "dev": true, + "requires": { + "classnames": "*" + } + }, "@types/formidable": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", @@ -10213,6 +15393,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -10362,6 +15548,21 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "requires": {} }, + "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==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "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==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -10572,6 +15773,12 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, "bcrypt": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", @@ -10581,16 +15788,49 @@ "node-addon-api": "^5.0.0" } }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, "bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -10627,6 +15867,28 @@ "update-browserslist-db": "^1.0.10" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true + }, "bundle-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", @@ -10683,6 +15945,15 @@ "simple-get": "^3.0.3" } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -10720,11 +15991,37 @@ "clsx": "1.2.1" } }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true + }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, "clsx": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", @@ -10868,6 +16165,25 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -10891,6 +16207,12 @@ "is-what": "^4.1.8" } }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10971,6 +16293,11 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, "default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -10991,6 +16318,15 @@ "untildify": "^4.0.0" } }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, "define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -11005,6 +16341,11 @@ "object-keys": "^1.1.1" } }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -11015,6 +16356,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", @@ -11025,6 +16372,86 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dev": true, + "requires": { + "execa": "^5.1.1" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, "dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -11065,6 +16492,39 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -11089,6 +16549,85 @@ "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + } + } + }, "electron-to-chromium": { "version": "1.4.397", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.397.tgz", @@ -11116,6 +16655,20 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -11201,6 +16754,36 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.4.tgz", + "integrity": "sha512-qQrPMQpPTWf8jHugLWHoGqZjApyx3OEm76dlTXobHwh/EBbavbRdjXdYi/GWr43GyN0sfpap14GPkb05NH3ROA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.16.4", + "@esbuild/android-arm64": "0.16.4", + "@esbuild/android-x64": "0.16.4", + "@esbuild/darwin-arm64": "0.16.4", + "@esbuild/darwin-x64": "0.16.4", + "@esbuild/freebsd-arm64": "0.16.4", + "@esbuild/freebsd-x64": "0.16.4", + "@esbuild/linux-arm": "0.16.4", + "@esbuild/linux-arm64": "0.16.4", + "@esbuild/linux-ia32": "0.16.4", + "@esbuild/linux-loong64": "0.16.4", + "@esbuild/linux-mips64el": "0.16.4", + "@esbuild/linux-ppc64": "0.16.4", + "@esbuild/linux-riscv64": "0.16.4", + "@esbuild/linux-s390x": "0.16.4", + "@esbuild/linux-x64": "0.16.4", + "@esbuild/netbsd-x64": "0.16.4", + "@esbuild/openbsd-x64": "0.16.4", + "@esbuild/sunos-x64": "0.16.4", + "@esbuild/win32-arm64": "0.16.4", + "@esbuild/win32-ia32": "0.16.4", + "@esbuild/win32-x64": "0.16.4" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -11662,12 +17245,25 @@ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "requires": {} }, + "eslint-plugin-simple-import-sort": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", + "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", + "dev": true, + "requires": {} + }, "eslint-plugin-turbo": { "version": "1.9.6", "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.9.6.tgz", "integrity": "sha512-xxa+gfTg3CG7wKJbkOIqdZw2eXhriORjw/55GDjJiUrNhU4vo1tA+9HDo/glTQygZ22Pj3nxYhxINFnQ/IU3lg==", "requires": {} }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -11768,6 +17364,19 @@ "strip-final-newline": "^3.0.0" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11778,6 +17387,15 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "fast-folder-size": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fast-folder-size/-/fast-folder-size-1.6.1.tgz", + "integrity": "sha512-F3tRpfkAzb7TT2JNKaJUglyuRjRa+jelQD94s9OSqkfEeytLmupCqQiD+H2KoIXGtp4pB5m4zNmv5m2Ktcr+LA==", + "dev": true, + "requires": { + "unzipper": "^0.10.11" + } + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -11893,6 +17511,17 @@ "tslib": "^2.4.0" } }, + "fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -11922,6 +17551,38 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -12121,6 +17782,73 @@ "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "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==", + "requires": { + "domhandler": "5.0.3", + "htmlparser2": "8.0.1" + }, + "dependencies": { + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + } + } + }, + "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==", + "requires": { + "domhandler": "5.0.3", + "html-dom-parser": "3.1.3", + "react-property": "2.0.0", + "style-to-js": "1.1.3" + } + }, + "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==", + "requires": { + "@selderee/plugin-htmlparser2": "^0.10.0", + "deepmerge": "^4.2.2", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.1", + "selderee": "^0.10.0" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -12155,6 +17883,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -12188,6 +17922,16 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, "internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -12198,6 +17942,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -12225,6 +17975,12 @@ "is-typed-array": "^1.1.10" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -12250,6 +18006,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12276,6 +18037,11 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12302,6 +18068,12 @@ "is-docker": "^3.0.0" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, "is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -12330,6 +18102,12 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -12385,6 +18163,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, "is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -12412,6 +18196,11 @@ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.9.tgz", "integrity": "sha512-I3FU0rkVvwhgLLEs6iITwZ/JaLXe7tQcHyzupXky8jigt1vu4KM0UOqDr963j36JRvJ835EATVIm6MnGz/i1/g==" }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==" + }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -12456,11 +18245,66 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" }, + "js-beautify": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.8.tgz", + "integrity": "sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==", + "requires": { + "config-chain": "^1.1.13", + "editorconfig": "^0.15.3", + "glob": "^8.1.0", + "nopt": "^6.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "requires": { + "abbrev": "^1.0.0" + } + } + } + }, "js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -12485,6 +18329,12 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12503,6 +18353,16 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -12512,6 +18372,14 @@ "object.assign": "^4.1.3" } }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "requires": { + "is-buffer": "^1.1.5" + } + }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -12525,6 +18393,11 @@ "language-subtag-registry": "~0.3.2" } }, + "leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==" + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -12544,6 +18417,12 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12567,6 +18446,16 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -12860,6 +18749,26 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13036,6 +18945,23 @@ "word-wrap": "^1.2.3" } }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -13052,6 +18978,12 @@ "p-limit": "^3.0.2" } }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -13065,6 +18997,27 @@ "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseley": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.11.0.tgz", + "integrity": "sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==", + "requires": { + "leac": "^0.6.0", + "peberminta": "^0.8.0" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13123,6 +19076,11 @@ "web-streams-polyfill": "^3.2.1" } }, + "peberminta": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.8.0.tgz", + "integrity": "sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==" + }, "perfect-freehand": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", @@ -13158,6 +19116,23 @@ "source-map-js": "^1.0.2" } }, + "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==", + "requires": { + "balanced-match": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "extend": "^3.0.1" + }, + "dependencies": { + "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==" + } + } + }, "postcss-import": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", @@ -13254,11 +19229,33 @@ "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==", "requires": {} }, + "pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", + "requires": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-format": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" }, + "prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "requires": {} + }, "prisma": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", @@ -13267,6 +19264,12 @@ "@prisma/engines": "4.14.0" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -13282,6 +19285,16 @@ "react-is": "^16.13.1" } }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -13300,6 +19313,11 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "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==" + }, "railroad-diagrams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", @@ -13367,6 +19385,112 @@ "prop-types": "^15.8.1" } }, + "react-email": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-1.9.4.tgz", + "integrity": "sha512-DNUQb7xzAlMga2ZppG57bnWhJnqOEcTYzxNvLA4IVCiYJkgPNVukFMOZVG2OuQ0W8ddiF6bLZBKDZHnnIenbpw==", + "dev": true, + "requires": { + "@commander-js/extra-typings": "9.4.1", + "@manypkg/find-root": "2.1.0", + "@octokit/rest": "19.0.7", + "@react-email/render": "0.0.6", + "chokidar": "3.5.3", + "commander": "9.4.1", + "detect-package-manager": "2.0.1", + "esbuild": "0.16.4", + "fs-extra": "11.1.0", + "glob": "8.0.3", + "log-symbols": "4.1.0", + "normalize-path": "3.0.0", + "ora": "5.4.1", + "read-pkg": "5.2.0", + "shelljs": "0.8.5", + "tree-node-cli": "1.6.0" + }, + "dependencies": { + "@commander-js/extra-typings": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-9.4.1.tgz", + "integrity": "sha512-v0BqORYamk1koxDon6femDGLWSL7P78vYTyOU5nFaALnmNALL+ktgdHvWbxzzBBJIKS7kv3XvM/DqNwiLcgFTA==", + "dev": true, + "requires": {} + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", + "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", + "dev": true + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "react-email-client": { + "version": "file:packages/email/.react-email", + "requires": { + "@documenso/tailwind-config": "*", + "@documenso/tsconfig": "*", + "@documenso/ui": "*", + "@radix-ui/colors": "0.1.8", + "@radix-ui/react-collapsible": "1.0.1", + "@radix-ui/react-popover": "1.0.2", + "@radix-ui/react-slot": "1.0.1", + "@radix-ui/react-toggle-group": "1.0.1", + "@radix-ui/react-tooltip": "1.0.2", + "@react-email/components": "^0.0.7", + "@react-email/render": "0.0.7", + "@types/classnames": "2.3.1", + "@types/node": "18.11.9", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", + "autoprefixer": "10.4.13", + "classnames": "2.3.2", + "eslint": "8.36.0", + "eslint-config-next": "13.2.4", + "eslint-config-prettier": "8.7.0", + "eslint-plugin-simple-import-sort": "10.0.0", + "eslint-plugin-unused-imports": "2.0.0", + "framer-motion": "8.4.6", + "next": "13.2.4", + "postcss": "8.4.19", + "prettier": "2.8.4", + "prism-react-renderer": "1.3.5", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.2.4", + "typescript": "4.9.3" + } + }, "react-hook-form": { "version": "7.43.9", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.9.tgz", @@ -13399,6 +19523,11 @@ "tiny-warning": "^1.0.0" } }, + "react-property": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.0.tgz", + "integrity": "sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==" + }, "react-remove-scroll": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", @@ -13469,6 +19598,46 @@ "pify": "^2.3.0" } }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-yaml-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", + "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.5", + "js-yaml": "^3.6.1", + "pify": "^4.0.1", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -13487,6 +19656,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -13527,6 +19705,33 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -13643,10 +19848,18 @@ "loose-envify": "^1.1.0" } }, + "selderee": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.10.0.tgz", + "integrity": "sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==", + "requires": { + "parseley": "^0.11.0" + } + }, "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "requires": { "lru-cache": "^6.0.0" } @@ -13656,6 +19869,12 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -13674,6 +19893,17 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -13684,6 +19914,11 @@ "object-inspect": "^1.9.0" } }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -13731,6 +19966,38 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -13872,6 +20139,22 @@ "qs": "^6.11.0" } }, + "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==", + "requires": { + "style-to-object": "0.4.1" + } + }, + "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==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, "styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -14107,6 +20390,31 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "tree-node-cli": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tree-node-cli/-/tree-node-cli-1.6.0.tgz", + "integrity": "sha512-M8um5Lbl76rWU5aC8oOeEhruiCM29lFCKnwpxrwMjpRicHXJx+bb9Cak11G3zYLrMb6Glsrhnn90rHIzDJrjvg==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "fast-folder-size": "1.6.1", + "pretty-bytes": "^5.6.0" + }, + "dependencies": { + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + } + } + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -14199,6 +20507,103 @@ "dev": true, "optional": true }, + "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==", + "requires": { + "postcss": "8.4.21", + "postcss-css-variables": "0.18.0", + "tailwindcss": "3.2.7" + }, + "dependencies": { + "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==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "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==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "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==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "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==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "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==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "tailwindcss": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "requires": { + "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" + } + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14238,6 +20643,18 @@ "which-boxed-primitive": "^1.0.2" } }, + "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==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -14248,6 +20665,62 @@ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" }, + "unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -14309,6 +20782,25 @@ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -14395,6 +20887,11 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -14414,6 +20911,30 @@ "version": "3.21.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" + }, + "@next/swc-android-arm-eabi": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz", + "integrity": "sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz", + "integrity": "sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz", + "integrity": "sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz", + "integrity": "sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==", + "optional": true } } } diff --git a/package.json b/package.json index 428819000..74a71ab20 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "packageManager": "npm@8.19.2", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "packages/email/.react-email" ] } diff --git a/packages/email/.gitignore b/packages/email/.gitignore new file mode 100644 index 000000000..13141bd9b --- /dev/null +++ b/packages/email/.gitignore @@ -0,0 +1 @@ +.react-email/ diff --git a/packages/email/ambient.d.ts b/packages/email/ambient.d.ts new file mode 100644 index 000000000..54b8c1d7c --- /dev/null +++ b/packages/email/ambient.d.ts @@ -0,0 +1 @@ +declare module '@documenso/tailwind-config'; diff --git a/packages/email/index.ts b/packages/email/index.ts new file mode 100644 index 000000000..40a09d7f9 --- /dev/null +++ b/packages/email/index.ts @@ -0,0 +1 @@ +export { render, renderAsync } from '@react-email/components'; diff --git a/packages/email/package.json b/packages/email/package.json new file mode 100644 index 000000000..6697c04b2 --- /dev/null +++ b/packages/email/package.json @@ -0,0 +1,22 @@ +{ + "name": "@documenso/email", + "version": "1.0.0", + "main": "./index.ts", + "types": "./index.ts", + "license": "MIT", + "files": [ + "templates/" + ], + "scripts": { + "dev": "email dev --port 3002 --dir templates" + }, + "dependencies": { + "@documenso/tsconfig": "*", + "@documenso/tailwind-config": "*", + "@documenso/ui": "*", + "@react-email/components": "^0.0.7" + }, + "devDependencies": { + "react-email": "^1.9.4" + } +} diff --git a/packages/email/static/clock.png b/packages/email/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=@W5L-IEDgI7y)r_|L3kNgB#S?8k7T{G^6e4%63s& zF*5;k5w8^m@kE<|`4&83Ij;hiy5H%F&<;=v+pbfbR=s7uOf0Bb!2**Uwt|kXI zZ4YgJxZOa+jf`Y;+)8CNuW!gjKs<&==5Rt|d}{EnbNOViNRLfqtO2U6N#7c_j}yE(%mU~s2axRyIUTq{8q{>xk$)FK!%?84Sn?KoT9j2sXcl^d)zQw@>V8y zgoX?VqsZ#%(claBa=7$#jv*|6%MF7i`uMKpmU`$o`;Y+>HDL3@oh?B0#EXdAPj0;S z;0%#w5=yI`$3MKhpZ0tz0ljfPIutK1fbe~!kw9_6O4=xtY686=M*ykbq6p96wy-Hm z*Njrny~CC@LbVbQtG;aazI!F|V8L)H>TYnrC0wcpRo5D@i6+qV`qAIgHS+dXpU!#C zo)tVgRHEpJg0%4-Kc-RPsx&Hy8W5UD9%sq!7gcx$w+&HABSX!m1qlM!Ug#xF;a-1{ z?A`{q8|;Xtpm1IC1qlKI*J+8iuVCh>=RCk_u0Ym;6NeKuqeu`yA?+{1!~T=&ulC@a zzzI+G$hisjZf+*e4S}7XILo6f44fmd7D&E;Wg9nx>hPbyL{0gXjxFRY4G;hPc^xC; z@i9_Fmv_ETz1=pD432sx4trnj8v?1#vhXfa|KB<=M{o>cjM?E7TbyR2P&}Rv=Rhy| z6XSvr8Ap8p3Tf*(tAEPeV;ORS)9S*>5gGN^0|^3<(pWGjq)xmH`~x|mK}nihAHC-k z97PE?Lj|L`sDG;PoNuUBb|5E|-1geAtOF-l?LyrMfpNE5^RXjShY4+t=z3nKuP65lmU!dVGFjsXGvCF&wTiy&5q z#UzmM`)4V3JhBZ4;15ePC`zi;VM^p6p%k@8g<|Ioe`kCc^v7>j%3OmP zkb#8qY+i2rNN_Y73Zoc1+w3(nQb;J(;fa|ol|ldsD~65_-`#4$j9?P9F{}L<8kfD4 zDZEFKs3ogC(#a$F05=K`0_`N$0w_jk(oY*^#G{|y9MI1J%mE>X;R1}Vw1@wXW`yE= znjokpp}5G9)SqP=*EnG=p#Mmov!|685xwL|QvJEoZ2Vk;09!)wTxkJ{>x8}=gbDLY zt_xTaif~S}z`CSInXSw#L%g_P(Sohb*t;$!deiXa9D}P@$oYv$Rgr)cE#RSYe-TX~ zu2+n!Mv~yt9cyj?EU+#yarK4kJc9*8@QK?buV$w$=~)S2EzoGh5SBANJzHB0oVI06 zy2gc+Y0svn#Nyn#tqv#7)t@~HlS+6d)hK4F5_|Ce_MxpXQYqMTg7AKpimW0L+kC9{ za?f+n^Z3VCE0f-nsY=WV!&Qqvh|M8zoFi|F#L2Yaktq1&9)U%8f*(~XnQ{@C3nequ z<`q`KZ9~5@JtdvS$Th>vRVtf_1kNca*e-H8Jx57??&)>zV(HU5oaY&KgT$K~kXDwb zU0jXJ^t4&dvKN7E-nksE<}K5mx?Da(&F(N_GPqn`q3Vopj^ZAM&)?KeLetQkv*%2X zfmY@X7;)L&o2kO|88=MaY8s`#&J7d8U~N!JtqbL8rJ%^l^g;+=uy0UN*UPojBPYrz z$uE4{9D@@QTx?b3wmDAJ6uk-K^xfrwwW1n^jYzAO26YWHY@Fm?rdIjn0N+9c9rwH9 z_X>`D59W;i=BW4&VvQGNwL+g(Y>%bQR2R5Fx%eNk{HodmS~Up(0000fd#V51=ukr*ajJ}z%~zC*hJV4IR3*B5)v6vMTFNt zOo_xP%2WhajG=f`Ku#!Pk#eOXh1Ebp%DUF~WgGtxe0=FXf>|N8c? z@7Leyb00HzW>@z8YVMp@pFVxg`JM0G-PT-0a?V+~ZLM{3Kepw1>6k2|>tT7hJ*7*B zthq=eK~Vya+*bmareS3ySk08C1d@QkI)Cz5X@6;3uN(1kwbfZ_$CS2)F6sl9VzWhj z#$v;Pu^w)z%MKIaQ<^MY6!4Wmq4YbH8CZt`itFtP=Y@6dD_vgfck!H3d)U_OdQw%G z0&`3( ze2{h8Cc3o6+GbqDB|nC-IEvt2Zj`dI&0$lWqd8{rn5TL@s=z46MzQd9*|u}+h^oiM z;@}zQlZw3j$_L%VI5(*bf$Y2pyufWf^q~)><7Na>z~lLb^>90uO{+Xd9v5w3J2L>b z0B;=bm$+uz{i*$y9JvjYqF}2^!)57Ls%uM00#E-+$K`o)8P|>8$NdB91o#42xNrad z{ndarm5x{9r}xVxlz;OV7fvT%m21yeD~$SWh+RSq^&c`g!sCE$3&?x9xom+umwQ z54`j>kmOe?zZ7zu!b2^(Po(}PzGAV<8UIpCTt(||)X4%#&IOJ|u7&-Pk|_P;CqGG$ zvmCGC2xe7h#d6}3=7S&nAUS7tUvZ!0o19d+WUqxc=C`w)ZlqZ0Q_xF-Tv0NW-za_}l`h{j<^X+ec zdq)ES`|#uW0GZrYKn>^lxV{Z@xbqJ@ z9EUi@HpC{jZ@TFw>j4yGhd-zC`?LB{9(DO&*#5h}`#Z}rIQP*bke_uOOO|Ni$o02FP;HBbhi1|SGhfCbwCpXY}70PqXf1Sr{7+$gs}C=Wo#<4MPi zA66(EpH;f=2x#b^3Fv&he4eOBJe!jHCj()jj#e7g!!QYId;vC(E)a?OymVu>@9=dB zSjDeL8V7tKr5A&J;8Y$M07C*n+-CrS-~7%0@Vaf=x4&hrUVFn#r*lQURv$5yU8s!x z?AqGu!6%=5eBRf!aN~_PS^(4oGh8DYH34M4-UQI+o_o&TdFP!qL5U^K0awEHNB|Uo z8IObOB%oo5dche9JRXmnn%psaF7bG%3m+KP<8yG_*3VHqt5E@yfzJ-`8=5Vk8T?an z-xN4r7V;8EOB_)GPyiMWr{cpA94&FlD1s8qkNe5kd5xs?YO4x#Kc(*=5`KQmRXmqy5?J7cC-28Kl$^8x?Vfz4?f~tec-}{ z<-_;ifB(VDFTWf>?mYSAlg_WZ2(kb?v;*7?VDz9s8>}y9Q4XBZA4Z!3Czad{gmnP# znP;9!FFK0+@ZkW+{NUns$fcd+>R69}C-AKiK1})C3X(#rJKQJ1YWWeGf|xFOJmUMA z7%*FvQmMBUIHDQ0O_C1=Iu;%@9ws;$^(s7gh#+t{Y~vV~csM9a@rjp>^`H5f_dRgM z?#o}d`-)wzuIq44RaI$SlLw=zy--?SUbZWKeQm8aE6d9V{W)Lp?Bv09ShaWoV z+q$@Y`*!yo-|-#h;fEhKZ+`Qe37(1|1t4+!nrp6cXcIu|k2`>k+h`|11y1+C0}lj1 zf%Af!Vja(b+!5OpczEn^?bM6eQ;@M<DQ z``7Ni`|bcFf)n)8m%bGDQ+sY2I3q+nj$s|g0akKWf|DGa_lW!Daqg4%&V6`302po% zI;;MG$(% z9%~P#z)8Vb0a`9mR<8T{lAaeoRB~7BufTEnA(xg?C$uU{N53~sqkO<^I%DbC7OxQ- z)ZiXQaJUw3LbgrUK+)PGxTvs4UC8iD2iWjXWuuNBJ!&Oq!4f*wU;gF&Z`reV&nG?S zD?W^24{2E00iwr??5+o<2crik017U-=7G58xugf{!L`~Q`t6V0eZX7NcHh2z_LZ-E zr8|4}tbP3P$IZ5F+rqN~Sh2l(_wE3yrKKes0hHQ=4@|d@;+~xK%$YMapCg|io~8fQ zbP3^D6wxIPnDob}JC-bCQ+Q6YtQn1|HlK0YS3xsl z6^2$b_6@R*3p#wO4yYu{&<{EmZeVLBLt??fOrl=LB`qZ^BZmw1969o}cXwvy{?o2q zm+jfL^D>A!vr#I2Vb)%X07P5Un%HiBJZSzfnDqd`^~T{Fyv};V`SVL}{o_CRvv(~n zoP6)k|NPG%GSNDY(j?Qfc_IwIXq@z$t(c98LQOK7tZ*UE(&QBuEoX@>dgYVnTZ2(N z9~u-1P5h#GV}}ks^`oLlLr1zsvYSfat7hMVMb-9$!+KVK) zenctIwz)Y26=cuuD_*yI&y^2&jus>gbY>Ve03k(iTm~^KtYRmvX1s4EUbx(?7M8Z3 zT#~72v8`6)sKoWMXVt4j%M`Uk)Nd;gX?Gjv4h-YG?AsPpli#;8l!SKxdD^`17cmBcS- zMxSVe@t`V7AfOe?IHdoo%=R6#|LXExJ2nA$rG4&s2f#c7Dt=Hw_HGoAz4LeO+-}aF zzwisMdey6b;{zY~z@oRP;T$(`55YC$sfLFE4s*I`gmFk_LXSjkn<3HOZRA!n#c$%2 z&Xp4tN?wMlAgdeJj8o=0*JIeLO+f@3DV`~k*MD!@x6gU- zy!>6Tm|-2$jlX z7pKLp^eLgi$DTg9`j4)Dq1g=jdJwxCp+1uw>=E(Chgn#B&aBn-Vehm&?BCb{zkCEC z#oKTH$>1!9?~ra9>Cl!@7LYVh5H!$+hb{OGO^Xdxa=2K2JVw!*{CLnCs7HX6 zn=PYnEZ~9ot)f@H^VM=1sN_Hi8OAx!<&^KaRoXKni^#!u<|N3YDt-BfEbI&6m-^C{H_cQ0t z=HQDV#lCONZ^zXXH1J%~`S`X4mqe_4#Yb}LwR+wkeZ;T-(Y_mA@>#rZ&k<|W_x1KF z>ElClKO?Ur$|puQQ@RN&a`UuhDZT(F6xK~4S8kh`(&(gtrx^|2@9a#+`k(V6J00_! z@)h0H)mL~u^4(8;?dkt<{_OI<@m%l_j?p-X8QTP;ZM&{e?eY(S2jx#V6+@wD^5U zehG{znoXe%yCJ?YNpd~g5?!!;hjBP$`j(7~=hBJoe8k|byDs1U*YM@y7#NW4a{+5J z=Xr9el&+h*T6j=3EVF9BL-ua z1AeYi{u_aomY3bhQ)gVa+jZV;QhN&)RxF-H?YFV7@vKNi zz;nJWRm5B&=G;Hn&=S+*RK9>lxvvj(vL9zHsZ+Kk!@H$2^~k(e#XF-#hPsokH`6y@ zowA10F4>-{&?sp-hkx{FOM?T1u*{}ex!E*ZSVr zGRHHyTOxLJ7mS`SQL)}kNu-aDA{}y`LFd?Cz+E&4b4ir8p&_z3ayrTNgm##&+vI=+ z&RWnTFAZvjvcg_h4y8(q)C{Q@ou`f-eR7^#lIPd{U3Xa}wWssePMC!@4I> zlxkhBExe|~STjj-n*0@J?P^V_k|(euxJP;D=}uOQ zR4ODbvYTUxmY2K1`8hV}7b!)<27tU#nvAF|vF*{Rs;t>@+4dF?_AAvo7NZ?jC3f;HG6$5dje@nS!Jv~z8tNDRt<}NOJs__` z-4FjDf(yfPWDzvk4p544Sljqwl3$PerAM2x9?^|KoNrxBYSfc@UBXN=Bss#VEx+}W zEBw}7Q^|R$Dr^_=xq*S@pacVK+B^-)mTm#Lf=k_co+1}gFD9Nkj*bAVwCRwp(5tPH zSfIl%WTDc>CxAys^VTRkZIsYs^WQ}VWeJSyR~T|Y4y%XBqZGA*1L};H2A5Oo;o_^^ zu8&A8AELAqhGq!0$w4hstNY0**|?6$$!waGl*A~UvqnYFwq=CllBV)UNbi$bS5>A^ z)rd3cyX;=_|6t_l*LII9Jmk;|_yqMp&Z{NWfPzWc+I6sGf%W^$M7tE|~ z$$_=f5Ktb?Ut>%*{$8d`f|yQ)tQOPO@{P!{iB=-(GdXum>+7t_Oom&QM0OicVRT4W zP$=tg8&yNkqodh1L#f)wSG+uQ%(d0k2jl2mVIST-)9j^cCeo@BcXckoClmQIO8(29 z>fr>8P(bq}MmWN8rq6S{x;EPGt+J&H%j3BrZ0pA4DZBe|uI1KUBKLx|oDla{vYhKR zv8p;|W@aWkDe?%6tYy)Qt?E?BP&S>;jA3_)PNzdLto5r0hi%a7NOQOhyz6SuB7V3C+z|NhQnNg_(Qe_PF zmSzwvY2uqrqhTLYeptRMRj%!bR{z`T7ocRjFvJ^&d9!9YyhpfY{Lgj(NWb3k;1sTq zRIhFJKnwNwTIT^g$@ye2w-{o}IH2T+MXsxTK~984#0fTD(8^&KVDUiYg7f{=|NLJQ zNhTcxzCP>D&S0suXkxDShQh~W#3ySuPN_cE4lr5P6x%*%Phn@vWmY_gT3me2%+1aO zG!6h)An)o3-7O))v7DWqQ4h06r%o@LQzuWo@ms#-n+|~4Ag0d&Jk`(}PDMB}uBV;e znQkCCpKPeq^JHQHC{8ahu}o$SKF#&|FL0RHvyIi~2dB)-4U)`SOr!Ui248%!X=(CP z`k$^pwr$&-*)}(;Yquv(oc6ljLs$LQZ~fL8>|iP##IL8?=3Fa@aaV}vN=hAwdJmx2 z!zgY$hQ;VOq=HFyD|@(aHl>#rf!AxG=`Xq7Kf`Djg>;>%+Iw}XnC>LWHnV$;gjL@| zlnaqv5%x78NRUExT-9o7E>c`AVHJ zC0$ZDdHc_7)@fYO zEoY38V*tg=G;;`Afny6#QH;|PTrJS|X#ET#u=7!Wx#*MoYq8ITpX1Ms@r&owVp;yx zV(EWtz5Q$4A4OTe&2`q^LH9Q! zAgs2$S|0%LL?7+U($)3!t4@7@cr3g58B=ITJkjt(&VdFJ;kER+4+7v=SuLd(a|vX# zY(&JCX#4hUW^QgW!^!nISMO25mpAKufOE66DY9YW`&?aJvup7Kz&I^Zedt-d{V9i8 zeHhoJd+sp38ZoOS&Ai0OM*La9{W2<9yH(+4GMTSNtjrQhq4VMA_qB3RI4DP_A+Ndr ziH}8A{frq8P;SU?Tw3uTW0Nbd``Zdc!^8D^iHT#@f+GU(NX6Q$f7TX2g6VPIjH#FXo@in$!>J6=^1xO7hsLq*5Wv)9jDY&u2wa z;YOKDBvnlt&@ygVIBy7P0P<^-%W#;M%*HNd-U_}&*xc5k4_pM@w!EIBO4ai<+**V(4-nnmP%zN zO6&dXm2%#zEBzb23RC8a>j7k|vR^2b-*&uGG;Wf2sqsxVMw7^Ej>lwLRovgOI8Dy& zvIs|arRxjUhvPgUA(BO%5C7DN1z8+dF|;BFOxCW=^Sx4IWCx;nu{7lposENHyX&X% z#cO_Q;e6M+F}Nzz-kSA-GLuibL}nD&4E;TBn7CUwt}z(%_Zsh2a3Hx~ckW3|LRf8e zwfi83*`>h|r{hXhifOm9DQbn8n}FZY`J5|G@R9UAR2ao?I00bfkQr(&ha#=p^{@f# z4XiW$Y+q5@z{S>AgEa*oc#AF>4`z;VbzG6q`JCEsq#ownz;RogcP^XmGA2cQI3$or z=W^8jojNy3PFmwF+%`~3ED!)pk|xfBYlStF#4h7|gVL!$$ZA<$8gA{n^pNGvD4yV) zP^hFZoJ2Q9&5OkAb)_=vtl78QTcTxIu4KHEO`$}#y=P?u0Bz!gec)ILvIfBV_f+gU znK%~+z16<_<^MNNV*~qQfFWyXDWaitPFplQgmt8U*)cgLha9T~ze$YM(l&;OJm%d4 zz2A^=S~imgj}g;rTWV+ctrdT(V!65+e{y|w@cvYncwW7+S{9tQro(tGrLkIEZ~T>7 zj?EI+xufR#SHE`r4Bjn%{(aBlUGv>@tQOY;S!IL(a0*MNg>>(=9#4tx78TjZMl6UK zEfX25WfWT@lOmbe={J$OayfK1nYlaKmHghdo9d=jWw_V%k4od+DyFCvMBN_K-bTJ# z;qQy>X!ay?eJ@A2Ji}@{hg~J;W~0kZj>#uDtsBI3NvYp1+wFvm;cV6nvF-1V$IPKJ zXn1V!t+qeietU8)#}>}*H(fQy#yF;P;Bb>x8X+;0T~C(D+o(0O43uIem1_aE zzAoOGNS}|_@1@j>G<$2yU1u%w0ex9?5D#+;%XxoAZ^keruIwyM&_y)6K>%#z^O-&X z)2)g*Tdf=jJoecQ*{vJN=W_+tCw+}+oH_Z-nYVq@H(mQF>U=SOFB}*BG}<)Rfez-- zE~^IYbIRN%=}G?35PG~PPQzZl6h$SgQCW_S6W!q9FkEYF*i7v9nlW0TKA7AfPi2IK zZf)PlYWKzGlkag#1X;%Q!>HN*6(1Ho@55?Xr<;WoJBugZo}3;-$agnP=SvErZnRUG zF64SDhtI~;YO|4K(x!N_jboZyIBlHfhx_~0zMi$1pH?QDS(B^C(omtGsz z>26`?ArR1yv05-r%P=Q1g4k{#+bE$XKR%4>40u1HfZEqWgGF)#LlKaZ2jI+1r>IX3 zB7P9c(9r5tP(5lr4}eFRO;4|J@%48 ztUHALa%>h9qsUEHi|+?Oq+MVNrcsGzoa(<3D|DivTn}PbO!k*XCLJ^x%+Rcs#7ffb znB0oc=HBSk)~NM@au|OexdvCNrOZy5U)br4dbK9tvKF|;I4+s^#WD;6*u?Vde*J|tbX(y$!9K{U)7TqkX` zw#f+JJ`i{8*luPVG9b=m^Kc;#qU-=!rM}^iSV*fSeB`tX<75 zq{GlC+_XNpY}h)i{cK(=0U7BHT!etlA!jocbBF9zf@2_&64~ z1e#T8RAQL4wgI9H#%1}^mmZ#voG%0u2)t-yr2I~{%k<4NC#0nt#QB)jVpL(uKC35p z)=>{MaNSuglUB+kX(iny!_16IB>;|J%Wwb=1Gjb;IoEQwx`4348-Bi$-pA!icWvSB zyYF5o4FDCBNb?rhES1VS5#Jrk`9x!_)crs*J9WPpnUrM!yrre3cDY^+>tD2)2oz*( znM?K#j$Vye%AY(oE)C<7*4T!>F;8~r{e;qGC0CQt4(;dDhD^7M81QNct4TwWL*U9O z5VXXku`#M~lv%r0#RQGg{$&Ruq*HOcmYZ(6sr3R#(_UIyZaJEdv}89ZE;mNak02z` z*ggkw>#)3C+lE#9TDCDJi><6O!=&$1ye0>++8ZXL<1Lh!q-+%jlm@20vRy@3ErO5E zWey62eRQw%uJ7nzb|%NlXtCW`2@Q|fuJSo-fK02x*MSt9kN(c@7S9PoxbE0qJmv<3 z)h;!1tte9Evcs;mj4hRraB$82joJb;cd@?S`-e~Ug8$ef!a{GhojbNC-Zf^uq#_u^q3W&g?TZIY6si}FQ!tk$E>Hse9?#6X2LrN7>YW#0zqbXI5lqC23 zBW5O*r|VLwU;|RDQhHS>)oPS9E5CjI!je1o^fO@!tW&2K+-dyIEV{Gj&WF@0nO3FJ zsM0!8vi{*8zWkm3{m#Z87*v|_jHz|Rg%h}Ot}%b#Ku*#aE<=c38yiJmPWXY#$=>Sz z>!_}}>Z*x!9KSSq-e4l5&SJ2=J*FRrHH|o}ZRnj%{gGOTD%K-c*mi7-%^Fw5>v4!& z*GwMfB|`$~U3dL5Q>k2>);0|QE_wI&XSCK-$?aV2zW$8-l+ zrw0Q%pUUA&eKwrZg`GG9!?lfvCYMWv7t+&G~l2spk2~w6>g@F7{P_lMSU(d_qEwODP znKbzT!IE#h@y2xl&ut)P`}Ic3W0BTe0cb>8$xz8)EkrN=lsN2PB5sGU8nTyH*ABk+ zwXb#e-g|Fgo^gW5S`UpUuc3iADiD*{H6{&>mdxG#{gLP!z0-}*I==9QFHAY#CXm(< zrA}$(&-S^hjiZkC&hL%6$4CeFWtZrSO>eZ+W_fw}0Aspw%663q$m4xqTkP` z9I$AWNKR;*vLcO8${C2@WPaeU4=j(9&*ui@@J(ra!t=!7klwO27z%?12H&kPG_v!g zkN4!s1@q-EAG+~pfA;pn?5nG@m$6jCV(5BC7Qw|43nVLcJx5|FBSs$&+Z+shl##0R zgPPK0$EX?MOjfIbVpTAD|~WHE(pEV5LSb+!5mF?5R=nffkR2ha%6MT zZ8P%A9W?P@AUR4^jO`i8`5t@hu@q(-nb^!JZ32}6$6jkjxI&~DW^XlcJs6RAuN)MJ zY4acvPD}1MC(`c5;(S@N`wDGVNt{S(bWQymM(`+F(!-SW|DGLgQHS~ov0uz_xC1qOWY5K7~uft!|%+QGvlGhmE7}F zniR=*s9hkkoOHP$8DaUt^1&ycd@@Yrh)i`#G|Bl2=h|^WN2*#xt_-UsHY-!App1g^ z;RiioBQ&*iCrh>;A`L1PlS?^zl{gkw@xv6V$B%z)9-fOgzxmDKfaHFl{rRLWX_d^$ z4TP_ms{b_i;HE*8??XAhLOiOonJ09J<4J9J6;ymk8<6sX$T}bGfS|q}^j&7Pwj9 zPK%r`Boxr#K3O+UB6jbmt}YsboEV-ljJ!`X_@ z2!;oY4tm1D{YDugO{NH${DGJ$ZJY)Tk*41<2_pCD6Q>^h^$*>33sfiu4&X|oKUWwW zI_#Qk0Am^*lZMhv+X1psgj3=d9SP&{<#il3gLn0|a$iAC!K2qdDPZ-tOodRtu zsF}N`0q2B2cWDW;A*~$-1EH161Yu^b)8nCZNF#8vE`uZM!=Wu0)0gRq=;y;az7Uw_ zW<+w+RH`i@Hz2cExLg8tePrYO(n^@#3LwKfg}xV=j^R8T+RA0sW}W&TC^?x0g0qZS z*Mb=K*+rvAPb^SvoN~fVpyq5pG6EsF6$oLqfB4cP!Oh~G%V8gTsbL+!gVf_MuXel+ zLz-r^rAu)u8!N3{ie0QD1_)o@;^JcUpRKpdrmjziL-I&KL;+}z+ zXmF&10H9_<(iJDR*YzqJ6aTSJaTDPaZKp{VFz)b#f`K8usA;;fs(NuF&^}`TB}XZ^{WbjR-dO;V4O+-azAP zA#<71tJE0`DwpJ>lIv}h1E#sxWF?U=XI=23*ya2ip(SWEe0;+q9B8+`e>>%Tn?`tN za>8dl(>Q2#bv1yGeRSpd(DP*SsB*WY{Jo7@yp^cLYDY7O!y-u0i=Z>zETb44Q+@B^ zkW{I36l=xnd$qBLIgv9bbB^65N#Kq zWp&%OZBukzLZtn0E+4`yaINK)uIVl>&m*dVcL*yNsZ=yH#M~-L=Zn%&t{W{i$Dv9# zFmgLfUkBQ&Eb=Q4AnyZn`O$;?mlcQzVT_Q)6Ru zNjreG&kz1Rq*1|8g!BUNIP?k1#4eJlE|8Rp8?kUDRYDmpqL>#4*YjUViucJ*CWEFz zm>L^fPtu_rx1}c|WU{#0&2tt}5u>MC#aO-Wgp_5-Y?P$f)dAy_8Xc#*r|7LX9TNRR z{55_pf@%gyFnmYh2v4z1Lvz1*K4>|Hp&4j+dh^@SeK&` z(E@_21-?G?@r09dtPVs|>}@jjUxn;Ql#Yh5+KNB8dWdco?5FQGhEN+>N)a1!^xBR4 z`AQYZkj(x#0CePj46lXGL;foX=Z})rGNr90s|NeTGJ-LTz5LH^yDcP;f`Q0BIC{DR z`gyJB^``Ry)=P3^(nhWp_mTTyY(5wrCW>TmJoMohXSj?hN;jMG`F5q7r8n=I#e^}R z1H(Xc3dy4oy)lQcQJaWxBp};731!^?lp_{|3uxyg{e0-T#;g{wXj(>~w(#22*0>nd zGzcU>R#sO0JFX979X>u9j*w__vKOY$TifVL+o*HBRLRPu2iurD{qDZ|?sNDtu>c*4 z*@38C=bNH$tI68RIW<0?oM{prhE~_=gYZy@(Fp=EfB>(C^v_TlM#;$d?&QQS-7VTo zCt*-<$@$pF6a6>L$TStYTS+d@!3$tnUhdkJZub#*D0F{oJuZvjdL)^0HyN=TYAtu2 zOtD=U9AwLMGK2Fy@x&AL=&{`?C){k(PGx-zQ<^??=n2lPmicQ%kF~Uq+*2?m?ss;B zoKIRqDQ&^!<60otT!9tC*dS~6Mn(WG^oFx%&)QG?!5=T_;WA1NW;=~;Y#MR6j4LkR zk#&ES&;01IlM6regWq>G)?sj5bImmv_zA|O_3t;mFt6hWcZ+Kdozm!tv|f@TlWA31 zC)~@tmONSze4o3hG4Fng&R|B2zsi&T*$~T@b zr?gd+kFV%NCNpyQR+hR4_U+pj#@C^x%QTk`NC9w|C3y~XLEk*arB*kx*SfE%f{Y5Ec_;*$_3yE3i(T!%K%caCf zWY~3L0Bj45*(mP=cLTTM$fO*3{{8QNf13WPjq~+5XREhe{ia#ZlcBz2S?cmD%U$%< zJqX~z$A=}emtjDX^Fg86IuxTHVi+STT7|Mq_$WG8e!f5iBSFUo;j4&Va5D~}x^)>EN$1cLkC-W^9Fta7Ru_KtSATT@epwhC*atTY zLTePY`}1k+^{7;K($AY&EtykUTrdC-;FF!k@k1B}UkzL?W<;`Cmc%IBuu1v>0$N)v*2eZ<8fO*MYazZZY( zAVw2|amZ9E*$q~V%@URocuChI=bNat>+;@ek`f@vju~DP^RF2s7=#<_*7u*kuw=$1 zf>8dG?H<9p=Xx@2Dlrnyx53d0S^@+UeLy<4t3z#>E=baWXPE3C_`tt>YU#qc-#B?{ z!At^xgGd9j&nd?TrGA>vM=&C?@!Z*SX4lTk!nQWj_Pdsxbe2H5{eNGu4 z{D@XZpT(P29r02IAwadbc-EXb{jAx$=L*;9R9OlX)-edA*Y`p|5dZ!AzyEvt zvX{Ng!PNH(u)X1i8-mGy?X}m2%KzqX{>EN&%{5^i`DaW6I(qbIu%?e4JC-%3+wE4q z-ukOw{i?nC>Z{H1v6swyJycHd;0Y0 z)Q&&>(?5Ut3tq72+MTV3O+}JJR`592V>?n= z*YEV>Tt3)O(#_TJ{tFUm^C_m=UByH%pOeo8*(}oVz|a{GZejOBml^v6<{S{1OrAqKw$5T`FeoWJ9qA^KmF-XTjY{~4jnpVZoc{E+Jg!S zspcgwd5N2wo2!}l=t1YO4nTT9I6ZltuX~Nx0>EZxXVaIAx+2gVfcfGVzZgpg-~pt( zXY9wh*pF?jV~O+pu}~kD?|IMdU;L3Dx%K{^yzR&T{afF1>#euG>5bq1@&EFB*M9lX z;ak6U?D#JqJ$B+A|NGprW6vy}KD}rbpFN8SR)Sd6VJ`V-IdpC5SqrdQaqr>P#BHnV z;(AmSLNo#+QmxeW{Oz~jzQ*J9UO;uido-dlzT>zrd*+iCzjnmR13RYf$0esgB_Zz1 zBvZ~@2tp?#nE9U5g;5W@o>+N~6>iJ}#bO=Y5P*EmYhGhL7j)o^emiv0BnQQk$2=%3 zKiF!39w#()=HL?6J@`a87bmO`ZcLt_d-8`0!zieLOBXD!3(H1~@1=B*wLS z!3$mhE*ZcAj(N{L_ujmB@1E;+U2(;?cRDk#=v4N)?c28941LUhAc0fP%+9#V=KW%= zNO#u&1W9QiI9!AK$>X3CCr+D#2mjC2KlgJ#x43)v?ix}=PV6U#J1)#19;=(o@EDrp zhy_XfMy0c1^~!)VrpABCvfQR}4K9uuy1@43wgL45of2@W$$G+>YzurlX>OY839{aJ4 zW14GvP}Sgk_(iT5xTvpV&0k~9-%pM606>U+0MEB2aL>iX#rlpr{`Dj8dCyPZ|C4Y3 z@elvlTYvZ+|K!!*`Q3l<7oYscU-`=6TaO(-e&^SY9>3?<(G#CP_VhE0r%o@JXP-M~ z;2&LDTFHRr#P}-Q7F^HBeSB|y>%X@Rqi?0#{iBb6{NoD%9*hj6!g+4TNnRS<&WVvn zOCP}`$rf%zDxOx93)>L63_2U32kMHEZ0b2)c&Q$IRZLo}IBf!e$qX3)@~W$@s=QbZ zU?!(yUFXi7s{l?Y%;=`c{nQ`91p!8^V?WB`e4H0KXxNA2EEBJb^rDK#pnt}XLUO;L zN&s*ux3aQQ`RfH$fSd?m_UCi}Vt~VQ!%FL*IRD6zBNaIqme3`yy!xu^c5K^zv+Y!` zn5jC~&25`|`OHkm%+B=m$gn;;>w1=JT@>G?ZA@)-^3>_W$Dcm>#`nJWy@#+5T<>Ea z``DW84Qo&%Jx*jW^PTE?CHOao^TlPG=yiI@8OX80WJD~HXbMp2IUV8v;x*H-@YTs- zHeUVeSFa&E2K%6&Aae%m2z-CncYRmjlmIUB2R%rG;R1pY;{maX<1c*S3)i4qVjbrL zESFt&nL`wYEWu$3RB%$11IWNlu@6877d>_AR1Kg?9Thrg6#WKm z00#x&$VCBQ=$KdsNb!5uyMAi^)*rm({@1_$dp`U<-~H-$y!N%Pe$8L}_xt|w;X{Yt z^z@07cRu~}iT`};>64%Hzr|-xp0?nU=fKUp1zR#!NQmX0KC`%R{M5qRKm6ejALcX1 zJAsD+h9dJa5i*UcR61YO>0E#C(24t-GFOYXu-Fino8Y|haGZ^1=OXA3Wan{aN<=|8 zj&sljA&RLR%K5&K;)Ab~0~TUm9P>G>BONIAHMNW>b7)tNxZSo7qn047uf=(DUFUJ0&v`D{=|G1JFQfMF1);PH z7nUD9cJ#=5Kk|`}9FF6$B;asHNxD~>tDy-+__6xiCzI<;=)7lW^e9n7(f z&<$=LV2qhC;l&Yn04mlANIVn(7LM!qg{I*gs7s=A^8*h&P;rzjTG+_6Mvfus!Zzmu zMj7}X0V+M9ksMc$;N-Axas-S4!hT<8I*$5&`?r7RduO+A-#ycr-Ho)ChaP(5Q@{3WzqE*Y zpkwq;grb{{{$^mfTCgid#1N~E~0n|SwNI|HFGpI|B3qS*SIENGE zk=t^}5P(wx8la_m0HX@)wA!&x0u0*`sKEzH@}Psb2d9N9V0fM=@4SJQxH&!y=IfCF zHpvj;(#4l9C7A?a=Ih-I&R1zsJ4nV$j%f3~zCqk#d=K`1q7R9{L%GWz`~0J2mvZzM@nNcb{Q4*01i;oX)Fh4r|%VEP)vEivG?%I6!4ORS-fXUf2i3cswB`# zoKH4DnDZ&_XM}}>MgvF`#azZj1iDXBVnXZ_;s{J;%MiR+2N`yNYy*JaSPI*?77Z*pYbVE10S5zz1jw-MxtpQUg(c3zkQZ2w{=2Y^ zkBS4fqn)^~C}zX`kvVX-7x@Vp{?)F4K6x{(<5FCGIKwQAxDnd>Iy^Ylx{q z0(jwE9G7)~$oXI~3+vs+&QcZXAUNZPl=NA05&%GUzNSS9V4>{*5wbFbM# zCWR8GPK0l)iQtsFpUeA$gcmO?r;KB|ehkq`P-15sGsNh1NsKX*lk$=>|4?vDE9#M5 z0)v|-Hd=B=6FbUV_F3k*b+iUiC)+JRo49OrGliYPy}|y_DUF@nlsYAk;e2w?2p9{a z2Z|HnP5|G^iIL^G06KI{fJ^#A z<%c9gT-1TFF7-2()q1LIR2=Zf$vR}6Qm-Ze#q)B*^nSBhBwZ}r*82*4xlMU7pTfYC~1HuD({W45smFJ6E-_DqRofn;3wP>pW&e-4%b_7bn$AKhv9P z3c78Fbz^+vnm}I z<%V)NGeoovt4njXSYJ_x8=}XK%$4;s-z?gCWIxZT@KW?V#f?-XaV)duB`M238y(7+ zER~(d=@GC-xVc1|!U?ADLP@%{x~|jh+*IpUUfWD*qNG8nwi}@1{&;TNc?4IMW^Y9# zr!Cs#+;AMV0g(I5Cee(U(nLvey%KVPMW*OVGZx^prwfgF}}M_)$E)e-c?47?_rNx;TbZFut90Ht>moKQ~%lyf13E{aKvGpx7ed z#G%-d(QFW6ekE;1-HO|H&%3ZP?Q8lUC+*=R`sm_4`4xPNEdF}rUXa*-L2mEHy( zwk=R%Oi^j*VVN+I!AQu#jp>93gCwVdGBJWzgaiui?485N{mzuv;?C*Hrjn|~L6!#( zRr?;VvRv+QLi0hukM38dTbaD4PVjCJt(&}e+3yW(Gqn`k8T@~&bn2hRx395E^$f3$ z>K|*J28RC)wnEQ1JUHtE|9_Zh^}&!cnDxmY=~*h_48bgG?Ed%{u}su*c=$gdPeGGO zy=!n~Y%XSPSH?`^!kRzKo- zq`+~R<95@0(`!4P^HdmZYhO4oQJ&XZk?p_yZA13t`_;+2U&q${Y27MzfBG?diQpa2 zc{)DdP`mu9@DFB{oCW-En8#%LGXOj_l16nHZgo(8<=7iu2r5G7_M=K)kOB~ z>a%*YwODfWjdWQC@ZM6{yj=I7|Zl z-aQ6|N~Kb%JR9_5=y2-L{m_l^DwRs5^2B+Ev_tp97L`h+QhBnFlMao{Z!wI{4Zf9@pO63U>a_V~wYwc66#^cqwS1OfCVg7-;`dQ>Wv$_j9fU1J!jhv>b(?*CtKzMLXKVQ`#pCdb@TkBZ3rI5Vxe z98iuPL*D1sSEW*^%z~CZrpq8Ss@6E)4CT;-mQvr%O7Q;&9<`gG!}R$>eq7+?&b&4}tS;sYM|T${jIA}KV3H8>;J%$#`aC;!r*@Amu>JliNcYOCq z&&FOF{xz6W{|cw|xaKufcskci;WRI6Kj_jeer;2u;vV`mVrh!&SP%Jm^AkjY>Kz z+G4)3xPJ%LHVMP=b%o&%Z1!x5m6qY;L(7IURi}bjb8ITgVJs3*s!nU!Dk!LJZFHT6*T-!&SJ#d@Q3| zvgEWw8DpJewB(RVH5Lj@A}zf@)@RS?G65MQklA8>qm`tQ3UnP5cofQX#8P{);M-5m zNIg{U4U>n>0{yWd@jD7->snIQKhXhUE6kuqSv1a#T?OJZuU8l+Ju>u4nQVi{RoApHiHFSDd0 zEio$!rJHo_Do|i6%wUJ|Tm|y;8DYm}1Nm99nUaF5XoY2P&M|fo4dlkqjX~;&B}Ut2 zq@NpfAU%!wjoW9>=rREr1HO)zl(|$VnQ8|+p$;lbGX`n7Vs>f;X_Y9qj-+n{vR}r! zxgFzM$o8um#Muh-?dqUI-o8roI`6#5vGv^dfl5$V2Zi$sy^F-%d+{vRfvaSNWpKT^ ziO6+=ywTd8-{9zXBamHcv}7k1r}aZ=?`Nj1F+aaPd*s)-fxMwoUYwJlzjM~z??!p2 zqZ7)SaFIp%57`SK+ec|4=~~G09V+)7eR+*}jwQsN(Pc0%&oNoT3guIEC%Ka!?jrI0N?)VXS!x&@d*nAbZWJQfbd}td z6RLLuzD_iFI49+IXqt)NK+Ycdjn05Cw?ppyQg+(INkuZDz=X;A|$;saWu3mZUGK zJKxbMCVmGQl=g=)pS!V4Zbr7rOjBYfgcj&I8}u2-8sfAvFZoaqaO%8bjaGwikW1kz zS78}@Hg-$xxr<)#%Z4VNId2Jj>UUP zXy$wm`Kt)-nDf*yLTmIXeua!4gA-~a;Q`N!7QFp&=YI!J&z%1*aP0d;{CniJoBPB$ zh5Y5vR+v7;<7~oD`#~T>&T)%!`-VR-=gH=K$l$*3e9{(Qta-YWk?~y;i;M(UW$l>ad%BwKe zAvt!+?9VtlMmkA%zr6JX+cDm|i6ZLZrmy5Ji5m4!FVN2jI}86kCm-=VdBdFVz2Dz6 z@mu6U9YM+%)#QJ!QTO<^UhwrCP=fP2lua+kH%MkFOYjG$DK=xco*Z)yo*Z%uz9Ul1 z`5tl}#`r1`XEVn6b18 z;d=NUdE`1)F8;LRQB2$(m8VAOcKX!P<7lzWH&FXD7&^ZWvX{4|=#htb`RUa}z#pMo zgq=H0nWw$5LitSxh0_Y_5uU13{;YTGEuN=SQQ!^XAs|zdI>LV0JT*uAHLxf*@G}@3 z{1%r%+&*7T{%;?{f4%b-=bNMtfp}{hOvqVNzN~kQE?A4_iDu5bHE{n}r6Q%;%Yeo3 zWwsV&uy|tMDE2?JK}$0JM&usno1{I~MG4ODy<_CmEuJsjT}Gje7V*?fh+@wFfpWSk zmxr^L9%TncJ)SP)&uD+pEwB85WzW7?9M|5Z?<|*gpo2ahpvFdE{)~-h)q@?BZ*T5>-ZAuFNk9iDQ3@Zwr6#PUE<7>b_Ad zh5S-G`Q3xx?Bv>!A3sIXu@m+&{ClEE#S}!&FGYF3`^5Pc&)cb!^W*MB=y5(nA;>6F zBYo~ZT0b9}iIY2PBl~F~gJz50Mb7<(ysvcS3^WwJ9k@Fy6e=ywZB}C#)pN6I?fs_q zq7w0QIt?v|^Z)kwIuYrCIoIQuX(}*1{q*}puAhV$&Y4UbBK4BjlixjF?%JTcWmGZo z+Q@OPw|65C$*AC35NE3AVa%6CT4xI$h4gJ`^q|w!vG+*h?5btrZSd_mGg>ZCk#lrB zcNF<8(Bk+|6nDF%!qGmdu2b!b{N^oWaGlD@efF<0AG+D!Es0P=3T3dz`CT*)g=J3d zxuYTb3|)`-E`AICK@Dyh&B1N{v^eiz$#6B&X_G_lk%lwc*845#=(pf)=L5byTBPfn z&Pg3RIW4-z4`XmkgFTKN|5F*1QC<~>w(=d0ZRTnW} zmWgj6hf7;~@wqprTJR|F_Ttkp@g?tz;dC63G4tHxv~h-TJ&wdtxe@&hc*COfEaD^4 z4tWir6o(53N!cU~mBKb6`(7a1CDP{_jFUHkw6~Di!rXM7{CgbVWxj*_BL)Y&JjYI0 z$lGfO1-{MiW~6H&r(<+!Fa9l-m6`07v$-Z9rv>R!Sxi7yLFUwV$l%Tsz7ohN45KTJ z@P+>zDU_QgDPcNujbSN=3x?Piqe57rPI71s2195dcW@?=wnE<5n3}O{OViduc}b(n zP2V8Df#>FbS3pNBAJV}TUnve33UlfuXL%6O&!h92&(XlI_qgf!khRs+;&O%Pd=+Xh1wd~Z{QVfOlJ|7vJWxPscruBZ` zAdd$OPj~$sIZwxbME>TApO1UIEauh=ZT|Eqi+_)A3~I?Y`5d z#X9d)lG@DIfb8@m%F|}XEZn;MQG%sFs#`(Gj+Jz*LGfhF8#re z!-|3GMq?QYVYCY}kT$;mX}(Tt8=0UeTjlpMuUdMTT+ zjJ$=Mj?twfa+0<3wQO~RawB((1!$xTL{6lcgdOJJ7reo7?bn44>59;}EQb{Wl~bcE zc0qn<&2GtvOJkYwlEcmIP;Qa8Avzu97$&X>q{qoL;L(hZT>%}Ed=LuDu9?(kEXp}6 zF29H_<%EdswY2?00uQ4Bmp}};CG@3vfhRK^jxNKZqa%e`!u7D0nKBmxqRnBNO*Jdor zwds!0r3E?^^6d10fj!NUV&uO}@ePq?O)Ui7hju-q5&U-EG{kBLu_mESc7Qz+okMVem`T>VZrBb;l z7U3zSKUKTJ`9^5&RIE~|R4Nz3BD^kTFpTJL5nflas8lMI%9F)Hz8OK`sowWmsZ=VJ z2^##4Z->j@vRJ89DwPE&47c?7_ZZV}i~4chN~KaMPVQYXOVAh`eZBRpQmIr{GZx^prwfgF}}M_)$E)e-c?47?>hGT^vIy7~kIA8+h13;OIwo69!os*#IU* z$r2__!6^>x7Z{!0)K)N98OYwy6ui^t({TK-;?F1LyX*GP?EN9}`rkC2vlS{1E-p*@ z4%?Vl?y}iz6W@C_d0tC{&@b2g+=JK8+MMTP+Uc@CP)^J~rbYTk)QQ}m(SJ~7LX7MA#KX}v?Dr=*Qf7kB;Jm2mrz`-_0Mnq!ClbL>~2VppSoK=fZh zNY%%j|B*4*1^2LTa4nTRSk3U*%Bh9nSZ<33W6x=hiA)mZf{R!U)+xF0B;0Z7kUFrV zL%^~j)6VG&!?Kqgy9ExINGFCf%~&WXwCzB3gXZ$X4%HItwwy@*m+pJU{GihLixcbv z8h)|m{6CaNdvI%=*pvf*FWq<h)PbYyBc~d4)%j7p|cJiBN2t?Ai>(!M}Dm;Xj-{2LzM;ZC{A%%=BGP3V!$ zna#&~_T_$LJhpM~1LO0OM`E5=vK`c|*&DokM)ZW(M00-k&ri3RD=z#m@M%lKY@c?o z?W@+;cAsqd_vgRNU(v!T+?)EJ-Y~r&JLj%kq>Ia~FT9Z&XI`EDmShi1bPS%ZelF{r G5}E)N*(c8c literal 0 HcmV?d00001 diff --git a/packages/email/tailwind.config.js b/packages/email/tailwind.config.js new file mode 100644 index 000000000..81816bdfb --- /dev/null +++ b/packages/email/tailwind.config.js @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const baseConfig = require('@documenso/tailwind-config'); +const path = require('path'); + +module.exports = { + ...baseConfig, + content: [ + `templates/**/*.{ts,tsx}`, + `${path.join(require.resolve('@documenso/ui'), '..')}/**/*.{ts,tsx}`, + ], +}; diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx new file mode 100644 index 000000000..d49d0831e --- /dev/null +++ b/packages/email/templates/document-completed.tsx @@ -0,0 +1,129 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentCompletedEmailTemplateProps { + downloadLink?: string; + reviewLink?: string; + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentCompletedEmailTemplate = ({ + downloadLink = 'https://documenso.com', + reviewLink = 'https://documenso.com', + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentCompletedEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Completed + + + + “{documentName}” was signed by all signers + + + + Continue by downloading or reviewing the document. + + + + + + Review + + + + Download + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentCompletedEmailTemplate; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx new file mode 100644 index 000000000..8a24b4f0e --- /dev/null +++ b/packages/email/templates/document-invite.tsx @@ -0,0 +1,127 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentInviteEmailTemplateProps { + inviterName?: string; + inviterEmail?: string; + documentName?: string; + signDocumentLink?: string; + assetBaseUrl?: string; +} + +export const DocumentInviteEmailTemplate = ({ + inviterName = 'Lucas Smith', + inviterEmail = 'lucas@documenso.com', + documentName = 'Open Source Pledge.pdf', + signDocumentLink = 'https://documenso.com', + assetBaseUrl = 'http://localhost:3002', +}: DocumentInviteEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + {inviterName} has invited you to sign "{documentName}" + + + + Continue by signing the document. + + + + + Sign Document + + + + + + + + + + {inviterName}{' '} + + ({inviterEmail}) + + + + + {inviterName} has invited you to sign the document "{documentName}". + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentInviteEmailTemplate; diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx new file mode 100644 index 000000000..6840e6525 --- /dev/null +++ b/packages/email/templates/document-pending.tsx @@ -0,0 +1,104 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentPendingEmailTemplateProps { + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentPendingEmailTemplate = ({ + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentPendingEmailTemplateProps) => { + const previewText = `Pending Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Waiting for others + + + + “{documentName}” has been signed + + + + We're still waiting for other signers to sign this document. + + We'll notify you as soon as it's ready. + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentPendingEmailTemplate; diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 000000000..4aefcb98c --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@documenso/tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} From 60b150cc587df6279f31ffe288baa8e44f051b11 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 15:01:18 +1000 Subject: [PATCH 09/25] fix: add shadow to metric-card --- .../src/components/(dashboard)/metric-card/metric-card.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx index c9c36cc47..9e5b1db0e 100644 --- a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx +++ b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx @@ -13,7 +13,12 @@ export type CardMetricProps = { export const CardMetric = ({ icon: Icon, title, value, className }: CardMetricProps) => { return ( - + {Icon && } From dbcf7771b91d8ed8f4006c0e3ad043ede1c40ff7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 14:23:18 +0000 Subject: [PATCH 10/25] chore: refactor stacked avatars into component --- .../src/app/(dashboard)/dashboard/page.tsx | 82 +++++-------------- .../(dashboard)/avatar/stack-avatars.tsx | 36 ++++++++ .../lib/client-only/recipient-initials.ts | 6 ++ packages/lib/client-only/recipient-type.ts | 8 ++ 4 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx create mode 100644 packages/lib/client-only/recipient-initials.ts create mode 100644 packages/lib/client-only/recipient-type.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index 8526a8c05..cf4848ec9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; @@ -22,68 +24,13 @@ import { } from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; +import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; -const renderStackAvatars = (recipients: Recipient[]) => { - const zIndex = 50; - const itemsToRender = recipients.slice(0, 5); - const remainingItems = recipients.length - itemsToRender.length; - - return itemsToRender.map((recipient: Recipient, index: number) => { - const first = index === 0 ? true : false; - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const lastItemText = - index === itemsToRender.length - 1 && remainingItems > 0 - ? `+${remainingItems + 1}` - : undefined; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ( - - ); - }); -}; - -const renderAvatar = (recipient: Recipient) => { - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ; -}; - export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -156,7 +103,7 @@ export default async function DashboardPage() { - {renderStackAvatars(document.Recipient)} + @@ -168,7 +115,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -185,7 +137,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -202,7 +159,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx new file mode 100644 index 000000000..69c2fae7e --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; + +import { StackAvatar } from '.'; + +export function StackAvatars({ recipients }: { recipients: Recipient[] }) { + const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + return ( + + ); + }); + }; + + return <>{renderStackAvatars(recipients)}>; +} diff --git a/packages/lib/client-only/recipient-initials.ts b/packages/lib/client-only/recipient-initials.ts new file mode 100644 index 000000000..0712ccd7d --- /dev/null +++ b/packages/lib/client-only/recipient-initials.ts @@ -0,0 +1,6 @@ +export const initials = (text: string) => + text + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts new file mode 100644 index 000000000..dbcf5baaf --- /dev/null +++ b/packages/lib/client-only/recipient-type.ts @@ -0,0 +1,8 @@ +import { Recipient } from '@documenso/prisma/client'; + +export const type = (recipient: Recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; From aa884310eb71a2fa6fba4590462858f30249dec7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 15:14:48 +0000 Subject: [PATCH 11/25] feat: add recipients avatars on all tables --- .../src/app/(dashboard)/dashboard/page.tsx | 104 +----------------- .../app/(dashboard)/documents/data-table.tsx | 12 +- .../avatar/{index.tsx => stack-avatar.tsx} | 0 .../avatar/stack-avatars-with-tooltip.tsx | 90 +++++++++++++++ .../(dashboard)/avatar/stack-avatars.tsx | 2 +- .../server-only/document/find-documents.ts | 7 +- packages/lib/types/document-with-recipient.ts | 5 + 7 files changed, 110 insertions(+), 110 deletions(-) rename apps/web/src/components/(dashboard)/avatar/{index.tsx => stack-avatar.tsx} (100%) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx create mode 100644 packages/lib/types/document-with-recipient.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index cf4848ec9..2f5f259ab 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,12 +2,9 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; -import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; -import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -16,15 +13,8 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; -import { StackAvatar } from '~/components/(dashboard)/avatar'; -import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -72,21 +62,6 @@ export default async function DashboardPage() { {results.data.map((document) => { - const waitingRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - - const completedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', - ); - - const uncompletedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - return ( {document.id} @@ -100,82 +75,7 @@ export default async function DashboardPage() { - - - - - - - - {completedRecipients.length > 0 && ( - - Completed - {completedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {waitingRecipients.length > 0 && ( - - Waiting - {waitingRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {uncompletedRecipients.length > 0 && ( - - Uncompleted - {uncompletedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - - - + diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 58b6eb1ac..264b3596e 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,16 +7,17 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { Document } from '@documenso/prisma/client'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; export type DocumentsDataTableProps = { - results: FindResultSet; + results: FindResultSet; }; export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { @@ -49,6 +50,13 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { ), }, + { + header: 'Recipient', + accessorKey: 'recipient', + cell: ({ row }) => { + return ; + }, + }, { header: 'Status', accessorKey: 'status', diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx similarity index 100% rename from apps/web/src/components/(dashboard)/avatar/index.tsx rename to apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx 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 new file mode 100644 index 000000000..8a918fce0 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -0,0 +1,90 @@ +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; + +import { StackAvatar } from './stack-avatar'; +import { StackAvatars } from './stack-avatars'; + +export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[] }) => { + const waitingRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + const completedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + + + + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index 69c2fae7e..c8d63bb82 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -4,7 +4,7 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; import { type } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; -import { StackAvatar } from '.'; +import { StackAvatar } from './stack-avatar'; export function StackAvatars({ recipients }: { recipients: Recipient[] }) { const renderStackAvatars = (recipients: Recipient[]) => { diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 005b6614a..60fe8a5b3 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,6 +1,7 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { @@ -15,10 +16,6 @@ export interface FindDocumentsOptions { }; } -export type DocumentWithReciepient = Document & { - Recipient: Recipient[]; -}; - export const findDocuments = async ({ userId, term, diff --git a/packages/lib/types/document-with-recipient.ts b/packages/lib/types/document-with-recipient.ts new file mode 100644 index 000000000..208fb2b68 --- /dev/null +++ b/packages/lib/types/document-with-recipient.ts @@ -0,0 +1,5 @@ +import { Document, Recipient } from '@documenso/prisma/client'; + +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; From 88d15376e30ad57c5c10f881cd006bb38b4575a1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:38:37 +0000 Subject: [PATCH 12/25] feat: update stack avatar with changes from code review --- .../(dashboard)/avatar/stack-avatar.tsx | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 2a263893a..3737e9ccf 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -9,6 +9,9 @@ export type StackAvatarProps = { export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { let classes = ''; + let zIndexClass = ''; + const firstClass = first ? '' : '-ml-3'; + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -23,12 +26,32 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } + switch (zIndex) { + case '10': + zIndexClass = 'z-10'; + break; + case '20': + zIndexClass = 'z-20'; + break; + case '30': + zIndexClass = 'z-30'; + break; + case '40': + zIndexClass = 'z-40'; + break; + case '50': + zIndexClass = 'z-50'; + break; + default: + break; + } + return ( {fallbackText ?? 'UK'} From b50f64d4ad2777e4fef0c035228142f3ee388a52 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:49:34 +0000 Subject: [PATCH 13/25] fix: update types from code review --- .../app/(dashboard)/documents/data-table.tsx | 2 +- .../avatar/stack-avatars-with-tooltip.tsx | 8 ++++---- .../(dashboard)/avatar/stack-avatars.tsx | 4 ++-- packages/lib/client-only/recipient-type.ts | 17 +++++++++++------ .../lib/server-only/document/find-documents.ts | 2 +- .../types/document-with-recipient.ts | 0 6 files changed, 19 insertions(+), 14 deletions(-) rename packages/{lib => prisma}/types/document-with-recipient.ts (100%) diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 264b3596e..35fdfb4b1 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,8 +7,8 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; 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 8a918fce0..dbd1dc712 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 @@ -1,5 +1,5 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { Tooltip, @@ -40,7 +40,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -57,7 +57,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -74,7 +74,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index c8d63bb82..97af9dc9e 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { StackAvatar } from './stack-avatar'; @@ -25,7 +25,7 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) { key={recipient.id} first={first} zIndex={String(zIndex - index * 10)} - type={lastItemText && index === 4 ? 'unsigned' : type(recipient)} + type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)} fallbackText={lastItemText ? lastItemText : initials(recipient.name)} /> ); diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts index dbcf5baaf..8250eb707 100644 --- a/packages/lib/client-only/recipient-type.ts +++ b/packages/lib/client-only/recipient-type.ts @@ -1,8 +1,13 @@ import { Recipient } from '@documenso/prisma/client'; -export const type = (recipient: Recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; +export const getRecipientType = (recipient: Recipient) => { + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED') { + return 'completed'; + } + + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED') { + return 'waiting'; + } + + return 'unsigned'; +}; diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 60fe8a5b3..41e9c858a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,7 +1,7 @@ import { prisma } from '@documenso/prisma'; import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; -import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { diff --git a/packages/lib/types/document-with-recipient.ts b/packages/prisma/types/document-with-recipient.ts similarity index 100% rename from packages/lib/types/document-with-recipient.ts rename to packages/prisma/types/document-with-recipient.ts From a5334ca6e6219386d14f079eb03ff852c63624f1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 5 Jul 2023 20:47:12 +0000 Subject: [PATCH 14/25] refactor: read z-index values from an object --- .../(dashboard)/avatar/stack-avatar.tsx | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 3737e9ccf..e79a2e71b 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -1,5 +1,13 @@ import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; +const ZIndexes: { [key: string]: string } = { + '10': 'z-10', + '20': 'z-20', + '30': 'z-30', + '40': 'z-40', + '50': 'z-50', +}; + export type StackAvatarProps = { first?: boolean; zIndex?: string; @@ -12,6 +20,10 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let zIndexClass = ''; const firstClass = first ? '' : '-ml-3'; + if (zIndex) { + zIndexClass = ZIndexes[zIndex] ?? ''; + } + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -26,26 +38,6 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } - switch (zIndex) { - case '10': - zIndexClass = 'z-10'; - break; - case '20': - zIndexClass = 'z-20'; - break; - case '30': - zIndexClass = 'z-30'; - break; - case '40': - zIndexClass = 'z-40'; - break; - case '50': - zIndexClass = 'z-50'; - break; - default: - break; - } - return ( Date: Wed, 26 Jul 2023 18:52:53 +1000 Subject: [PATCH 15/25] feat: use server-actions for authoring flow This change actually makes the authoring flow work for the most part by tying in emailing and more. We have also done a number of quality of life updates to simplify the codebase overall making it easier to continue work on the refresh. --- .env.example | 43 +- apps/marketing/package.json | 2 +- apps/web/next.config.js | 16 +- apps/web/package.json | 2 +- apps/web/public/static/clock.png | Bin 0 -> 2469 bytes apps/web/public/static/completed.png | Bin 0 -> 1812 bytes apps/web/public/static/document.png | Bin 0 -> 16295 bytes apps/web/public/static/download.png | Bin 0 -> 784 bytes apps/web/public/static/logo.png | Bin 0 -> 4119 bytes apps/web/public/static/review.png | Bin 0 -> 708 bytes .../documents/[id]/edit-document.tsx | 111 ++ .../documents/[id]/loadable-pdf-card.tsx | 2 +- .../(dashboard)/documents/[id]/loading.tsx | 8 +- .../app/(dashboard)/documents/[id]/page.tsx | 17 +- .../(dashboard)/documents/[id]/sent/page.tsx | 18 + apps/web/src/app/layout.tsx | 5 +- .../document-dropzone/document-dropzone.tsx | 14 +- .../(dashboard)/metric-card/metric-card.tsx | 6 +- .../components/formatter/document-status.tsx | 17 +- .../src/components/forms/edit-document.tsx | 251 --- .../forms/edit-document/add-fields.action.ts | 31 + .../forms/edit-document/add-fields.tsx | 616 +++++--- .../forms/edit-document/add-fields.types.ts | 21 + .../forms/edit-document/add-signers.action.ts | 26 + .../forms/edit-document/add-signers.tsx | 170 ++- .../forms/edit-document/add-signers.types.ts | 19 + .../forms/edit-document/add-subject.action.ts | 21 + .../forms/edit-document/add-subject.tsx | 206 ++- .../forms/edit-document/add-subject.types.ts | 10 + .../forms/edit-document/container.tsx | 152 ++ .../forms/edit-document/field-item.tsx | 39 +- .../send-document-action-dialog.tsx | 64 + apps/web/src/components/forms/password.tsx | 2 +- apps/web/src/helpers/getBoundingClientRect.ts | 10 + .../web/src/pages/api/stripe/webhook/index.ts | 8 +- package-lock.json | 1346 +++++++++++++++-- packages/email/index.ts | 2 +- packages/email/mailer.ts | 50 + packages/email/package.json | 16 +- packages/email/render.ts | 1 + packages/email/templates/document-pending.tsx | 1 - packages/email/transports/mailchannels.ts | 154 ++ packages/eslint-config/package.json | 2 +- packages/lib/package.json | 4 +- .../server-only/document/send-document.tsx | 94 ++ .../field/set-fields-for-document.ts | 30 +- .../recipient/set-recipients-for-document.ts | 35 +- packages/tailwind-config/index.cjs | 4 + .../trpc/server/document-router/router.ts | 22 + .../trpc/server/document-router/schema.ts | 6 + packages/tsconfig/base.json | 3 +- packages/tsconfig/process-env.d.ts | 36 + packages/ui/primitives/tooltip.tsx | 20 +- turbo.json | 17 +- 54 files changed, 2891 insertions(+), 859 deletions(-) create mode 100644 apps/web/public/static/clock.png create mode 100644 apps/web/public/static/completed.png create mode 100644 apps/web/public/static/document.png create mode 100644 apps/web/public/static/download.png create mode 100644 apps/web/public/static/logo.png create mode 100644 apps/web/public/static/review.png create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx delete mode 100644 apps/web/src/components/forms/edit-document.tsx create mode 100644 apps/web/src/components/forms/edit-document/add-fields.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-fields.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.types.ts create mode 100644 apps/web/src/components/forms/edit-document/container.tsx create mode 100644 apps/web/src/components/forms/edit-document/send-document-action-dialog.tsx create mode 100644 apps/web/src/helpers/getBoundingClientRect.ts create mode 100644 packages/email/mailer.ts create mode 100644 packages/email/render.ts create mode 100644 packages/email/transports/mailchannels.ts create mode 100644 packages/lib/server-only/document/send-document.tsx create mode 100644 packages/tsconfig/process-env.d.ts diff --git a/.env.example b/.env.example index fea246621..3ce57722b 100644 --- a/.env.example +++ b/.env.example @@ -1,19 +1,56 @@ +# [[AUTH]] NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[APP]] NEXT_PUBLIC_SITE_URL="http://localhost:3000" NEXT_PUBLIC_APP_URL="http://localhost:3000" +# [[DATABASE]] NEXT_PRIVATE_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +# [[SMTP]] +# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels +NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth" +# OPTIONAL: Defines the host to use for sending emails. +NEXT_PRIVATE_SMTP_HOST="127.0.0.1" +# OPTIONAL: Defines the port to use for sending emails. +NEXT_PRIVATE_SMTP_PORT=2500 +# OPTIONAL: Defines the username to use with the SMTP server. +NEXT_PRIVATE_SMTP_USERNAME="documenso" +# OPTIONAL: Defines the password to use with the SMTP server. +NEXT_PRIVATE_SMTP_PASSWORD="password" +# OPTIONAL: Defines the API key user to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY_USER= +# OPTIONAL: Defines the API key to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY= +# OPTIONAL: Defines whether to force the use of TLS. +NEXT_PRIVATE_SMTP_SECURE= +# REQUIRED: Defines the sender name to use for the from address. +NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" +# REQUIRED: Defines the email address to use as the from address. +NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" +# OPTIONAL: The API key to use for the MailChannels proxy endpoint. +NEXT_PRIVATE_MAILCHANNELS_API_KEY= +# OPTIONAL: The endpoint to use for the MailChannels API if using a proxy. +NEXT_PRIVATE_MAILCHANNELS_ENDPOINT= +# OPTIONAL: The domain to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN= +# OPTIONAL: The selector to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR= +# OPTIONAL: The private key to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY= + +# [[STRIPE]] +NEXT_PRIVATE_STRIPE_API_KEY= +NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID= -NEXT_PRIVATE_STRIPE_API_KEY= -NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= - +# [[FEATURES]] NEXT_PUBLIC_SUBSCRIPTIONS_ENABLED=false # This is only required for the marketing site +# [[REDIS]] NEXT_PRIVATE_REDIS_URL= NEXT_PRIVATE_REDIS_TOKEN= diff --git a/apps/marketing/package.json b/apps/marketing/package.json index e34c66b99..523a23a90 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -18,7 +18,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "perfect-freehand": "^1.2.0", diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b57b41780..09760f806 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -7,9 +7,23 @@ const { parsed: env } = require('dotenv').config({ /** @type {import('next').NextConfig} */ const config = { + experimental: { + serverActions: true, + }, reactStrictMode: true, - transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + transpilePackages: [ + '@documenso/lib', + '@documenso/prisma', + '@documenso/trpc', + '@documenso/ui', + '@documenso/email', + ], env, + modularizeImports: { + 'lucide-react': { + transform: 'lucide-react/dist/esm/icons/{{ kebabCase member }}', + }, + }, }; module.exports = config; diff --git a/apps/web/package.json b/apps/web/package.json index d493b92d9..32d0d61b3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,7 +22,7 @@ "lucide-react": "^0.214.0", "micro": "^10.0.1", "nanoid": "^4.0.2", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "next-themes": "^0.2.1", diff --git a/apps/web/public/static/clock.png b/apps/web/public/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=
+ Add the subject and message you wish to send to signers. +
+ You can use the following variables in your message: +
+ {'{signer.name}'} +
+ {'{signer.email}'} +
+ {'{document.name}'} +
+ {field.signerEmail} +
;HG6$5dje@nS!Jv~z8tNDRt<}NOJs__` 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 G5}E)N*(c8c literal 0 HcmV?d00001 diff --git a/packages/email/tailwind.config.js b/packages/email/tailwind.config.js new file mode 100644 index 000000000..81816bdfb --- /dev/null +++ b/packages/email/tailwind.config.js @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const baseConfig = require('@documenso/tailwind-config'); +const path = require('path'); + +module.exports = { + ...baseConfig, + content: [ + `templates/**/*.{ts,tsx}`, + `${path.join(require.resolve('@documenso/ui'), '..')}/**/*.{ts,tsx}`, + ], +}; diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx new file mode 100644 index 000000000..d49d0831e --- /dev/null +++ b/packages/email/templates/document-completed.tsx @@ -0,0 +1,129 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentCompletedEmailTemplateProps { + downloadLink?: string; + reviewLink?: string; + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentCompletedEmailTemplate = ({ + downloadLink = 'https://documenso.com', + reviewLink = 'https://documenso.com', + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentCompletedEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Completed + + + + “{documentName}” was signed by all signers + + + + Continue by downloading or reviewing the document. + + + + + + Review + + + + Download + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentCompletedEmailTemplate; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx new file mode 100644 index 000000000..8a24b4f0e --- /dev/null +++ b/packages/email/templates/document-invite.tsx @@ -0,0 +1,127 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentInviteEmailTemplateProps { + inviterName?: string; + inviterEmail?: string; + documentName?: string; + signDocumentLink?: string; + assetBaseUrl?: string; +} + +export const DocumentInviteEmailTemplate = ({ + inviterName = 'Lucas Smith', + inviterEmail = 'lucas@documenso.com', + documentName = 'Open Source Pledge.pdf', + signDocumentLink = 'https://documenso.com', + assetBaseUrl = 'http://localhost:3002', +}: DocumentInviteEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + {inviterName} has invited you to sign "{documentName}" + + + + Continue by signing the document. + + + + + Sign Document + + + + + + + + + + {inviterName}{' '} + + ({inviterEmail}) + + + + + {inviterName} has invited you to sign the document "{documentName}". + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentInviteEmailTemplate; diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx new file mode 100644 index 000000000..6840e6525 --- /dev/null +++ b/packages/email/templates/document-pending.tsx @@ -0,0 +1,104 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentPendingEmailTemplateProps { + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentPendingEmailTemplate = ({ + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentPendingEmailTemplateProps) => { + const previewText = `Pending Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Waiting for others + + + + “{documentName}” has been signed + + + + We're still waiting for other signers to sign this document. + + We'll notify you as soon as it's ready. + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentPendingEmailTemplate; diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 000000000..4aefcb98c --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@documenso/tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} From 60b150cc587df6279f31ffe288baa8e44f051b11 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 15:01:18 +1000 Subject: [PATCH 09/25] fix: add shadow to metric-card --- .../src/components/(dashboard)/metric-card/metric-card.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx index c9c36cc47..9e5b1db0e 100644 --- a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx +++ b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx @@ -13,7 +13,12 @@ export type CardMetricProps = { export const CardMetric = ({ icon: Icon, title, value, className }: CardMetricProps) => { return ( - + {Icon && } From dbcf7771b91d8ed8f4006c0e3ad043ede1c40ff7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 14:23:18 +0000 Subject: [PATCH 10/25] chore: refactor stacked avatars into component --- .../src/app/(dashboard)/dashboard/page.tsx | 82 +++++-------------- .../(dashboard)/avatar/stack-avatars.tsx | 36 ++++++++ .../lib/client-only/recipient-initials.ts | 6 ++ packages/lib/client-only/recipient-type.ts | 8 ++ 4 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx create mode 100644 packages/lib/client-only/recipient-initials.ts create mode 100644 packages/lib/client-only/recipient-type.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index 8526a8c05..cf4848ec9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; @@ -22,68 +24,13 @@ import { } from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; +import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; -const renderStackAvatars = (recipients: Recipient[]) => { - const zIndex = 50; - const itemsToRender = recipients.slice(0, 5); - const remainingItems = recipients.length - itemsToRender.length; - - return itemsToRender.map((recipient: Recipient, index: number) => { - const first = index === 0 ? true : false; - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const lastItemText = - index === itemsToRender.length - 1 && remainingItems > 0 - ? `+${remainingItems + 1}` - : undefined; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ( - - ); - }); -}; - -const renderAvatar = (recipient: Recipient) => { - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ; -}; - export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -156,7 +103,7 @@ export default async function DashboardPage() { - {renderStackAvatars(document.Recipient)} + @@ -168,7 +115,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -185,7 +137,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -202,7 +159,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx new file mode 100644 index 000000000..69c2fae7e --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; + +import { StackAvatar } from '.'; + +export function StackAvatars({ recipients }: { recipients: Recipient[] }) { + const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + return ( + + ); + }); + }; + + return <>{renderStackAvatars(recipients)}>; +} diff --git a/packages/lib/client-only/recipient-initials.ts b/packages/lib/client-only/recipient-initials.ts new file mode 100644 index 000000000..0712ccd7d --- /dev/null +++ b/packages/lib/client-only/recipient-initials.ts @@ -0,0 +1,6 @@ +export const initials = (text: string) => + text + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts new file mode 100644 index 000000000..dbcf5baaf --- /dev/null +++ b/packages/lib/client-only/recipient-type.ts @@ -0,0 +1,8 @@ +import { Recipient } from '@documenso/prisma/client'; + +export const type = (recipient: Recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; From aa884310eb71a2fa6fba4590462858f30249dec7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 15:14:48 +0000 Subject: [PATCH 11/25] feat: add recipients avatars on all tables --- .../src/app/(dashboard)/dashboard/page.tsx | 104 +----------------- .../app/(dashboard)/documents/data-table.tsx | 12 +- .../avatar/{index.tsx => stack-avatar.tsx} | 0 .../avatar/stack-avatars-with-tooltip.tsx | 90 +++++++++++++++ .../(dashboard)/avatar/stack-avatars.tsx | 2 +- .../server-only/document/find-documents.ts | 7 +- packages/lib/types/document-with-recipient.ts | 5 + 7 files changed, 110 insertions(+), 110 deletions(-) rename apps/web/src/components/(dashboard)/avatar/{index.tsx => stack-avatar.tsx} (100%) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx create mode 100644 packages/lib/types/document-with-recipient.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index cf4848ec9..2f5f259ab 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,12 +2,9 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; -import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; -import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -16,15 +13,8 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; -import { StackAvatar } from '~/components/(dashboard)/avatar'; -import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -72,21 +62,6 @@ export default async function DashboardPage() { {results.data.map((document) => { - const waitingRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - - const completedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', - ); - - const uncompletedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - return ( {document.id} @@ -100,82 +75,7 @@ export default async function DashboardPage() { - - - - - - - - {completedRecipients.length > 0 && ( - - Completed - {completedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {waitingRecipients.length > 0 && ( - - Waiting - {waitingRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {uncompletedRecipients.length > 0 && ( - - Uncompleted - {uncompletedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - - - + diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 58b6eb1ac..264b3596e 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,16 +7,17 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { Document } from '@documenso/prisma/client'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; export type DocumentsDataTableProps = { - results: FindResultSet; + results: FindResultSet; }; export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { @@ -49,6 +50,13 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { ), }, + { + header: 'Recipient', + accessorKey: 'recipient', + cell: ({ row }) => { + return ; + }, + }, { header: 'Status', accessorKey: 'status', diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx similarity index 100% rename from apps/web/src/components/(dashboard)/avatar/index.tsx rename to apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx 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 new file mode 100644 index 000000000..8a918fce0 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -0,0 +1,90 @@ +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; + +import { StackAvatar } from './stack-avatar'; +import { StackAvatars } from './stack-avatars'; + +export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[] }) => { + const waitingRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + const completedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + + + + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index 69c2fae7e..c8d63bb82 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -4,7 +4,7 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; import { type } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; -import { StackAvatar } from '.'; +import { StackAvatar } from './stack-avatar'; export function StackAvatars({ recipients }: { recipients: Recipient[] }) { const renderStackAvatars = (recipients: Recipient[]) => { diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 005b6614a..60fe8a5b3 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,6 +1,7 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { @@ -15,10 +16,6 @@ export interface FindDocumentsOptions { }; } -export type DocumentWithReciepient = Document & { - Recipient: Recipient[]; -}; - export const findDocuments = async ({ userId, term, diff --git a/packages/lib/types/document-with-recipient.ts b/packages/lib/types/document-with-recipient.ts new file mode 100644 index 000000000..208fb2b68 --- /dev/null +++ b/packages/lib/types/document-with-recipient.ts @@ -0,0 +1,5 @@ +import { Document, Recipient } from '@documenso/prisma/client'; + +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; From 88d15376e30ad57c5c10f881cd006bb38b4575a1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:38:37 +0000 Subject: [PATCH 12/25] feat: update stack avatar with changes from code review --- .../(dashboard)/avatar/stack-avatar.tsx | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 2a263893a..3737e9ccf 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -9,6 +9,9 @@ export type StackAvatarProps = { export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { let classes = ''; + let zIndexClass = ''; + const firstClass = first ? '' : '-ml-3'; + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -23,12 +26,32 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } + switch (zIndex) { + case '10': + zIndexClass = 'z-10'; + break; + case '20': + zIndexClass = 'z-20'; + break; + case '30': + zIndexClass = 'z-30'; + break; + case '40': + zIndexClass = 'z-40'; + break; + case '50': + zIndexClass = 'z-50'; + break; + default: + break; + } + return ( {fallbackText ?? 'UK'} From b50f64d4ad2777e4fef0c035228142f3ee388a52 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:49:34 +0000 Subject: [PATCH 13/25] fix: update types from code review --- .../app/(dashboard)/documents/data-table.tsx | 2 +- .../avatar/stack-avatars-with-tooltip.tsx | 8 ++++---- .../(dashboard)/avatar/stack-avatars.tsx | 4 ++-- packages/lib/client-only/recipient-type.ts | 17 +++++++++++------ .../lib/server-only/document/find-documents.ts | 2 +- .../types/document-with-recipient.ts | 0 6 files changed, 19 insertions(+), 14 deletions(-) rename packages/{lib => prisma}/types/document-with-recipient.ts (100%) diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 264b3596e..35fdfb4b1 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,8 +7,8 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; 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 8a918fce0..dbd1dc712 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 @@ -1,5 +1,5 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { Tooltip, @@ -40,7 +40,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -57,7 +57,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -74,7 +74,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index c8d63bb82..97af9dc9e 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { StackAvatar } from './stack-avatar'; @@ -25,7 +25,7 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) { key={recipient.id} first={first} zIndex={String(zIndex - index * 10)} - type={lastItemText && index === 4 ? 'unsigned' : type(recipient)} + type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)} fallbackText={lastItemText ? lastItemText : initials(recipient.name)} /> ); diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts index dbcf5baaf..8250eb707 100644 --- a/packages/lib/client-only/recipient-type.ts +++ b/packages/lib/client-only/recipient-type.ts @@ -1,8 +1,13 @@ import { Recipient } from '@documenso/prisma/client'; -export const type = (recipient: Recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; +export const getRecipientType = (recipient: Recipient) => { + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED') { + return 'completed'; + } + + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED') { + return 'waiting'; + } + + return 'unsigned'; +}; diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 60fe8a5b3..41e9c858a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,7 +1,7 @@ import { prisma } from '@documenso/prisma'; import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; -import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { diff --git a/packages/lib/types/document-with-recipient.ts b/packages/prisma/types/document-with-recipient.ts similarity index 100% rename from packages/lib/types/document-with-recipient.ts rename to packages/prisma/types/document-with-recipient.ts From a5334ca6e6219386d14f079eb03ff852c63624f1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 5 Jul 2023 20:47:12 +0000 Subject: [PATCH 14/25] refactor: read z-index values from an object --- .../(dashboard)/avatar/stack-avatar.tsx | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 3737e9ccf..e79a2e71b 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -1,5 +1,13 @@ import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; +const ZIndexes: { [key: string]: string } = { + '10': 'z-10', + '20': 'z-20', + '30': 'z-30', + '40': 'z-40', + '50': 'z-50', +}; + export type StackAvatarProps = { first?: boolean; zIndex?: string; @@ -12,6 +20,10 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let zIndexClass = ''; const firstClass = first ? '' : '-ml-3'; + if (zIndex) { + zIndexClass = ZIndexes[zIndex] ?? ''; + } + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -26,26 +38,6 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } - switch (zIndex) { - case '10': - zIndexClass = 'z-10'; - break; - case '20': - zIndexClass = 'z-20'; - break; - case '30': - zIndexClass = 'z-30'; - break; - case '40': - zIndexClass = 'z-40'; - break; - case '50': - zIndexClass = 'z-50'; - break; - default: - break; - } - return ( Date: Wed, 26 Jul 2023 18:52:53 +1000 Subject: [PATCH 15/25] feat: use server-actions for authoring flow This change actually makes the authoring flow work for the most part by tying in emailing and more. We have also done a number of quality of life updates to simplify the codebase overall making it easier to continue work on the refresh. --- .env.example | 43 +- apps/marketing/package.json | 2 +- apps/web/next.config.js | 16 +- apps/web/package.json | 2 +- apps/web/public/static/clock.png | Bin 0 -> 2469 bytes apps/web/public/static/completed.png | Bin 0 -> 1812 bytes apps/web/public/static/document.png | Bin 0 -> 16295 bytes apps/web/public/static/download.png | Bin 0 -> 784 bytes apps/web/public/static/logo.png | Bin 0 -> 4119 bytes apps/web/public/static/review.png | Bin 0 -> 708 bytes .../documents/[id]/edit-document.tsx | 111 ++ .../documents/[id]/loadable-pdf-card.tsx | 2 +- .../(dashboard)/documents/[id]/loading.tsx | 8 +- .../app/(dashboard)/documents/[id]/page.tsx | 17 +- .../(dashboard)/documents/[id]/sent/page.tsx | 18 + apps/web/src/app/layout.tsx | 5 +- .../document-dropzone/document-dropzone.tsx | 14 +- .../(dashboard)/metric-card/metric-card.tsx | 6 +- .../components/formatter/document-status.tsx | 17 +- .../src/components/forms/edit-document.tsx | 251 --- .../forms/edit-document/add-fields.action.ts | 31 + .../forms/edit-document/add-fields.tsx | 616 +++++--- .../forms/edit-document/add-fields.types.ts | 21 + .../forms/edit-document/add-signers.action.ts | 26 + .../forms/edit-document/add-signers.tsx | 170 ++- .../forms/edit-document/add-signers.types.ts | 19 + .../forms/edit-document/add-subject.action.ts | 21 + .../forms/edit-document/add-subject.tsx | 206 ++- .../forms/edit-document/add-subject.types.ts | 10 + .../forms/edit-document/container.tsx | 152 ++ .../forms/edit-document/field-item.tsx | 39 +- .../send-document-action-dialog.tsx | 64 + apps/web/src/components/forms/password.tsx | 2 +- apps/web/src/helpers/getBoundingClientRect.ts | 10 + .../web/src/pages/api/stripe/webhook/index.ts | 8 +- package-lock.json | 1346 +++++++++++++++-- packages/email/index.ts | 2 +- packages/email/mailer.ts | 50 + packages/email/package.json | 16 +- packages/email/render.ts | 1 + packages/email/templates/document-pending.tsx | 1 - packages/email/transports/mailchannels.ts | 154 ++ packages/eslint-config/package.json | 2 +- packages/lib/package.json | 4 +- .../server-only/document/send-document.tsx | 94 ++ .../field/set-fields-for-document.ts | 30 +- .../recipient/set-recipients-for-document.ts | 35 +- packages/tailwind-config/index.cjs | 4 + .../trpc/server/document-router/router.ts | 22 + .../trpc/server/document-router/schema.ts | 6 + packages/tsconfig/base.json | 3 +- packages/tsconfig/process-env.d.ts | 36 + packages/ui/primitives/tooltip.tsx | 20 +- turbo.json | 17 +- 54 files changed, 2891 insertions(+), 859 deletions(-) create mode 100644 apps/web/public/static/clock.png create mode 100644 apps/web/public/static/completed.png create mode 100644 apps/web/public/static/document.png create mode 100644 apps/web/public/static/download.png create mode 100644 apps/web/public/static/logo.png create mode 100644 apps/web/public/static/review.png create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx delete mode 100644 apps/web/src/components/forms/edit-document.tsx create mode 100644 apps/web/src/components/forms/edit-document/add-fields.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-fields.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.types.ts create mode 100644 apps/web/src/components/forms/edit-document/container.tsx create mode 100644 apps/web/src/components/forms/edit-document/send-document-action-dialog.tsx create mode 100644 apps/web/src/helpers/getBoundingClientRect.ts create mode 100644 packages/email/mailer.ts create mode 100644 packages/email/render.ts create mode 100644 packages/email/transports/mailchannels.ts create mode 100644 packages/lib/server-only/document/send-document.tsx create mode 100644 packages/tsconfig/process-env.d.ts diff --git a/.env.example b/.env.example index fea246621..3ce57722b 100644 --- a/.env.example +++ b/.env.example @@ -1,19 +1,56 @@ +# [[AUTH]] NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[APP]] NEXT_PUBLIC_SITE_URL="http://localhost:3000" NEXT_PUBLIC_APP_URL="http://localhost:3000" +# [[DATABASE]] NEXT_PRIVATE_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +# [[SMTP]] +# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels +NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth" +# OPTIONAL: Defines the host to use for sending emails. +NEXT_PRIVATE_SMTP_HOST="127.0.0.1" +# OPTIONAL: Defines the port to use for sending emails. +NEXT_PRIVATE_SMTP_PORT=2500 +# OPTIONAL: Defines the username to use with the SMTP server. +NEXT_PRIVATE_SMTP_USERNAME="documenso" +# OPTIONAL: Defines the password to use with the SMTP server. +NEXT_PRIVATE_SMTP_PASSWORD="password" +# OPTIONAL: Defines the API key user to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY_USER= +# OPTIONAL: Defines the API key to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY= +# OPTIONAL: Defines whether to force the use of TLS. +NEXT_PRIVATE_SMTP_SECURE= +# REQUIRED: Defines the sender name to use for the from address. +NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" +# REQUIRED: Defines the email address to use as the from address. +NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" +# OPTIONAL: The API key to use for the MailChannels proxy endpoint. +NEXT_PRIVATE_MAILCHANNELS_API_KEY= +# OPTIONAL: The endpoint to use for the MailChannels API if using a proxy. +NEXT_PRIVATE_MAILCHANNELS_ENDPOINT= +# OPTIONAL: The domain to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN= +# OPTIONAL: The selector to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR= +# OPTIONAL: The private key to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY= + +# [[STRIPE]] +NEXT_PRIVATE_STRIPE_API_KEY= +NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID= -NEXT_PRIVATE_STRIPE_API_KEY= -NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= - +# [[FEATURES]] NEXT_PUBLIC_SUBSCRIPTIONS_ENABLED=false # This is only required for the marketing site +# [[REDIS]] NEXT_PRIVATE_REDIS_URL= NEXT_PRIVATE_REDIS_TOKEN= diff --git a/apps/marketing/package.json b/apps/marketing/package.json index e34c66b99..523a23a90 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -18,7 +18,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "perfect-freehand": "^1.2.0", diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b57b41780..09760f806 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -7,9 +7,23 @@ const { parsed: env } = require('dotenv').config({ /** @type {import('next').NextConfig} */ const config = { + experimental: { + serverActions: true, + }, reactStrictMode: true, - transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + transpilePackages: [ + '@documenso/lib', + '@documenso/prisma', + '@documenso/trpc', + '@documenso/ui', + '@documenso/email', + ], env, + modularizeImports: { + 'lucide-react': { + transform: 'lucide-react/dist/esm/icons/{{ kebabCase member }}', + }, + }, }; module.exports = config; diff --git a/apps/web/package.json b/apps/web/package.json index d493b92d9..32d0d61b3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,7 +22,7 @@ "lucide-react": "^0.214.0", "micro": "^10.0.1", "nanoid": "^4.0.2", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "next-themes": "^0.2.1", diff --git a/apps/web/public/static/clock.png b/apps/web/public/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=
r0hi%a7NOQOhyz6SuB7V3C+z|NhQnNg_(Qe_PF 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 G5}E)N*(c8c literal 0 HcmV?d00001 diff --git a/packages/email/tailwind.config.js b/packages/email/tailwind.config.js new file mode 100644 index 000000000..81816bdfb --- /dev/null +++ b/packages/email/tailwind.config.js @@ -0,0 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const baseConfig = require('@documenso/tailwind-config'); +const path = require('path'); + +module.exports = { + ...baseConfig, + content: [ + `templates/**/*.{ts,tsx}`, + `${path.join(require.resolve('@documenso/ui'), '..')}/**/*.{ts,tsx}`, + ], +}; diff --git a/packages/email/templates/document-completed.tsx b/packages/email/templates/document-completed.tsx new file mode 100644 index 000000000..d49d0831e --- /dev/null +++ b/packages/email/templates/document-completed.tsx @@ -0,0 +1,129 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentCompletedEmailTemplateProps { + downloadLink?: string; + reviewLink?: string; + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentCompletedEmailTemplate = ({ + downloadLink = 'https://documenso.com', + reviewLink = 'https://documenso.com', + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentCompletedEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Completed + + + + “{documentName}” was signed by all signers + + + + Continue by downloading or reviewing the document. + + + + + + Review + + + + Download + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentCompletedEmailTemplate; diff --git a/packages/email/templates/document-invite.tsx b/packages/email/templates/document-invite.tsx new file mode 100644 index 000000000..8a24b4f0e --- /dev/null +++ b/packages/email/templates/document-invite.tsx @@ -0,0 +1,127 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentInviteEmailTemplateProps { + inviterName?: string; + inviterEmail?: string; + documentName?: string; + signDocumentLink?: string; + assetBaseUrl?: string; +} + +export const DocumentInviteEmailTemplate = ({ + inviterName = 'Lucas Smith', + inviterEmail = 'lucas@documenso.com', + documentName = 'Open Source Pledge.pdf', + signDocumentLink = 'https://documenso.com', + assetBaseUrl = 'http://localhost:3002', +}: DocumentInviteEmailTemplateProps) => { + const previewText = `Completed Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + {inviterName} has invited you to sign "{documentName}" + + + + Continue by signing the document. + + + + + Sign Document + + + + + + + + + + {inviterName}{' '} + + ({inviterEmail}) + + + + + {inviterName} has invited you to sign the document "{documentName}". + + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentInviteEmailTemplate; diff --git a/packages/email/templates/document-pending.tsx b/packages/email/templates/document-pending.tsx new file mode 100644 index 000000000..6840e6525 --- /dev/null +++ b/packages/email/templates/document-pending.tsx @@ -0,0 +1,104 @@ +import { + Body, + Button, + Container, + Head, + Html, + Img, + Link, + Preview, + Section, + Tailwind, + Text, +} from '@react-email/components'; + +import * as config from '@documenso/tailwind-config'; + +interface DocumentPendingEmailTemplateProps { + documentName?: string; + assetBaseUrl?: string; +} + +export const DocumentPendingEmailTemplate = ({ + documentName = 'Open Source Pledge.pdf', + assetBaseUrl = 'http://localhost:3002', +}: DocumentPendingEmailTemplateProps) => { + const previewText = `Pending Document`; + + const getAssetUrl = (path: string) => { + return new URL(path, assetBaseUrl).toString(); + }; + + return ( + + + {previewText} + + + + + + + + + + + + + + + Waiting for others + + + + “{documentName}” has been signed + + + + We're still waiting for other signers to sign this document. + + We'll notify you as soon as it's ready. + + + + + + + + + This document was sent using{' '} + + Documenso. + + + + + Documenso + + 2261 Market Street, #5211, San Francisco, CA 94114, USA + + + + + + + + ); +}; + +export default DocumentPendingEmailTemplate; diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 000000000..4aefcb98c --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@documenso/tsconfig/react-library.json", + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} From 60b150cc587df6279f31ffe288baa8e44f051b11 Mon Sep 17 00:00:00 2001 From: Mythie Date: Sat, 24 Jun 2023 15:01:18 +1000 Subject: [PATCH 09/25] fix: add shadow to metric-card --- .../src/components/(dashboard)/metric-card/metric-card.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx index c9c36cc47..9e5b1db0e 100644 --- a/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx +++ b/apps/web/src/components/(dashboard)/metric-card/metric-card.tsx @@ -13,7 +13,12 @@ export type CardMetricProps = { export const CardMetric = ({ icon: Icon, title, value, className }: CardMetricProps) => { return ( - + {Icon && } From dbcf7771b91d8ed8f4006c0e3ad043ede1c40ff7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 14:23:18 +0000 Subject: [PATCH 10/25] chore: refactor stacked avatars into component --- .../src/app/(dashboard)/dashboard/page.tsx | 82 +++++-------------- .../(dashboard)/avatar/stack-avatars.tsx | 36 ++++++++ .../lib/client-only/recipient-initials.ts | 6 ++ packages/lib/client-only/recipient-type.ts | 8 ++ 4 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx create mode 100644 packages/lib/client-only/recipient-initials.ts create mode 100644 packages/lib/client-only/recipient-type.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index 8526a8c05..cf4848ec9 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,6 +2,8 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; @@ -22,68 +24,13 @@ import { } from '@documenso/ui/primitives/tooltip'; import { StackAvatar } from '~/components/(dashboard)/avatar'; +import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; import { UploadDocument } from './upload-document'; -const renderStackAvatars = (recipients: Recipient[]) => { - const zIndex = 50; - const itemsToRender = recipients.slice(0, 5); - const remainingItems = recipients.length - itemsToRender.length; - - return itemsToRender.map((recipient: Recipient, index: number) => { - const first = index === 0 ? true : false; - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const lastItemText = - index === itemsToRender.length - 1 && remainingItems > 0 - ? `+${remainingItems + 1}` - : undefined; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ( - - ); - }); -}; - -const renderAvatar = (recipient: Recipient) => { - const initials = - recipient.name - ?.split(' ') - .map((name: string) => name.slice(0, 1).toUpperCase()) - .slice(0, 2) - .join('') ?? 'UK'; - - const type = - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; - - return ; -}; - export default async function DashboardPage() { const session = await getRequiredServerComponentSession(); @@ -156,7 +103,7 @@ export default async function DashboardPage() { - {renderStackAvatars(document.Recipient)} + @@ -168,7 +115,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -185,7 +137,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} @@ -202,7 +159,12 @@ export default async function DashboardPage() { key={recipient.id} className="my-1 flex items-center gap-2" > - {renderAvatar(recipient)} + {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx new file mode 100644 index 000000000..69c2fae7e --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -0,0 +1,36 @@ +import React from 'react'; + +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; + +import { StackAvatar } from '.'; + +export function StackAvatars({ recipients }: { recipients: Recipient[] }) { + const renderStackAvatars = (recipients: Recipient[]) => { + const zIndex = 50; + const itemsToRender = recipients.slice(0, 5); + const remainingItems = recipients.length - itemsToRender.length; + + return itemsToRender.map((recipient: Recipient, index: number) => { + const first = index === 0 ? true : false; + + const lastItemText = + index === itemsToRender.length - 1 && remainingItems > 0 + ? `+${remainingItems + 1}` + : undefined; + + return ( + + ); + }); + }; + + return <>{renderStackAvatars(recipients)}>; +} diff --git a/packages/lib/client-only/recipient-initials.ts b/packages/lib/client-only/recipient-initials.ts new file mode 100644 index 000000000..0712ccd7d --- /dev/null +++ b/packages/lib/client-only/recipient-initials.ts @@ -0,0 +1,6 @@ +export const initials = (text: string) => + text + ?.split(' ') + .map((name: string) => name.slice(0, 1).toUpperCase()) + .slice(0, 2) + .join('') ?? 'UK'; diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts new file mode 100644 index 000000000..dbcf5baaf --- /dev/null +++ b/packages/lib/client-only/recipient-type.ts @@ -0,0 +1,8 @@ +import { Recipient } from '@documenso/prisma/client'; + +export const type = (recipient: Recipient) => + recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' + ? 'completed' + : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' + ? 'waiting' + : 'unsigned'; From aa884310eb71a2fa6fba4590462858f30249dec7 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Sun, 25 Jun 2023 15:14:48 +0000 Subject: [PATCH 11/25] feat: add recipients avatars on all tables --- .../src/app/(dashboard)/dashboard/page.tsx | 104 +----------------- .../app/(dashboard)/documents/data-table.tsx | 12 +- .../avatar/{index.tsx => stack-avatar.tsx} | 0 .../avatar/stack-avatars-with-tooltip.tsx | 90 +++++++++++++++ .../(dashboard)/avatar/stack-avatars.tsx | 2 +- .../server-only/document/find-documents.ts | 7 +- packages/lib/types/document-with-recipient.ts | 5 + 7 files changed, 110 insertions(+), 110 deletions(-) rename apps/web/src/components/(dashboard)/avatar/{index.tsx => stack-avatar.tsx} (100%) create mode 100644 apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx create mode 100644 packages/lib/types/document-with-recipient.ts diff --git a/apps/web/src/app/(dashboard)/dashboard/page.tsx b/apps/web/src/app/(dashboard)/dashboard/page.tsx index cf4848ec9..2f5f259ab 100644 --- a/apps/web/src/app/(dashboard)/dashboard/page.tsx +++ b/apps/web/src/app/(dashboard)/dashboard/page.tsx @@ -2,12 +2,9 @@ import Link from 'next/link'; import { Clock, File, FileCheck } from 'lucide-react'; -import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-session'; import { findDocuments } from '@documenso/lib/server-only/document/find-documents'; import { getStats } from '@documenso/lib/server-only/document/get-stats'; -import { Recipient } from '@documenso/prisma/client'; import { Table, TableBody, @@ -16,15 +13,8 @@ import { TableHeader, TableRow, } from '@documenso/ui/primitives/table'; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from '@documenso/ui/primitives/tooltip'; -import { StackAvatar } from '~/components/(dashboard)/avatar'; -import { StackAvatars } from '~/components/(dashboard)/avatar/stack-avatars'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { CardMetric } from '~/components/(dashboard)/metric-card/metric-card'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; @@ -72,21 +62,6 @@ export default async function DashboardPage() { {results.data.map((document) => { - const waitingRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - - const completedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', - ); - - const uncompletedRecipients = document.Recipient.filter( - (recipient) => - recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', - ); - return ( {document.id} @@ -100,82 +75,7 @@ export default async function DashboardPage() { - - - - - - - - {completedRecipients.length > 0 && ( - - Completed - {completedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {waitingRecipients.length > 0 && ( - - Waiting - {waitingRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - {uncompletedRecipients.length > 0 && ( - - Uncompleted - {uncompletedRecipients.map((recipient: Recipient) => ( - - - - {recipient.email} - - - ))} - - )} - - - - + diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 58b6eb1ac..264b3596e 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,16 +7,17 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; +import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; -import { Document } from '@documenso/prisma/client'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; +import { StackAvatarsWithTooltip } from '~/components/(dashboard)/avatar/stack-avatars-with-tooltip'; import { DocumentStatus } from '~/components/formatter/document-status'; import { LocaleDate } from '~/components/formatter/locale-date'; export type DocumentsDataTableProps = { - results: FindResultSet; + results: FindResultSet; }; export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { @@ -49,6 +50,13 @@ export const DocumentsDataTable = ({ results }: DocumentsDataTableProps) => { ), }, + { + header: 'Recipient', + accessorKey: 'recipient', + cell: ({ row }) => { + return ; + }, + }, { header: 'Status', accessorKey: 'status', diff --git a/apps/web/src/components/(dashboard)/avatar/index.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx similarity index 100% rename from apps/web/src/components/(dashboard)/avatar/index.tsx rename to apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx 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 new file mode 100644 index 000000000..8a918fce0 --- /dev/null +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars-with-tooltip.tsx @@ -0,0 +1,90 @@ +import { initials } from '@documenso/lib/client-only/recipient-initials'; +import { type } from '@documenso/lib/client-only/recipient-type'; +import { Recipient } from '@documenso/prisma/client'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@documenso/ui/primitives/tooltip'; + +import { StackAvatar } from './stack-avatar'; +import { StackAvatars } from './stack-avatars'; + +export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[] }) => { + const waitingRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + const completedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED', + ); + + const uncompletedRecipients = recipients.filter( + (recipient) => recipient.sendStatus === 'NOT_SENT' && recipient.signingStatus === 'NOT_SIGNED', + ); + + return ( + + + + + + + + {completedRecipients.length > 0 && ( + + Completed + {completedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {waitingRecipients.length > 0 && ( + + Waiting + {waitingRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + {uncompletedRecipients.length > 0 && ( + + Uncompleted + {uncompletedRecipients.map((recipient: Recipient) => ( + + + {recipient.email} + + ))} + + )} + + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index 69c2fae7e..c8d63bb82 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -4,7 +4,7 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; import { type } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; -import { StackAvatar } from '.'; +import { StackAvatar } from './stack-avatar'; export function StackAvatars({ recipients }: { recipients: Recipient[] }) { const renderStackAvatars = (recipients: Recipient[]) => { diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 005b6614a..60fe8a5b3 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,6 +1,7 @@ import { prisma } from '@documenso/prisma'; -import { Document, DocumentStatus, Prisma, Recipient } from '@documenso/prisma/client'; +import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { @@ -15,10 +16,6 @@ export interface FindDocumentsOptions { }; } -export type DocumentWithReciepient = Document & { - Recipient: Recipient[]; -}; - export const findDocuments = async ({ userId, term, diff --git a/packages/lib/types/document-with-recipient.ts b/packages/lib/types/document-with-recipient.ts new file mode 100644 index 000000000..208fb2b68 --- /dev/null +++ b/packages/lib/types/document-with-recipient.ts @@ -0,0 +1,5 @@ +import { Document, Recipient } from '@documenso/prisma/client'; + +export type DocumentWithReciepient = Document & { + Recipient: Recipient[]; +}; From 88d15376e30ad57c5c10f881cd006bb38b4575a1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:38:37 +0000 Subject: [PATCH 12/25] feat: update stack avatar with changes from code review --- .../(dashboard)/avatar/stack-avatar.tsx | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 2a263893a..3737e9ccf 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -9,6 +9,9 @@ export type StackAvatarProps = { export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarProps) => { let classes = ''; + let zIndexClass = ''; + const firstClass = first ? '' : '-ml-3'; + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -23,12 +26,32 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } + switch (zIndex) { + case '10': + zIndexClass = 'z-10'; + break; + case '20': + zIndexClass = 'z-20'; + break; + case '30': + zIndexClass = 'z-30'; + break; + case '40': + zIndexClass = 'z-40'; + break; + case '50': + zIndexClass = 'z-50'; + break; + default: + break; + } + return ( {fallbackText ?? 'UK'} From b50f64d4ad2777e4fef0c035228142f3ee388a52 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 30 Jun 2023 23:49:34 +0000 Subject: [PATCH 13/25] fix: update types from code review --- .../app/(dashboard)/documents/data-table.tsx | 2 +- .../avatar/stack-avatars-with-tooltip.tsx | 8 ++++---- .../(dashboard)/avatar/stack-avatars.tsx | 4 ++-- packages/lib/client-only/recipient-type.ts | 17 +++++++++++------ .../lib/server-only/document/find-documents.ts | 2 +- .../types/document-with-recipient.ts | 0 6 files changed, 19 insertions(+), 14 deletions(-) rename packages/{lib => prisma}/types/document-with-recipient.ts (100%) diff --git a/apps/web/src/app/(dashboard)/documents/data-table.tsx b/apps/web/src/app/(dashboard)/documents/data-table.tsx index 264b3596e..35fdfb4b1 100644 --- a/apps/web/src/app/(dashboard)/documents/data-table.tsx +++ b/apps/web/src/app/(dashboard)/documents/data-table.tsx @@ -7,8 +7,8 @@ import Link from 'next/link'; import { Loader } from 'lucide-react'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { DocumentWithReciepient } from '@documenso/lib/types/document-with-recipient'; import { FindResultSet } from '@documenso/lib/types/find-result-set'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; import { DataTable } from '@documenso/ui/primitives/data-table'; import { DataTablePagination } from '@documenso/ui/primitives/data-table-pagination'; 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 8a918fce0..dbd1dc712 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 @@ -1,5 +1,5 @@ import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { Tooltip, @@ -40,7 +40,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -57,7 +57,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} @@ -74,7 +74,7 @@ export const StackAvatarsWithTooltip = ({ recipients }: { recipients: Recipient[ {recipient.email} diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx index c8d63bb82..97af9dc9e 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatars.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { initials } from '@documenso/lib/client-only/recipient-initials'; -import { type } from '@documenso/lib/client-only/recipient-type'; +import { getRecipientType } from '@documenso/lib/client-only/recipient-type'; import { Recipient } from '@documenso/prisma/client'; import { StackAvatar } from './stack-avatar'; @@ -25,7 +25,7 @@ export function StackAvatars({ recipients }: { recipients: Recipient[] }) { key={recipient.id} first={first} zIndex={String(zIndex - index * 10)} - type={lastItemText && index === 4 ? 'unsigned' : type(recipient)} + type={lastItemText && index === 4 ? 'unsigned' : getRecipientType(recipient)} fallbackText={lastItemText ? lastItemText : initials(recipient.name)} /> ); diff --git a/packages/lib/client-only/recipient-type.ts b/packages/lib/client-only/recipient-type.ts index dbcf5baaf..8250eb707 100644 --- a/packages/lib/client-only/recipient-type.ts +++ b/packages/lib/client-only/recipient-type.ts @@ -1,8 +1,13 @@ import { Recipient } from '@documenso/prisma/client'; -export const type = (recipient: Recipient) => - recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED' - ? 'completed' - : recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED' - ? 'waiting' - : 'unsigned'; +export const getRecipientType = (recipient: Recipient) => { + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'SIGNED') { + return 'completed'; + } + + if (recipient.sendStatus === 'SENT' && recipient.signingStatus === 'NOT_SIGNED') { + return 'waiting'; + } + + return 'unsigned'; +}; diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts index 60fe8a5b3..41e9c858a 100644 --- a/packages/lib/server-only/document/find-documents.ts +++ b/packages/lib/server-only/document/find-documents.ts @@ -1,7 +1,7 @@ import { prisma } from '@documenso/prisma'; import { Document, DocumentStatus, Prisma } from '@documenso/prisma/client'; +import { DocumentWithReciepient } from '@documenso/prisma/types/document-with-recipient'; -import { DocumentWithReciepient } from '../../types/document-with-recipient'; import { FindResultSet } from '../../types/find-result-set'; export interface FindDocumentsOptions { diff --git a/packages/lib/types/document-with-recipient.ts b/packages/prisma/types/document-with-recipient.ts similarity index 100% rename from packages/lib/types/document-with-recipient.ts rename to packages/prisma/types/document-with-recipient.ts From a5334ca6e6219386d14f079eb03ff852c63624f1 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 5 Jul 2023 20:47:12 +0000 Subject: [PATCH 14/25] refactor: read z-index values from an object --- .../(dashboard)/avatar/stack-avatar.tsx | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx index 3737e9ccf..e79a2e71b 100644 --- a/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx +++ b/apps/web/src/components/(dashboard)/avatar/stack-avatar.tsx @@ -1,5 +1,13 @@ import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; +const ZIndexes: { [key: string]: string } = { + '10': 'z-10', + '20': 'z-20', + '30': 'z-30', + '40': 'z-40', + '50': 'z-50', +}; + export type StackAvatarProps = { first?: boolean; zIndex?: string; @@ -12,6 +20,10 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr let zIndexClass = ''; const firstClass = first ? '' : '-ml-3'; + if (zIndex) { + zIndexClass = ZIndexes[zIndex] ?? ''; + } + switch (type) { case 'unsigned': classes = 'bg-dawn-200 text-dawn-900'; @@ -26,26 +38,6 @@ export const StackAvatar = ({ first, zIndex, fallbackText, type }: StackAvatarPr break; } - switch (zIndex) { - case '10': - zIndexClass = 'z-10'; - break; - case '20': - zIndexClass = 'z-20'; - break; - case '30': - zIndexClass = 'z-30'; - break; - case '40': - zIndexClass = 'z-40'; - break; - case '50': - zIndexClass = 'z-50'; - break; - default: - break; - } - return ( Date: Wed, 26 Jul 2023 18:52:53 +1000 Subject: [PATCH 15/25] feat: use server-actions for authoring flow This change actually makes the authoring flow work for the most part by tying in emailing and more. We have also done a number of quality of life updates to simplify the codebase overall making it easier to continue work on the refresh. --- .env.example | 43 +- apps/marketing/package.json | 2 +- apps/web/next.config.js | 16 +- apps/web/package.json | 2 +- apps/web/public/static/clock.png | Bin 0 -> 2469 bytes apps/web/public/static/completed.png | Bin 0 -> 1812 bytes apps/web/public/static/document.png | Bin 0 -> 16295 bytes apps/web/public/static/download.png | Bin 0 -> 784 bytes apps/web/public/static/logo.png | Bin 0 -> 4119 bytes apps/web/public/static/review.png | Bin 0 -> 708 bytes .../documents/[id]/edit-document.tsx | 111 ++ .../documents/[id]/loadable-pdf-card.tsx | 2 +- .../(dashboard)/documents/[id]/loading.tsx | 8 +- .../app/(dashboard)/documents/[id]/page.tsx | 17 +- .../(dashboard)/documents/[id]/sent/page.tsx | 18 + apps/web/src/app/layout.tsx | 5 +- .../document-dropzone/document-dropzone.tsx | 14 +- .../(dashboard)/metric-card/metric-card.tsx | 6 +- .../components/formatter/document-status.tsx | 17 +- .../src/components/forms/edit-document.tsx | 251 --- .../forms/edit-document/add-fields.action.ts | 31 + .../forms/edit-document/add-fields.tsx | 616 +++++--- .../forms/edit-document/add-fields.types.ts | 21 + .../forms/edit-document/add-signers.action.ts | 26 + .../forms/edit-document/add-signers.tsx | 170 ++- .../forms/edit-document/add-signers.types.ts | 19 + .../forms/edit-document/add-subject.action.ts | 21 + .../forms/edit-document/add-subject.tsx | 206 ++- .../forms/edit-document/add-subject.types.ts | 10 + .../forms/edit-document/container.tsx | 152 ++ .../forms/edit-document/field-item.tsx | 39 +- .../send-document-action-dialog.tsx | 64 + apps/web/src/components/forms/password.tsx | 2 +- apps/web/src/helpers/getBoundingClientRect.ts | 10 + .../web/src/pages/api/stripe/webhook/index.ts | 8 +- package-lock.json | 1346 +++++++++++++++-- packages/email/index.ts | 2 +- packages/email/mailer.ts | 50 + packages/email/package.json | 16 +- packages/email/render.ts | 1 + packages/email/templates/document-pending.tsx | 1 - packages/email/transports/mailchannels.ts | 154 ++ packages/eslint-config/package.json | 2 +- packages/lib/package.json | 4 +- .../server-only/document/send-document.tsx | 94 ++ .../field/set-fields-for-document.ts | 30 +- .../recipient/set-recipients-for-document.ts | 35 +- packages/tailwind-config/index.cjs | 4 + .../trpc/server/document-router/router.ts | 22 + .../trpc/server/document-router/schema.ts | 6 + packages/tsconfig/base.json | 3 +- packages/tsconfig/process-env.d.ts | 36 + packages/ui/primitives/tooltip.tsx | 20 +- turbo.json | 17 +- 54 files changed, 2891 insertions(+), 859 deletions(-) create mode 100644 apps/web/public/static/clock.png create mode 100644 apps/web/public/static/completed.png create mode 100644 apps/web/public/static/document.png create mode 100644 apps/web/public/static/download.png create mode 100644 apps/web/public/static/logo.png create mode 100644 apps/web/public/static/review.png create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/edit-document.tsx create mode 100644 apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx delete mode 100644 apps/web/src/components/forms/edit-document.tsx create mode 100644 apps/web/src/components/forms/edit-document/add-fields.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-fields.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-signers.types.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.action.ts create mode 100644 apps/web/src/components/forms/edit-document/add-subject.types.ts create mode 100644 apps/web/src/components/forms/edit-document/container.tsx create mode 100644 apps/web/src/components/forms/edit-document/send-document-action-dialog.tsx create mode 100644 apps/web/src/helpers/getBoundingClientRect.ts create mode 100644 packages/email/mailer.ts create mode 100644 packages/email/render.ts create mode 100644 packages/email/transports/mailchannels.ts create mode 100644 packages/lib/server-only/document/send-document.tsx create mode 100644 packages/tsconfig/process-env.d.ts diff --git a/.env.example b/.env.example index fea246621..3ce57722b 100644 --- a/.env.example +++ b/.env.example @@ -1,19 +1,56 @@ +# [[AUTH]] NEXTAUTH_URL="http://localhost:3000" NEXTAUTH_SECRET="secret" +# [[APP]] NEXT_PUBLIC_SITE_URL="http://localhost:3000" NEXT_PUBLIC_APP_URL="http://localhost:3000" +# [[DATABASE]] NEXT_PRIVATE_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +# [[SMTP]] +# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels +NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth" +# OPTIONAL: Defines the host to use for sending emails. +NEXT_PRIVATE_SMTP_HOST="127.0.0.1" +# OPTIONAL: Defines the port to use for sending emails. +NEXT_PRIVATE_SMTP_PORT=2500 +# OPTIONAL: Defines the username to use with the SMTP server. +NEXT_PRIVATE_SMTP_USERNAME="documenso" +# OPTIONAL: Defines the password to use with the SMTP server. +NEXT_PRIVATE_SMTP_PASSWORD="password" +# OPTIONAL: Defines the API key user to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY_USER= +# OPTIONAL: Defines the API key to use with the SMTP server. +NEXT_PRIVATE_SMTP_APIKEY= +# OPTIONAL: Defines whether to force the use of TLS. +NEXT_PRIVATE_SMTP_SECURE= +# REQUIRED: Defines the sender name to use for the from address. +NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" +# REQUIRED: Defines the email address to use as the from address. +NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" +# OPTIONAL: The API key to use for the MailChannels proxy endpoint. +NEXT_PRIVATE_MAILCHANNELS_API_KEY= +# OPTIONAL: The endpoint to use for the MailChannels API if using a proxy. +NEXT_PRIVATE_MAILCHANNELS_ENDPOINT= +# OPTIONAL: The domain to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN= +# OPTIONAL: The selector to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR= +# OPTIONAL: The private key to use for DKIM signing. +NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY= + +# [[STRIPE]] +NEXT_PRIVATE_STRIPE_API_KEY= +NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID= NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID= -NEXT_PRIVATE_STRIPE_API_KEY= -NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET= - +# [[FEATURES]] NEXT_PUBLIC_SUBSCRIPTIONS_ENABLED=false # This is only required for the marketing site +# [[REDIS]] NEXT_PRIVATE_REDIS_URL= NEXT_PRIVATE_REDIS_TOKEN= diff --git a/apps/marketing/package.json b/apps/marketing/package.json index e34c66b99..523a23a90 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -18,7 +18,7 @@ "framer-motion": "^10.12.8", "lucide-react": "^0.214.0", "micro": "^10.0.1", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "perfect-freehand": "^1.2.0", diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b57b41780..09760f806 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -7,9 +7,23 @@ const { parsed: env } = require('dotenv').config({ /** @type {import('next').NextConfig} */ const config = { + experimental: { + serverActions: true, + }, reactStrictMode: true, - transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + transpilePackages: [ + '@documenso/lib', + '@documenso/prisma', + '@documenso/trpc', + '@documenso/ui', + '@documenso/email', + ], env, + modularizeImports: { + 'lucide-react': { + transform: 'lucide-react/dist/esm/icons/{{ kebabCase member }}', + }, + }, }; module.exports = config; diff --git a/apps/web/package.json b/apps/web/package.json index d493b92d9..32d0d61b3 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -22,7 +22,7 @@ "lucide-react": "^0.214.0", "micro": "^10.0.1", "nanoid": "^4.0.2", - "next": "13.4.1", + "next": "13.4.9", "next-auth": "^4.22.1", "next-plausible": "^3.7.2", "next-themes": "^0.2.1", diff --git a/apps/web/public/static/clock.png b/apps/web/public/static/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8ee6481710523491c43e23e9c2d2bbb83c2f36 GIT binary patch literal 2469 zcmV;W30n4vP)@~0drDELIAGL9O(c600d`2O+f$vv5yP-TlZitkmWe;`@bCaU0Myjf)YRNp5Gu^>H`m(` zUT=FK9!r63Ale3kHUOzV>fd*uk$N^#Zxj%~NJ#n>1q?&c46eRv4WXh`N`NOPGBd96W}1Swqru5=`NCV}?dRk)D=1PutAugeyr6ahM2YEQ)b zeL(R{nUoHc3Br&_zP>to)Q1vSsQ_H@*WSkiBzd^P)^3X$J7jOwLaa=H&rUuZ2%>HU zD}J7p3Q@QKY~u;&xO7vKouJvor-T1(1yCS`2@u=)@v-{y5Y`w%>|VXx>OnyiBEWyT zW8V{Wp}zDX7c@fU*Mr0#N&PL509t9@ut@5&1wK|^cOXB7 z^#sxl$yH7wGbp94YXPLyV8Gpxix?Sxh2MzumrA6k~0DJUcG;#e%wA}f-4?gH|W8siYdd4sCkR66OmJdr3J`1 z;I3p+jd8>z|GvIh_e>K7XWo*^cX8_N4djlu#U46kY1` z1!N@dnl_bBJ=c}b@IblX^V^df)hiss@4)Y3QM5go&;^HJAOo2MV7m_%b}?@G54%tR zS}%oQ8w!Bmh2P1ds6UN=Sz|2#cYT{dm+f&8E#H#DLfz3jAr35x9`bA(EU^|~>J^v> zTH#ji$w^gdh9AEGUd}WSh2Jf)5@7e$yL~X49vVfiX2~<#A{li5H3}s@jpsBP)Y`{q z(R{*;l>i9BLQ(9ki=Ur|U%LE`XdIMP#U9%X$VLHdTEFu3OMebxHKD=JB9?gXUgf z6u_qStJsc{$ly8=hVa~Eiqs7Gz|;%00$83UxuHaR zkr_%A0K@Cl!nX*D-o3C+#C2gZL$Z_hINb!HryaSK`58dX9gJp3M0=7FqzgdO;QiF* zCxOWfEeMq-1c>dwe!-(l$DzRtwRgMM2@w(kcyi){243TZngr|(@%c1e8BbUU zK+>?PB;~JAlL|`uQTKgHF+<5QK;UE0{SXuZ)TBa&9zdS=&-rJ`9$>Kl$fpf!QW1!O zwm^z=lk5RRK4_4kx3Mc;d6|Sl-#97RxKrFvef+xhNmywCvMh*~fQVIk56VQmZJ(}++aHjCj4 zDOd>JJ!mMB_`TBx;YxcsJkW(w>>%cd$QC4oXnLl7Ko$a^zIBB+vXBk1Szr-VK=7#& z;i)SjT=Z-qL&GFCIa5vwAVC}Jk%T@}1dhtO5@Ir;w|PY%3bl<>O8RsDSwa9b*jFU! zL&b0;MDFti(dm2*sNm2f z)v(mwm3mAy$|yqmBT4)c_2PVtO?{DU>{y#1yNyQcWrm8xWPTJuTIDl~H|JXHcdWWM zv(fm>8L7i6 zsRz>V^5w&wMc>x12T*A8i|=(Wn6`djSB6Mv4{&IE0A~!Dh}Lh0b>c#jWK^AL>;KJA zEVw*+@TsnVwg*@p!6_(7M%58f(hxmlcb-^})e)QwC&M=Z&X;77M<}>D+Ugt1m<5P7 zo!XuZFL}9g6|m_MHc3k?>Wr~Y*ks`mF@f@mb~e>3nxS`I3oaUuYdA;s@)0wqMh3?XveY38W%8D|1883*RO2=ivG6)wOG&Otg&0_#JiS?ygnD-&Qwb%iMBYOR$EFoT57{|F0L+r<}K(r z1Wu?V#Gp#Mx+^8XJS>PO(T}otMTw-4ud4Oqj4t!yM1!ZQXf@~0drDELIAGL9O(c600d`2O+f$vv5yPZn*yv062oR^}=5A2@63X(LB zR!>kK!9|fGCdHl3P?jQzvlJOk_bgGf@(T-BkL4dceuC&V}rEmgR z=