Openstatus www.openstatus.dev
6
fork

Configure Feed

Select the types of activity you want to include in your feed.

Refactor/waitlist (#1)

* chore: add resend, upstash and toast

* fix: missing env

* fix: resend env

authored by

Maximilian Kaske and committed by
mxkaske
134bc953 7ce6e25d

+1032 -77
+8 -1
apps/web/.env.example
··· 8 8 NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/ 9 9 10 10 # TinyBird 11 - TINY_BIRD_API_KEY= 11 + TINY_BIRD_API_KEY= 12 + 13 + # Resend 14 + RESEND_API_KEY= 15 + 16 + # Upstash 17 + UPSTASH_REDIS_REST_URL= 18 + UPSTASH_REDIS_REST_TOKEN=
+4 -1
apps/web/package.json
··· 12 12 "@clerk/nextjs": "^4.21.3", 13 13 "@t3-oss/env-nextjs": "^0.4.1", 14 14 "@radix-ui/react-slot": "^1.0.2", 15 + "@radix-ui/react-toast": "^1.1.4", 16 + "@upstash/redis": "^1.21.0", 15 17 "class-variance-authority": "^0.6.0", 16 18 "clsx": "^1.2.1", 17 19 "lucide-react": "^0.244.0", 20 + "next": "13.4.6", 18 21 "next-plausible": "3.7.2", 19 - "next": "13.4.6", 20 22 "react": "18.2.0", 21 23 "react-dom": "18.2.0", 24 + "resend": "^0.15.3", 22 25 "tailwind-merge": "^1.13.2", 23 26 "tailwindcss-animate": "^1.0.6", 24 27 "ui": "workspace:*",
+40 -2
apps/web/src/app/action.ts
··· 1 1 "use server"; 2 2 3 - export async function waitlist(data: FormData) { 3 + import { Resend } from "resend"; 4 + import { Redis } from "@upstash/redis"; 5 + 6 + const redis = Redis.fromEnv(); 7 + 8 + const resend = new Resend(process.env.RESEND_API_KEY); 9 + 10 + export async function addToWaitlist(data: FormData) { 4 11 const email = data.get("email"); 5 12 if (email) { 6 - await wait(3000); 13 + const number = await write(email); 14 + await wait(500); 7 15 // TODO: save email to Highstorm 16 + 17 + // REMINDER: how to send emails in server action 18 + // send(email) 19 + return number; 8 20 } 9 21 return; 10 22 } 11 23 24 + // Upstash 25 + const write = async (email) => { 26 + const key = "waitlist"; 27 + const res = await redis 28 + .pipeline() 29 + .zadd(key, { 30 + score: Date.now(), 31 + member: email, 32 + }) 33 + .zcard(key) 34 + .exec(); 35 + return res[1]; 36 + }; 37 + 38 + // MOCK 12 39 const wait = (ms: number): Promise<void> => { 13 40 return new Promise((resolve) => { 14 41 setTimeout(() => { ··· 16 43 }, ms); 17 44 }); 18 45 }; 46 + 47 + // Resend 48 + const send = async (email) => { 49 + return await resend.emails.send({ 50 + from: "onboarding@openstatus.dev", 51 + to: "maximilian@kaske.org", 52 + subject: "Hello world", 53 + // @ts-ignore FIXME: 54 + react: EmailTemplate({ firstName: "John" }), 55 + }); 56 + };
+21
apps/web/src/app/api/send/route.ts
··· 1 + import { EmailTemplate } from "@/components/templates/email-template"; 2 + import { NextResponse } from "next/server"; 3 + import { Resend } from "resend"; 4 + 5 + const resend = new Resend(process.env.RESEND_API_KEY); 6 + 7 + export async function POST() { 8 + try { 9 + const data = await resend.emails.send({ 10 + from: "onboarding@openstatus.dev", 11 + to: "maximilian@kaske.org", 12 + subject: "Hello world", 13 + // @ts-ignore FIXME: 14 + react: EmailTemplate({ firstName: "John" }), 15 + }); 16 + 17 + return NextResponse.json(data); 18 + } catch (error) { 19 + return NextResponse.json({ error }); 20 + } 21 + }
apps/web/src/app/components/background.tsx apps/web/src/app/_components/background.tsx
+1
apps/web/src/app/components/submit-button.tsx apps/web/src/app/_components/submit-button.tsx
··· 12 12 className="w-20 disabled:opacity-100" 13 13 > 14 14 {pending ? ( 15 + // TODO: move into separate file `LoadingAnimation` 15 16 <div className="flex items-center justify-center gap-1"> 16 17 <div className="h-1 w-1 animate-pulse direction-alternate duration-700 rounded-full bg-primary-foreground" /> 17 18 <div className="h-1 w-1 animate-pulse direction-alternate duration-700 delay-150 rounded-full bg-primary-foreground" />
+2 -2
apps/web/src/app/layout.tsx
··· 2 2 import { ClerkProvider } from "@clerk/nextjs"; 3 3 import { Inter } from "next/font/google"; 4 4 import LocalFont from "next/font/local"; 5 - 6 5 import PlausibleProvider from "next-plausible"; 7 - import Background from "./components/background"; 6 + import Background from "./_components/background"; 7 + import { Toaster } from "@/components/ui/toaster"; 8 8 9 9 const inter = Inter({ subsets: ["latin"] }); 10 10
+21 -3
apps/web/src/app/page.tsx
··· 1 + "use client"; 2 + 1 3 import { Badge } from "@/components/ui/badge"; 2 4 import { Input } from "@/components/ui/input"; 3 - import { waitlist } from "./action"; 4 - import { SubmitButton } from "./components/submit-button"; 5 + import { addToWaitlist } from "./action"; 6 + import { SubmitButton } from "./_components/submit-button"; 7 + import { toast } from "@/components/ui/use-toast"; 5 8 6 9 export default function Page() { 7 10 return ( ··· 16 19 <p className="text-muted-foreground mb-4"> 17 20 Your Open Source Status Page. 18 21 </p> 19 - <form action={waitlist} className="flex gap-1.5"> 22 + <form 23 + action={async (data) => { 24 + try { 25 + const number = await addToWaitlist(data); 26 + const formattedNumber = Intl.NumberFormat().format(number); 27 + toast({ 28 + description: `Thank you, you're number ${formattedNumber} on the list.`, 29 + }); 30 + } catch (e) { 31 + toast({ 32 + description: "Something went wrong", 33 + }); 34 + } 35 + }} 36 + className="flex gap-1.5" 37 + > 20 38 <Input 21 39 id="email" 22 40 name="email"
-65
apps/web/src/components/home/hero.tsx
··· 1 - export const Hero = () => { 2 - return ( 3 - <div className="relative isolate px-6 pt-14 lg:px-8"> 4 - <div 5 - className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80" 6 - aria-hidden="true" 7 - > 8 - <div 9 - className="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]" 10 - style={{ 11 - clipPath: 12 - "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)", 13 - }} 14 - /> 15 - </div> 16 - <div className="mx-auto max-w-2xl py-32 sm:py-48 lg:py-56"> 17 - <div className="hidden sm:mb-8 sm:flex sm:justify-center"> 18 - <div className="relative rounded-full px-3 py-1 text-sm leading-6 text-gray-600 ring-1 ring-gray-900/10 hover:ring-gray-900/20"> 19 - Announcing our next round of funding.{" "} 20 - <a href="#" className="font-semibold text-indigo-600"> 21 - <span className="absolute inset-0" aria-hidden="true" /> 22 - Read more <span aria-hidden="true">&rarr;</span> 23 - </a> 24 - </div> 25 - </div> 26 - <div className="text-center"> 27 - <h1 className="text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl font-cal"> 28 - Data to enrich your online business 29 - </h1> 30 - <p className="mt-6 text-lg leading-8 text-gray-600"> 31 - Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui 32 - lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat 33 - fugiat aliqua. 34 - </p> 35 - <div className="mt-10 flex items-center justify-center gap-x-6"> 36 - <a 37 - href="#" 38 - className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" 39 - > 40 - Get started 41 - </a> 42 - <a 43 - href="#" 44 - className="text-sm font-semibold leading-6 text-gray-900" 45 - > 46 - Learn more <span aria-hidden="true">→</span> 47 - </a> 48 - </div> 49 - </div> 50 - </div> 51 - <div 52 - className="absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]" 53 - aria-hidden="true" 54 - > 55 - <div 56 - className="relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]" 57 - style={{ 58 - clipPath: 59 - "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)", 60 - }} 61 - /> 62 - </div> 63 - </div> 64 - ); 65 - };
+14
apps/web/src/components/templates/email-template.tsx
··· 1 + import * as React from "react"; 2 + 3 + interface EmailTemplateProps { 4 + firstName: string; 5 + } 6 + 7 + // TODO: rename and content 8 + export const EmailTemplate: React.FC<Readonly<EmailTemplateProps>> = ({ 9 + firstName, 10 + }) => ( 11 + <div> 12 + <h1>Welcome, {firstName}!</h1> 13 + </div> 14 + );
+127
apps/web/src/components/ui/toast.tsx
··· 1 + import * as React from "react" 2 + import * as ToastPrimitives from "@radix-ui/react-toast" 3 + import { cva, type VariantProps } from "class-variance-authority" 4 + import { X } from "lucide-react" 5 + 6 + import { cn } from "@/lib/utils" 7 + 8 + const ToastProvider = ToastPrimitives.Provider 9 + 10 + const ToastViewport = React.forwardRef< 11 + React.ElementRef<typeof ToastPrimitives.Viewport>, 12 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport> 13 + >(({ className, ...props }, ref) => ( 14 + <ToastPrimitives.Viewport 15 + ref={ref} 16 + className={cn( 17 + "fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]", 18 + className 19 + )} 20 + {...props} 21 + /> 22 + )) 23 + ToastViewport.displayName = ToastPrimitives.Viewport.displayName 24 + 25 + const toastVariants = cva( 26 + "data-[swipe=move]:transition-none group relative pointer-events-auto flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full data-[state=closed]:slide-out-to-right-full", 27 + { 28 + variants: { 29 + variant: { 30 + default: "bg-background border", 31 + destructive: 32 + "group destructive border-destructive bg-destructive text-destructive-foreground", 33 + }, 34 + }, 35 + defaultVariants: { 36 + variant: "default", 37 + }, 38 + } 39 + ) 40 + 41 + const Toast = React.forwardRef< 42 + React.ElementRef<typeof ToastPrimitives.Root>, 43 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & 44 + VariantProps<typeof toastVariants> 45 + >(({ className, variant, ...props }, ref) => { 46 + return ( 47 + <ToastPrimitives.Root 48 + ref={ref} 49 + className={cn(toastVariants({ variant }), className)} 50 + {...props} 51 + /> 52 + ) 53 + }) 54 + Toast.displayName = ToastPrimitives.Root.displayName 55 + 56 + const ToastAction = React.forwardRef< 57 + React.ElementRef<typeof ToastPrimitives.Action>, 58 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action> 59 + >(({ className, ...props }, ref) => ( 60 + <ToastPrimitives.Action 61 + ref={ref} 62 + className={cn( 63 + "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-destructive/30 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive", 64 + className 65 + )} 66 + {...props} 67 + /> 68 + )) 69 + ToastAction.displayName = ToastPrimitives.Action.displayName 70 + 71 + const ToastClose = React.forwardRef< 72 + React.ElementRef<typeof ToastPrimitives.Close>, 73 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close> 74 + >(({ className, ...props }, ref) => ( 75 + <ToastPrimitives.Close 76 + ref={ref} 77 + className={cn( 78 + "absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600", 79 + className 80 + )} 81 + toast-close="" 82 + {...props} 83 + > 84 + <X className="h-4 w-4" /> 85 + </ToastPrimitives.Close> 86 + )) 87 + ToastClose.displayName = ToastPrimitives.Close.displayName 88 + 89 + const ToastTitle = React.forwardRef< 90 + React.ElementRef<typeof ToastPrimitives.Title>, 91 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title> 92 + >(({ className, ...props }, ref) => ( 93 + <ToastPrimitives.Title 94 + ref={ref} 95 + className={cn("text-sm font-semibold", className)} 96 + {...props} 97 + /> 98 + )) 99 + ToastTitle.displayName = ToastPrimitives.Title.displayName 100 + 101 + const ToastDescription = React.forwardRef< 102 + React.ElementRef<typeof ToastPrimitives.Description>, 103 + React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description> 104 + >(({ className, ...props }, ref) => ( 105 + <ToastPrimitives.Description 106 + ref={ref} 107 + className={cn("text-sm opacity-90", className)} 108 + {...props} 109 + /> 110 + )) 111 + ToastDescription.displayName = ToastPrimitives.Description.displayName 112 + 113 + type ToastProps = React.ComponentPropsWithoutRef<typeof Toast> 114 + 115 + type ToastActionElement = React.ReactElement<typeof ToastAction> 116 + 117 + export { 118 + type ToastProps, 119 + type ToastActionElement, 120 + ToastProvider, 121 + ToastViewport, 122 + Toast, 123 + ToastTitle, 124 + ToastDescription, 125 + ToastClose, 126 + ToastAction, 127 + }
+35
apps/web/src/components/ui/toaster.tsx
··· 1 + "use client"; 2 + 3 + import { 4 + Toast, 5 + ToastClose, 6 + ToastDescription, 7 + ToastProvider, 8 + ToastTitle, 9 + ToastViewport, 10 + } from "@/components/ui/toast"; 11 + import { useToast } from "@/components/ui/use-toast"; 12 + 13 + export function Toaster() { 14 + const { toasts } = useToast(); 15 + 16 + return ( 17 + <ToastProvider> 18 + {toasts.map(function ({ id, title, description, action, ...props }) { 19 + return ( 20 + <Toast key={id} {...props}> 21 + <div className="grid gap-1"> 22 + {title && <ToastTitle>{title}</ToastTitle>} 23 + {description && ( 24 + <ToastDescription>{description}</ToastDescription> 25 + )} 26 + </div> 27 + {action} 28 + <ToastClose /> 29 + </Toast> 30 + ); 31 + })} 32 + <ToastViewport /> 33 + </ToastProvider> 34 + ); 35 + }
+189
apps/web/src/components/ui/use-toast.ts
··· 1 + // Inspired by react-hot-toast library 2 + import * as React from "react" 3 + 4 + import type { ToastActionElement, ToastProps } from "@/components/ui/toast" 5 + 6 + const TOAST_LIMIT = 1 7 + const TOAST_REMOVE_DELAY = 1000000 8 + 9 + type ToasterToast = ToastProps & { 10 + id: string 11 + title?: React.ReactNode 12 + description?: React.ReactNode 13 + action?: ToastActionElement 14 + } 15 + 16 + const actionTypes = { 17 + ADD_TOAST: "ADD_TOAST", 18 + UPDATE_TOAST: "UPDATE_TOAST", 19 + DISMISS_TOAST: "DISMISS_TOAST", 20 + REMOVE_TOAST: "REMOVE_TOAST", 21 + } as const 22 + 23 + let count = 0 24 + 25 + function genId() { 26 + count = (count + 1) % Number.MAX_VALUE 27 + return count.toString() 28 + } 29 + 30 + type ActionType = typeof actionTypes 31 + 32 + type Action = 33 + | { 34 + type: ActionType["ADD_TOAST"] 35 + toast: ToasterToast 36 + } 37 + | { 38 + type: ActionType["UPDATE_TOAST"] 39 + toast: Partial<ToasterToast> 40 + } 41 + | { 42 + type: ActionType["DISMISS_TOAST"] 43 + toastId?: ToasterToast["id"] 44 + } 45 + | { 46 + type: ActionType["REMOVE_TOAST"] 47 + toastId?: ToasterToast["id"] 48 + } 49 + 50 + interface State { 51 + toasts: ToasterToast[] 52 + } 53 + 54 + const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>() 55 + 56 + const addToRemoveQueue = (toastId: string) => { 57 + if (toastTimeouts.has(toastId)) { 58 + return 59 + } 60 + 61 + const timeout = setTimeout(() => { 62 + toastTimeouts.delete(toastId) 63 + dispatch({ 64 + type: "REMOVE_TOAST", 65 + toastId: toastId, 66 + }) 67 + }, TOAST_REMOVE_DELAY) 68 + 69 + toastTimeouts.set(toastId, timeout) 70 + } 71 + 72 + export const reducer = (state: State, action: Action): State => { 73 + switch (action.type) { 74 + case "ADD_TOAST": 75 + return { 76 + ...state, 77 + toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT), 78 + } 79 + 80 + case "UPDATE_TOAST": 81 + return { 82 + ...state, 83 + toasts: state.toasts.map((t) => 84 + t.id === action.toast.id ? { ...t, ...action.toast } : t 85 + ), 86 + } 87 + 88 + case "DISMISS_TOAST": { 89 + const { toastId } = action 90 + 91 + // ! Side effects ! - This could be extracted into a dismissToast() action, 92 + // but I'll keep it here for simplicity 93 + if (toastId) { 94 + addToRemoveQueue(toastId) 95 + } else { 96 + state.toasts.forEach((toast) => { 97 + addToRemoveQueue(toast.id) 98 + }) 99 + } 100 + 101 + return { 102 + ...state, 103 + toasts: state.toasts.map((t) => 104 + t.id === toastId || toastId === undefined 105 + ? { 106 + ...t, 107 + open: false, 108 + } 109 + : t 110 + ), 111 + } 112 + } 113 + case "REMOVE_TOAST": 114 + if (action.toastId === undefined) { 115 + return { 116 + ...state, 117 + toasts: [], 118 + } 119 + } 120 + return { 121 + ...state, 122 + toasts: state.toasts.filter((t) => t.id !== action.toastId), 123 + } 124 + } 125 + } 126 + 127 + const listeners: Array<(state: State) => void> = [] 128 + 129 + let memoryState: State = { toasts: [] } 130 + 131 + function dispatch(action: Action) { 132 + memoryState = reducer(memoryState, action) 133 + listeners.forEach((listener) => { 134 + listener(memoryState) 135 + }) 136 + } 137 + 138 + type Toast = Omit<ToasterToast, "id"> 139 + 140 + function toast({ ...props }: Toast) { 141 + const id = genId() 142 + 143 + const update = (props: ToasterToast) => 144 + dispatch({ 145 + type: "UPDATE_TOAST", 146 + toast: { ...props, id }, 147 + }) 148 + const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id }) 149 + 150 + dispatch({ 151 + type: "ADD_TOAST", 152 + toast: { 153 + ...props, 154 + id, 155 + open: true, 156 + onOpenChange: (open) => { 157 + if (!open) dismiss() 158 + }, 159 + }, 160 + }) 161 + 162 + return { 163 + id: id, 164 + dismiss, 165 + update, 166 + } 167 + } 168 + 169 + function useToast() { 170 + const [state, setState] = React.useState<State>(memoryState) 171 + 172 + React.useEffect(() => { 173 + listeners.push(setState) 174 + return () => { 175 + const index = listeners.indexOf(setState) 176 + if (index > -1) { 177 + listeners.splice(index, 1) 178 + } 179 + } 180 + }, [state]) 181 + 182 + return { 183 + ...state, 184 + toast, 185 + dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }), 186 + } 187 + } 188 + 189 + export { useToast, toast }
+569 -3
pnpm-lock.yaml
··· 69 69 '@radix-ui/react-slot': 70 70 specifier: ^1.0.2 71 71 version: 1.0.2(@types/react@18.2.12)(react@18.2.0) 72 + '@radix-ui/react-toast': 73 + specifier: ^1.1.4 74 + version: 1.1.4(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 72 75 '@t3-oss/env-nextjs': 73 76 specifier: ^0.4.1 74 77 version: 0.4.1(typescript@5.1.3)(zod@3.21.4) 78 + '@upstash/redis': 79 + specifier: ^1.21.0 80 + version: 1.21.0 75 81 class-variance-authority: 76 82 specifier: ^0.6.0 77 83 version: 0.6.0(typescript@5.1.3) ··· 93 99 react-dom: 94 100 specifier: 18.2.0 95 101 version: 18.2.0(react@18.2.0) 102 + resend: 103 + specifier: ^0.15.3 104 + version: 0.15.3 96 105 tailwind-merge: 97 106 specifier: ^1.13.2 98 107 version: 1.13.2 ··· 503 512 tslib: 2.5.3 504 513 dev: false 505 514 515 + /@radix-ui/primitive@1.0.1: 516 + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} 517 + dependencies: 518 + '@babel/runtime': 7.22.5 519 + dev: false 520 + 521 + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 522 + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} 523 + peerDependencies: 524 + '@types/react': '*' 525 + '@types/react-dom': '*' 526 + react: ^16.8 || ^17.0 || ^18.0 527 + react-dom: ^16.8 || ^17.0 || ^18.0 528 + peerDependenciesMeta: 529 + '@types/react': 530 + optional: true 531 + '@types/react-dom': 532 + optional: true 533 + dependencies: 534 + '@babel/runtime': 7.22.5 535 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.12)(react@18.2.0) 536 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.12)(react@18.2.0) 537 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 538 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.12)(react@18.2.0) 539 + '@types/react': 18.2.12 540 + '@types/react-dom': 18.2.5 541 + react: 18.2.0 542 + react-dom: 18.2.0(react@18.2.0) 543 + dev: false 544 + 506 545 /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.12)(react@18.2.0): 507 546 resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 508 547 peerDependencies: ··· 517 556 react: 18.2.0 518 557 dev: false 519 558 559 + /@radix-ui/react-context@1.0.1(@types/react@18.2.12)(react@18.2.0): 560 + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 561 + peerDependencies: 562 + '@types/react': '*' 563 + react: ^16.8 || ^17.0 || ^18.0 564 + peerDependenciesMeta: 565 + '@types/react': 566 + optional: true 567 + dependencies: 568 + '@babel/runtime': 7.22.5 569 + '@types/react': 18.2.12 570 + react: 18.2.0 571 + dev: false 572 + 573 + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 574 + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} 575 + peerDependencies: 576 + '@types/react': '*' 577 + '@types/react-dom': '*' 578 + react: ^16.8 || ^17.0 || ^18.0 579 + react-dom: ^16.8 || ^17.0 || ^18.0 580 + peerDependenciesMeta: 581 + '@types/react': 582 + optional: true 583 + '@types/react-dom': 584 + optional: true 585 + dependencies: 586 + '@babel/runtime': 7.22.5 587 + '@radix-ui/primitive': 1.0.1 588 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.12)(react@18.2.0) 589 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 590 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.12)(react@18.2.0) 591 + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.12)(react@18.2.0) 592 + '@types/react': 18.2.12 593 + '@types/react-dom': 18.2.5 594 + react: 18.2.0 595 + react-dom: 18.2.0(react@18.2.0) 596 + dev: false 597 + 598 + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 599 + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} 600 + peerDependencies: 601 + '@types/react': '*' 602 + '@types/react-dom': '*' 603 + react: ^16.8 || ^17.0 || ^18.0 604 + react-dom: ^16.8 || ^17.0 || ^18.0 605 + peerDependenciesMeta: 606 + '@types/react': 607 + optional: true 608 + '@types/react-dom': 609 + optional: true 610 + dependencies: 611 + '@babel/runtime': 7.22.5 612 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 613 + '@types/react': 18.2.12 614 + '@types/react-dom': 18.2.5 615 + react: 18.2.0 616 + react-dom: 18.2.0(react@18.2.0) 617 + dev: false 618 + 619 + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 620 + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} 621 + peerDependencies: 622 + '@types/react': '*' 623 + '@types/react-dom': '*' 624 + react: ^16.8 || ^17.0 || ^18.0 625 + react-dom: ^16.8 || ^17.0 || ^18.0 626 + peerDependenciesMeta: 627 + '@types/react': 628 + optional: true 629 + '@types/react-dom': 630 + optional: true 631 + dependencies: 632 + '@babel/runtime': 7.22.5 633 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.12)(react@18.2.0) 634 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.12)(react@18.2.0) 635 + '@types/react': 18.2.12 636 + '@types/react-dom': 18.2.5 637 + react: 18.2.0 638 + react-dom: 18.2.0(react@18.2.0) 639 + dev: false 640 + 641 + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 642 + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 643 + peerDependencies: 644 + '@types/react': '*' 645 + '@types/react-dom': '*' 646 + react: ^16.8 || ^17.0 || ^18.0 647 + react-dom: ^16.8 || ^17.0 || ^18.0 648 + peerDependenciesMeta: 649 + '@types/react': 650 + optional: true 651 + '@types/react-dom': 652 + optional: true 653 + dependencies: 654 + '@babel/runtime': 7.22.5 655 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.12)(react@18.2.0) 656 + '@types/react': 18.2.12 657 + '@types/react-dom': 18.2.5 658 + react: 18.2.0 659 + react-dom: 18.2.0(react@18.2.0) 660 + dev: false 661 + 520 662 /@radix-ui/react-slot@1.0.2(@types/react@18.2.12)(react@18.2.0): 521 663 resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 522 664 peerDependencies: ··· 532 674 react: 18.2.0 533 675 dev: false 534 676 677 + /@radix-ui/react-toast@1.1.4(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 678 + resolution: {integrity: sha512-wf+fc8DOywrpRK3jlPlWVe+ELYGHdKDaaARJZNuUTWyWYq7+ANCFLp4rTjZ/mcGkJJQ/vZ949Zis9xxEpfq9OA==} 679 + peerDependencies: 680 + '@types/react': '*' 681 + '@types/react-dom': '*' 682 + react: ^16.8 || ^17.0 || ^18.0 683 + react-dom: ^16.8 || ^17.0 || ^18.0 684 + peerDependenciesMeta: 685 + '@types/react': 686 + optional: true 687 + '@types/react-dom': 688 + optional: true 689 + dependencies: 690 + '@babel/runtime': 7.22.5 691 + '@radix-ui/primitive': 1.0.1 692 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 693 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.12)(react@18.2.0) 694 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.12)(react@18.2.0) 695 + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 696 + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 697 + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 698 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 699 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.12)(react@18.2.0) 700 + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.12)(react@18.2.0) 701 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.12)(react@18.2.0) 702 + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 703 + '@types/react': 18.2.12 704 + '@types/react-dom': 18.2.5 705 + react: 18.2.0 706 + react-dom: 18.2.0(react@18.2.0) 707 + dev: false 708 + 709 + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.12)(react@18.2.0): 710 + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 711 + peerDependencies: 712 + '@types/react': '*' 713 + react: ^16.8 || ^17.0 || ^18.0 714 + peerDependenciesMeta: 715 + '@types/react': 716 + optional: true 717 + dependencies: 718 + '@babel/runtime': 7.22.5 719 + '@types/react': 18.2.12 720 + react: 18.2.0 721 + dev: false 722 + 723 + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.12)(react@18.2.0): 724 + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} 725 + peerDependencies: 726 + '@types/react': '*' 727 + react: ^16.8 || ^17.0 || ^18.0 728 + peerDependenciesMeta: 729 + '@types/react': 730 + optional: true 731 + dependencies: 732 + '@babel/runtime': 7.22.5 733 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.12)(react@18.2.0) 734 + '@types/react': 18.2.12 735 + react: 18.2.0 736 + dev: false 737 + 738 + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.12)(react@18.2.0): 739 + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} 740 + peerDependencies: 741 + '@types/react': '*' 742 + react: ^16.8 || ^17.0 || ^18.0 743 + peerDependenciesMeta: 744 + '@types/react': 745 + optional: true 746 + dependencies: 747 + '@babel/runtime': 7.22.5 748 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.12)(react@18.2.0) 749 + '@types/react': 18.2.12 750 + react: 18.2.0 751 + dev: false 752 + 753 + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.12)(react@18.2.0): 754 + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 755 + peerDependencies: 756 + '@types/react': '*' 757 + react: ^16.8 || ^17.0 || ^18.0 758 + peerDependenciesMeta: 759 + '@types/react': 760 + optional: true 761 + dependencies: 762 + '@babel/runtime': 7.22.5 763 + '@types/react': 18.2.12 764 + react: 18.2.0 765 + dev: false 766 + 767 + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0): 768 + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} 769 + peerDependencies: 770 + '@types/react': '*' 771 + '@types/react-dom': '*' 772 + react: ^16.8 || ^17.0 || ^18.0 773 + react-dom: ^16.8 || ^17.0 || ^18.0 774 + peerDependenciesMeta: 775 + '@types/react': 776 + optional: true 777 + '@types/react-dom': 778 + optional: true 779 + dependencies: 780 + '@babel/runtime': 7.22.5 781 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.12)(react-dom@18.2.0)(react@18.2.0) 782 + '@types/react': 18.2.12 783 + '@types/react-dom': 18.2.5 784 + react: 18.2.0 785 + react-dom: 18.2.0(react@18.2.0) 786 + dev: false 787 + 788 + /@react-email/render@0.0.7: 789 + resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} 790 + engines: {node: '>=16.0.0'} 791 + dependencies: 792 + html-to-text: 9.0.3 793 + pretty: 2.0.0 794 + react: 18.2.0 795 + react-dom: 18.2.0(react@18.2.0) 796 + dev: false 797 + 535 798 /@rushstack/eslint-patch@1.3.2: 536 799 resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} 537 800 dev: false 538 801 802 + /@selderee/plugin-htmlparser2@0.10.0: 803 + resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} 804 + dependencies: 805 + domhandler: 5.0.3 806 + selderee: 0.10.0 807 + dev: false 808 + 539 809 /@swc/helpers@0.5.1: 540 810 resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} 541 811 dependencies: ··· 703 973 resolution: {integrity: sha512-sRQsOS/sCLnpQhR4DSKGTtWFE3FZjpQa86KPVbhUqdYMRZ9FEFcfAytKhR/vUG2rH1oFbOOej6cuD7MFSobDRQ==} 704 974 dependencies: 705 975 '@types/react': 18.2.12 706 - dev: true 707 976 708 977 /@types/react@18.2.12: 709 978 resolution: {integrity: sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==} ··· 797 1066 eslint-visitor-keys: 3.4.1 798 1067 dev: false 799 1068 1069 + /@upstash/redis@1.21.0: 1070 + resolution: {integrity: sha512-c6M+cl0LOgGK/7Gp6ooMkIZ1IDAJs8zFR+REPkoSkAq38o7CWFX5FYwYEqGZ6wJpUGBuEOr/7hTmippXGgL25A==} 1071 + dependencies: 1072 + isomorphic-fetch: 3.0.0 1073 + transitivePeerDependencies: 1074 + - encoding 1075 + dev: false 1076 + 1077 + /abbrev@1.1.1: 1078 + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 1079 + dev: false 1080 + 800 1081 /acorn-jsx@5.3.2(acorn@8.9.0): 801 1082 resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 802 1083 peerDependencies: ··· 975 1256 engines: {node: '>=4'} 976 1257 dev: false 977 1258 1259 + /axios@1.4.0: 1260 + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} 1261 + dependencies: 1262 + follow-redirects: 1.15.2 1263 + form-data: 4.0.0 1264 + proxy-from-env: 1.1.0 1265 + transitivePeerDependencies: 1266 + - debug 1267 + dev: false 1268 + 978 1269 /axobject-query@3.2.1: 979 1270 resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 980 1271 dependencies: ··· 1022 1313 resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1023 1314 dependencies: 1024 1315 balanced-match: 1.0.2 1025 - dev: true 1026 1316 1027 1317 /braces@3.0.2: 1028 1318 resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} ··· 1243 1533 engines: {node: '>=14'} 1244 1534 dev: true 1245 1535 1536 + /commander@2.20.3: 1537 + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1538 + dev: false 1539 + 1246 1540 /commander@4.1.1: 1247 1541 resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1248 1542 engines: {node: '>= 6'} ··· 1250 1544 /concat-map@0.0.1: 1251 1545 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1252 1546 1547 + /condense-newlines@0.2.1: 1548 + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} 1549 + engines: {node: '>=0.10.0'} 1550 + dependencies: 1551 + extend-shallow: 2.0.1 1552 + is-whitespace: 0.3.0 1553 + kind-of: 3.2.2 1554 + dev: false 1555 + 1556 + /config-chain@1.1.13: 1557 + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} 1558 + dependencies: 1559 + ini: 1.3.8 1560 + proto-list: 1.2.4 1561 + dev: false 1562 + 1253 1563 /constant-case@2.0.0: 1254 1564 resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} 1255 1565 dependencies: ··· 1421 1731 dependencies: 1422 1732 esutils: 2.0.3 1423 1733 1734 + /dom-serializer@2.0.0: 1735 + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 1736 + dependencies: 1737 + domelementtype: 2.3.0 1738 + domhandler: 5.0.3 1739 + entities: 4.5.0 1740 + dev: false 1741 + 1742 + /domelementtype@2.3.0: 1743 + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 1744 + dev: false 1745 + 1746 + /domhandler@5.0.3: 1747 + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 1748 + engines: {node: '>= 4'} 1749 + dependencies: 1750 + domelementtype: 2.3.0 1751 + dev: false 1752 + 1753 + /domutils@3.1.0: 1754 + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} 1755 + dependencies: 1756 + dom-serializer: 2.0.0 1757 + domelementtype: 2.3.0 1758 + domhandler: 5.0.3 1759 + dev: false 1760 + 1424 1761 /dot-case@2.1.1: 1425 1762 resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} 1426 1763 dependencies: ··· 1434 1771 tslib: 2.5.3 1435 1772 dev: false 1436 1773 1774 + /editorconfig@0.15.3: 1775 + resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} 1776 + hasBin: true 1777 + dependencies: 1778 + commander: 2.20.3 1779 + lru-cache: 4.1.5 1780 + semver: 5.7.1 1781 + sigmund: 1.0.1 1782 + dev: false 1783 + 1437 1784 /electron-to-chromium@1.4.433: 1438 1785 resolution: {integrity: sha512-MGO1k0w1RgrfdbLVwmXcDhHHuxCn2qRgR7dYsJvWFKDttvYPx6FNzCGG0c/fBBvzK2LDh3UV7Tt9awnHnvAAUQ==} 1439 1786 dev: true ··· 1452 1799 dependencies: 1453 1800 graceful-fs: 4.2.11 1454 1801 tapable: 2.2.1 1802 + dev: false 1803 + 1804 + /entities@4.5.0: 1805 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1806 + engines: {node: '>=0.12'} 1455 1807 dev: false 1456 1808 1457 1809 /es-abstract@1.21.2: ··· 1854 2206 strip-final-newline: 3.0.0 1855 2207 dev: false 1856 2208 2209 + /extend-shallow@2.0.1: 2210 + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 2211 + engines: {node: '>=0.10.0'} 2212 + dependencies: 2213 + is-extendable: 0.1.1 2214 + dev: false 2215 + 1857 2216 /external-editor@3.1.0: 1858 2217 resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 1859 2218 engines: {node: '>=4'} ··· 1923 2282 /flatted@3.2.7: 1924 2283 resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1925 2284 2285 + /follow-redirects@1.15.2: 2286 + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} 2287 + engines: {node: '>=4.0'} 2288 + peerDependencies: 2289 + debug: '*' 2290 + peerDependenciesMeta: 2291 + debug: 2292 + optional: true 2293 + dev: false 2294 + 1926 2295 /for-each@0.3.3: 1927 2296 resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1928 2297 dependencies: ··· 1938 2307 mime-types: 2.1.35 1939 2308 dev: false 1940 2309 2310 + /form-data@4.0.0: 2311 + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 2312 + engines: {node: '>= 6'} 2313 + dependencies: 2314 + asynckit: 0.4.0 2315 + combined-stream: 1.0.8 2316 + mime-types: 2.1.35 2317 + dev: false 2318 + 1941 2319 /fraction.js@4.2.0: 1942 2320 resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1943 2321 dev: true ··· 2053 2431 once: 1.4.0 2054 2432 path-is-absolute: 1.0.1 2055 2433 2434 + /glob@8.1.0: 2435 + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 2436 + engines: {node: '>=12'} 2437 + dependencies: 2438 + fs.realpath: 1.0.0 2439 + inflight: 1.0.6 2440 + inherits: 2.0.4 2441 + minimatch: 5.1.6 2442 + once: 1.4.0 2443 + dev: false 2444 + 2056 2445 /globals@13.20.0: 2057 2446 resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 2058 2447 engines: {node: '>=8'} ··· 2177 2566 upper-case: 1.1.3 2178 2567 dev: true 2179 2568 2569 + /html-to-text@9.0.3: 2570 + resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} 2571 + engines: {node: '>=14'} 2572 + dependencies: 2573 + '@selderee/plugin-htmlparser2': 0.10.0 2574 + deepmerge: 4.2.2 2575 + dom-serializer: 2.0.0 2576 + htmlparser2: 8.0.2 2577 + selderee: 0.10.0 2578 + dev: false 2579 + 2580 + /htmlparser2@8.0.2: 2581 + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} 2582 + dependencies: 2583 + domelementtype: 2.3.0 2584 + domhandler: 5.0.3 2585 + domutils: 3.1.0 2586 + entities: 4.5.0 2587 + dev: false 2588 + 2180 2589 /human-signals@2.1.0: 2181 2590 resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 2182 2591 engines: {node: '>=10.17.0'} ··· 2229 2638 2230 2639 /ini@1.3.8: 2231 2640 resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 2232 - dev: true 2233 2641 2234 2642 /inquirer@7.3.3: 2235 2643 resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} ··· 2308 2716 has-tostringtag: 1.0.0 2309 2717 dev: false 2310 2718 2719 + /is-buffer@1.1.6: 2720 + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 2721 + dev: false 2722 + 2311 2723 /is-callable@1.2.7: 2312 2724 resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 2313 2725 engines: {node: '>= 0.4'} ··· 2337 2749 hasBin: true 2338 2750 dev: false 2339 2751 2752 + /is-extendable@0.1.1: 2753 + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 2754 + engines: {node: '>=0.10.0'} 2755 + dev: false 2756 + 2340 2757 /is-extglob@2.1.1: 2341 2758 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2342 2759 engines: {node: '>=0.10.0'} ··· 2462 2879 call-bind: 1.0.2 2463 2880 dev: false 2464 2881 2882 + /is-whitespace@0.3.0: 2883 + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} 2884 + engines: {node: '>=0.10.0'} 2885 + dev: false 2886 + 2465 2887 /is-wsl@2.2.0: 2466 2888 resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 2467 2889 engines: {node: '>=8'} ··· 2477 2899 /isexe@2.0.0: 2478 2900 resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2479 2901 2902 + /isomorphic-fetch@3.0.0: 2903 + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} 2904 + dependencies: 2905 + node-fetch: 2.6.11 2906 + whatwg-fetch: 3.6.2 2907 + transitivePeerDependencies: 2908 + - encoding 2909 + dev: false 2910 + 2480 2911 /jiti@1.18.2: 2481 2912 resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} 2482 2913 hasBin: true 2483 2914 2915 + /js-beautify@1.14.8: 2916 + resolution: {integrity: sha512-4S7HFeI9YfRvRgKnEweohs0tgJj28InHVIj4Nl8Htf96Y6pHg3+tJrmo4ucAM9f7l4SHbFI3IvFAZ2a1eQPbyg==} 2917 + engines: {node: '>=12'} 2918 + hasBin: true 2919 + dependencies: 2920 + config-chain: 1.1.13 2921 + editorconfig: 0.15.3 2922 + glob: 8.1.0 2923 + nopt: 6.0.0 2924 + dev: false 2925 + 2484 2926 /js-cookie@3.0.1: 2485 2927 resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} 2486 2928 engines: {node: '>=12'} ··· 2524 2966 object.assign: 4.1.4 2525 2967 dev: false 2526 2968 2969 + /kind-of@3.2.2: 2970 + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} 2971 + engines: {node: '>=0.10.0'} 2972 + dependencies: 2973 + is-buffer: 1.1.6 2974 + dev: false 2975 + 2527 2976 /language-subtag-registry@0.3.22: 2528 2977 resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} 2529 2978 dev: false ··· 2534 2983 language-subtag-registry: 0.3.22 2535 2984 dev: false 2536 2985 2986 + /leac@0.6.0: 2987 + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} 2988 + dev: false 2989 + 2537 2990 /levn@0.4.1: 2538 2991 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2539 2992 engines: {node: '>= 0.8.0'} ··· 2594 3047 tslib: 2.5.3 2595 3048 dev: false 2596 3049 3050 + /lru-cache@4.1.5: 3051 + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 3052 + dependencies: 3053 + pseudomap: 1.0.2 3054 + yallist: 2.1.2 3055 + dev: false 3056 + 2597 3057 /lru-cache@6.0.0: 2598 3058 resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2599 3059 engines: {node: '>=10'} ··· 2657 3117 resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2658 3118 dependencies: 2659 3119 brace-expansion: 1.1.11 3120 + 3121 + /minimatch@5.1.6: 3122 + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 3123 + engines: {node: '>=10'} 3124 + dependencies: 3125 + brace-expansion: 2.0.1 3126 + dev: false 2660 3127 2661 3128 /minimatch@9.0.1: 2662 3129 resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} ··· 2777 3244 resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} 2778 3245 dev: false 2779 3246 3247 + /node-fetch@2.6.11: 3248 + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} 3249 + engines: {node: 4.x || >=6.0.0} 3250 + peerDependencies: 3251 + encoding: ^0.1.0 3252 + peerDependenciesMeta: 3253 + encoding: 3254 + optional: true 3255 + dependencies: 3256 + whatwg-url: 5.0.0 3257 + dev: false 3258 + 2780 3259 /node-plop@0.26.3: 2781 3260 resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} 2782 3261 engines: {node: '>=8.9.4'} ··· 2797 3276 /node-releases@2.0.12: 2798 3277 resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} 2799 3278 dev: true 3279 + 3280 + /nopt@6.0.0: 3281 + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} 3282 + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3283 + hasBin: true 3284 + dependencies: 3285 + abbrev: 1.1.1 3286 + dev: false 2800 3287 2801 3288 /normalize-path@3.0.0: 2802 3289 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} ··· 2972 3459 dependencies: 2973 3460 callsites: 3.1.0 2974 3461 3462 + /parseley@0.11.0: 3463 + resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} 3464 + dependencies: 3465 + leac: 0.6.0 3466 + peberminta: 0.8.0 3467 + dev: false 3468 + 2975 3469 /pascal-case@2.0.1: 2976 3470 resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} 2977 3471 dependencies: ··· 3013 3507 resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 3014 3508 engines: {node: '>=8'} 3015 3509 3510 + /peberminta@0.8.0: 3511 + resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} 3512 + dev: false 3513 + 3016 3514 /picocolors@1.0.0: 3017 3515 resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 3018 3516 ··· 3110 3608 hasBin: true 3111 3609 dev: true 3112 3610 3611 + /pretty@2.0.0: 3612 + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} 3613 + engines: {node: '>=0.10.0'} 3614 + dependencies: 3615 + condense-newlines: 0.2.1 3616 + extend-shallow: 2.0.1 3617 + js-beautify: 1.14.8 3618 + dev: false 3619 + 3113 3620 /prop-types@15.8.1: 3114 3621 resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 3115 3622 dependencies: ··· 3118 3625 react-is: 16.13.1 3119 3626 dev: false 3120 3627 3628 + /proto-list@1.2.4: 3629 + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} 3630 + dev: false 3631 + 3632 + /proxy-from-env@1.1.0: 3633 + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 3634 + dev: false 3635 + 3636 + /pseudomap@1.0.2: 3637 + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 3638 + dev: false 3639 + 3121 3640 /punycode@2.3.0: 3122 3641 resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 3123 3642 engines: {node: '>=6'} ··· 3217 3736 rc: 1.2.8 3218 3737 dev: true 3219 3738 3739 + /resend@0.15.3: 3740 + resolution: {integrity: sha512-dzXHBaOjOS3ufBGjqiJjMe7LnproEn/jiAyBjg6IBtp56MCfih0O4IS4JeBcfj3y2Afm+tZITfoZAylKWLEJOg==} 3741 + dependencies: 3742 + '@react-email/render': 0.0.7 3743 + axios: 1.4.0 3744 + transitivePeerDependencies: 3745 + - debug 3746 + dev: false 3747 + 3220 3748 /resolve-from@4.0.0: 3221 3749 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 3222 3750 engines: {node: '>=4'} ··· 3312 3840 loose-envify: 1.4.0 3313 3841 dev: false 3314 3842 3843 + /selderee@0.10.0: 3844 + resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} 3845 + dependencies: 3846 + parseley: 0.11.0 3847 + dev: false 3848 + 3849 + /semver@5.7.1: 3850 + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 3851 + hasBin: true 3852 + dev: false 3853 + 3315 3854 /semver@6.3.0: 3316 3855 resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 3317 3856 hasBin: true ··· 3347 3886 call-bind: 1.0.2 3348 3887 get-intrinsic: 1.2.1 3349 3888 object-inspect: 1.12.3 3889 + dev: false 3890 + 3891 + /sigmund@1.0.1: 3892 + resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} 3350 3893 dev: false 3351 3894 3352 3895 /signal-exit@3.0.7: ··· 3665 4208 to-no-case: 1.0.2 3666 4209 dev: false 3667 4210 4211 + /tr46@0.0.3: 4212 + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 4213 + dev: false 4214 + 3668 4215 /ts-interface-checker@0.1.13: 3669 4216 resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 3670 4217 ··· 3920 4467 tslib: 2.5.3 3921 4468 dev: false 3922 4469 4470 + /webidl-conversions@3.0.1: 4471 + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 4472 + dev: false 4473 + 4474 + /whatwg-fetch@3.6.2: 4475 + resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} 4476 + dev: false 4477 + 4478 + /whatwg-url@5.0.0: 4479 + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 4480 + dependencies: 4481 + tr46: 0.0.3 4482 + webidl-conversions: 3.0.1 4483 + dev: false 4484 + 3923 4485 /which-boxed-primitive@1.0.2: 3924 4486 resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 3925 4487 dependencies: ··· 3968 4530 3969 4531 /wrappy@1.0.2: 3970 4532 resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 4533 + 4534 + /yallist@2.1.2: 4535 + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 4536 + dev: false 3971 4537 3972 4538 /yallist@4.0.0: 3973 4539 resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+1
turbo.json
··· 4 4 "pipeline": { 5 5 "build": { 6 6 "dependsOn": ["^build"], 7 + "env": ["*", "RESEND_API_KEY", "!NEXT_PUBLIC_GIT_*"], 7 8 "outputs": [".next/**", "!.next/cache/**"] 8 9 }, 9 10 "lint": {},