diff --git a/backend/data/templates/components/button.tsx b/backend/data/templates/components/button.tsx new file mode 100644 index 0000000..2addf28 --- /dev/null +++ b/backend/data/templates/components/button.tsx @@ -0,0 +1,16 @@ +import { Button } from "@react-email/components"; +import React from "react"; + +export function CtaButton({ href, label }: { href: string; label: string }) { + return ( + + ); +} diff --git a/backend/data/templates/components/cart.tsx b/backend/data/templates/components/cart.tsx new file mode 100644 index 0000000..fdf0a44 --- /dev/null +++ b/backend/data/templates/components/cart.tsx @@ -0,0 +1,115 @@ +import { Column, Hr, Row, Section, Text } from "@react-email/components"; +import React from "react"; +import { BodySmall, BodyXSmall } from "./style"; + +export default function Cart({ + orderNumber, + checkout, +}: { + date?: string; + orderNumber: string; + checkout?: { + Subtotal: string; + discount: string; + shipping: string; + taxes: string; + total: string; + }; +}) { + return ( +
+
+ + Order summary {orderNumber} + +
+ + + {checkout && ( +
+ + + + +
+ +
+ )} +
+ ); +} + +function CartLine() { + return ( +
+ + +
+ {/* Product image */} +
+
+
+ + + Two chip chocolate chip cookie + + + 4-Pack + + + + + $20.00 + + +
+
+ ); +} + +function CheckoutLine({ + title, + subtitle, + price, +}: { + title: string; + subtitle?: string; + price: string; +}) { + return ( + + + + {title} + + {subtitle && ( + + {subtitle} + + )} + + + + {price} + + + + ); +} diff --git a/backend/data/templates/components/email-body.tsx b/backend/data/templates/components/email-body.tsx new file mode 100644 index 0000000..e0d29c0 --- /dev/null +++ b/backend/data/templates/components/email-body.tsx @@ -0,0 +1,33 @@ +import { Text } from "@react-email/components"; +import React from "react"; +import { Body } from "./style"; + +interface EmailBodyProps { + firstName?: string; + paragraphs: string[]; + signature?: boolean; +} + +export default function EmailBody({ + firstName, + paragraphs, + signature, +}: EmailBodyProps) { + return ( + + Hi {firstName},
+ {paragraphs.map((paragraph, index) => ( + + {paragraph} +

+
+ ))} + {signature && ( + <> + Warm regards, +
The Munchies Team + + )} +
+ ); +} diff --git a/backend/data/templates/components/footer.tsx b/backend/data/templates/components/footer.tsx new file mode 100644 index 0000000..c33dcfc --- /dev/null +++ b/backend/data/templates/components/footer.tsx @@ -0,0 +1,59 @@ +import { + Column, + Link, + Row, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import React from "react"; + +const getYear = () => { + const date = new Date(); + return date.getFullYear(); +}; +export default function Footer() { + const year = getYear(); + + return ( +
+ +
+ + + + INSTAGRAM + + + + + + FACEBOOK + + + + + LINKEDIN + + + +
+ +
+ © {year} MUNCHIES +
+
+
+ ); +} diff --git a/backend/data/templates/components/layout.tsx b/backend/data/templates/components/layout.tsx new file mode 100644 index 0000000..e6b24c1 --- /dev/null +++ b/backend/data/templates/components/layout.tsx @@ -0,0 +1,44 @@ +import { + Container, + Head, + Preview, + Section, + Tailwind, +} from "@react-email/components"; +import React from "react"; +import Footer from "./footer"; +import { Global } from "./style"; + +export default function Layout({ + children, + preview, +}: { + children: React.ReactNode; + preview: string; +}) { + return ( +
+ + {preview} + +
+ +
{children}
+
+
+
+ ); +} diff --git a/backend/data/templates/components/products-list.tsx b/backend/data/templates/components/products-list.tsx new file mode 100644 index 0000000..182fbe7 --- /dev/null +++ b/backend/data/templates/components/products-list.tsx @@ -0,0 +1,59 @@ +import { Column, Row, Section, Text } from "@react-email/components"; +import React from "react"; +import { CtaButton } from "./button"; +import { BodySmall, TitleSmall } from "./style"; + +export default function ProductsList() { + return ( +
+ + Freshly baked + +
+ + +
+ {/* Brand Your */} +
+ s +
+
+
+ + Two chip chocolate chip + + + from $29.00 + +
+
+ +
+ {/* Brand Your */} +
+ s +
+
+
+ + Two chip chocolate chip + + + from $29.00 + +
+
+
+
+ +
+ ); +} diff --git a/backend/data/templates/components/shipping-address.tsx b/backend/data/templates/components/shipping-address.tsx new file mode 100644 index 0000000..8e943a6 --- /dev/null +++ b/backend/data/templates/components/shipping-address.tsx @@ -0,0 +1,59 @@ +import { Column, Row, Section, Text } from "@react-email/components"; +import React from "react"; + +type Address = { + name: string; + company: string; + street: string; + city: string; + country: string; +}; +export default function CustomerInformation({ + method, + ShippingAddress, + BillingAddress, +}: { + method: string; + ShippingAddress: Address; + BillingAddress: Address; +}) { + return ( +
+ Customer information + + + Shipping address + + {ShippingAddress.name} +
+ {ShippingAddress.company} +
+ {ShippingAddress.street} +
+ {ShippingAddress.city} +
+ {ShippingAddress.country} +
+
+
+ + Billing address + + {BillingAddress.name} +
+ {BillingAddress.company} +
+ {BillingAddress.street} +
+ {BillingAddress.city} +
+ {BillingAddress.country} +
+
+
+
+ Shipping method + {method} +
+ ); +} diff --git a/backend/data/templates/components/style.ts b/backend/data/templates/components/style.ts new file mode 100644 index 0000000..b77e3ed --- /dev/null +++ b/backend/data/templates/components/style.ts @@ -0,0 +1,51 @@ +export const Title = { + fontFamily: "Instrument Serif", + fontSize: "48px", + fontStyle: "normal", + fontWeight: "400", + lineHeight: "140%", + letterSpacing: "-0.96px", + margin: "0", +}; + +export const TitleSmall = { + fontFamily: "Instrument Serif", + fontSize: "40px", + fontStyle: "normal", + fontWeight: "400", + lineHeight: "120%", + letterSpacing: "-0.8px", + margin: "0", +}; +export const Body = { + fontFamily: "Instrument Sans", + fontSize: "16px", + fontStyle: "normal", + fontWeight: "400", + lineHeight: "140%", + margin: "0", +}; + +export const BodySmall = { + fontFamily: "Instrument Sans", + fontSize: "14px", + fontStyle: "normal", + fontWeight: "600", + letterSpacing: "0.28px", + margin: "0", +}; + +export const BodyXSmall = { + fontFamily: "Instrument Sans", + fontSize: "12px", + fontStyle: "normal", + fontWeight: "400", + lineHeight: "110%", + letterSpacing: "0.24px", + margin: "0", +}; + +export const Global = { + fontFamily: + "-apple-system, BlinkMacSystemFont, “Segoe UI”, “Roboto”, “Oxygen”, “Ubuntu”, “Cantarell”, “Fira Sans”, “Droid Sans”, “Helvetica Neue”, sans-serif", +}; diff --git a/backend/data/templates/order-confirmation.tsx b/backend/data/templates/order-confirmation.tsx new file mode 100644 index 0000000..47335c6 --- /dev/null +++ b/backend/data/templates/order-confirmation.tsx @@ -0,0 +1,68 @@ +import { BigNumberValue, OrderDTO } from "@medusajs/framework/types"; +import { Heading, Section } from "@react-email/components"; +import Cart from "./components/cart"; +import EmailBody from "./components/email-body"; +import Layout from "./components/layout"; +import CustomerInformation from "./components/shipping-address"; +import { Title } from "./components/style"; +import { convertToLocale } from "./utils"; + +export default function OrderConfirmation({ order }: { order: OrderDTO }) { + const convertMoney = (amount: BigNumberValue) => + convertToLocale({ + amount: Number(amount), + currency_code: order.currency_code, + }); + return ( + +
+ + Thank you for your order! + + + + +
+
+ ); +} diff --git a/backend/data/templates/shipping-confirmation.tsx b/backend/data/templates/shipping-confirmation.tsx new file mode 100644 index 0000000..1f4912b --- /dev/null +++ b/backend/data/templates/shipping-confirmation.tsx @@ -0,0 +1,24 @@ +import { Heading, Section } from "@react-email/components"; +import EmailBody from "./components/email-body"; +import Layout from "./components/layout"; +import { Title } from "./components/style"; + +export default function BuyAgain() { + return ( + +
+ + Your order is on its way! + + +
+
+ ); +} diff --git a/backend/data/templates/utils.ts b/backend/data/templates/utils.ts new file mode 100644 index 0000000..1e067ec --- /dev/null +++ b/backend/data/templates/utils.ts @@ -0,0 +1,36 @@ +export const isObject = (input: any) => input instanceof Object; +export const isArray = (input: any) => Array.isArray(input); +export const isEmpty = (input: any) => { + return ( + input === null || + input === undefined || + (isObject(input) && Object.keys(input).length === 0) || + (isArray(input) && (input as any[]).length === 0) || + (typeof input === "string" && input.trim().length === 0) + ); +}; + +type ConvertToLocaleParams = { + amount: number; + currency_code: string; + locale?: string; + maximumFractionDigits?: number; + minimumFractionDigits?: number; +}; + +export const convertToLocale = ({ + amount, + currency_code, + locale = "en-US", + maximumFractionDigits, + minimumFractionDigits, +}: ConvertToLocaleParams) => { + return currency_code && !isEmpty(currency_code) + ? new Intl.NumberFormat(locale, { + currency: currency_code, + maximumFractionDigits, + minimumFractionDigits, + style: "currency", + }).format(amount) + : amount.toString(); +}; diff --git a/backend/data/templates/welcome.tsx b/backend/data/templates/welcome.tsx new file mode 100644 index 0000000..0df2370 --- /dev/null +++ b/backend/data/templates/welcome.tsx @@ -0,0 +1,30 @@ +import { Heading, Section } from "@react-email/components"; +import React from "react"; +import EmailBody from "./components/email-body"; +import Layout from "./components/layout"; +import ProductsList from "./components/products-list"; +import { Title } from "./components/style"; + +export default function Welcome() { + return ( + +
+ + Get ready for some sweet! 🍪 + + + +
+
+ ); +} diff --git a/backend/package.json b/backend/package.json index 39b11fe..1bcbdab 100644 --- a/backend/package.json +++ b/backend/package.json @@ -30,9 +30,11 @@ "@mikro-orm/knex": "5.9.7", "@mikro-orm/migrations": "5.9.7", "@mikro-orm/postgresql": "5.9.7", + "@react-email/components": "^0.0.25", "@sanity/client": "^6.22.1", "awilix": "^8.0.1", - "pg": "^8.13.0" + "pg": "^8.13.0", + "resend": "^4.0.0" }, "devDependencies": { "@mikro-orm/cli": "5.9.7", @@ -53,5 +55,6 @@ }, "engines": { "node": ">=20" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/backend/src/subscribers/lib/email.ts b/backend/src/subscribers/lib/email.ts new file mode 100644 index 0000000..d33d5ae --- /dev/null +++ b/backend/src/subscribers/lib/email.ts @@ -0,0 +1,24 @@ +import type { CreateEmailOptions, CreateEmailRequestOptions } from "resend"; + +import { Resend } from "resend"; + +export type ReactEmailProps = React.FC>; + +const companyName = "munchies"; +const email = "onboarding@resend.dev"; // TODO: add domain and change + +const resend = new Resend(process.env.RESEND_API_KEY); + +export async function sendEmail( + payload: Omit, + options?: CreateEmailRequestOptions, +) { + return await resend.emails.send( + { + from: `${companyName} <${email}>`, + react: null, + ...payload, + }, + options, + ); +} diff --git a/backend/src/subscribers/order-created.ts b/backend/src/subscribers/order-created.ts new file mode 100644 index 0000000..14f569d --- /dev/null +++ b/backend/src/subscribers/order-created.ts @@ -0,0 +1,28 @@ +import { Modules } from "@medusajs/framework/utils"; +import type { SubscriberArgs, SubscriberConfig } from "@medusajs/medusa"; +import OrderConfirmation from "data/templates/order-confirmation"; +import { sendEmail } from "./lib/email"; + +export default async function orderCreateHandler({ + event, + container, +}: SubscriberArgs<{ id: string }>) { + const orderService = container.resolve(Modules.ORDER); + + const order = await orderService + .listOrders({ + id: event.data.id, + }) + .then((orders) => orders[0]); + + if (order) + await sendEmail({ + to: order.email, + subject: "Thank you for you order", + react: OrderConfirmation(), + }); +} + +export const config: SubscriberConfig = { + event: ["order.placed"], +}; diff --git a/backend/src/subscribers/order-updated.ts b/backend/src/subscribers/order-updated.ts new file mode 100644 index 0000000..189b0a9 --- /dev/null +++ b/backend/src/subscribers/order-updated.ts @@ -0,0 +1,27 @@ +import { Modules } from "@medusajs/framework/utils"; +import type { SubscriberArgs, SubscriberConfig } from "@medusajs/medusa"; +import ShippingConfirmation from "data/templates/shipping-confirmation"; +import { sendEmail } from "./lib/email"; + +export default async function orderUpdatedHandler({ + event, + container, +}: SubscriberArgs<{ id: string }>) { + const orderService = container.resolve(Modules.ORDER); + + const order = await orderService + .listOrders({ + id: event.data.id, + }) + .then((orders) => orders[0]); + + await sendEmail({ + to: order.email, + subject: "Your order is shipped", + react: ShippingConfirmation(), + }); +} + +export const config: SubscriberConfig = { + event: ["order.updated"], +}; diff --git a/backend/yarn.lock b/backend/yarn.lock index 64b8e28..b8e3364 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2056,7 +2056,7 @@ dependencies: ioredis "^5.4.1" -"@medusajs/@1.0.0-rc-20241001083650": +"@medusajs/cart@1.0.0-rc-20241001083650": version "1.0.0-rc-20241001083650" resolved "https://registry.yarnpkg.com/@medusajs/cart/-/cart-1.0.0-rc-20241001083650.tgz#9dc5021a86d4e25ef416938806ebbe5e7c2a3c30" integrity sha512-ESWLtOt4bavk10MqIGPpRbk+a4nhTDLiDKQlLT8d5QA7p1PwKJftS2/ye2y7pcD39fyCvN+lcvC3XVL3Tm55AA== @@ -2715,6 +2715,11 @@ resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== +"@one-ini/wasm@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" + integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== + "@opentelemetry/api@^1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" @@ -3875,6 +3880,149 @@ "@react-types/shared" "^3.25.0" "@swc/helpers" "^0.5.0" +"@react-email/body@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/body/-/body-0.0.10.tgz#bb8f0c8f6375a6e93ad841b4693807733a62709c" + integrity sha512-dMJyL9aU25ieatdPtVjCyQ/WHZYHwNc+Hy/XpF8Cc18gu21cUynVEeYQzFSeigDRMeBQ3PGAyjVDPIob7YlGwA== + +"@react-email/button@0.0.17": + version "0.0.17" + resolved "https://registry.yarnpkg.com/@react-email/button/-/button-0.0.17.tgz#42f898073512edd29ca6ffe4c400eca106a4d2c3" + integrity sha512-ioHdsk+BpGS/PqjU6JS7tUrVy9yvbUx92Z+Cem2+MbYp55oEwQ9VHf7u4f5NoM0gdhfKSehBwRdYlHt/frEMcg== + +"@react-email/code-block@0.0.9": + version "0.0.9" + resolved "https://registry.yarnpkg.com/@react-email/code-block/-/code-block-0.0.9.tgz#c4ddc6afd90f461c3fb67ef4a0697ede29761978" + integrity sha512-Zrhc71VYrSC1fVXJuaViKoB/dBjxLw6nbE53Bm/eUuZPdnnZ1+ZUIh8jfaRKC5MzMjgnLGQTweGXVnfIrhyxtQ== + dependencies: + prismjs "1.29.0" + +"@react-email/code-inline@0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@react-email/code-inline/-/code-inline-0.0.4.tgz#f4dc6c7aaa5605b65781abe47ceb28fdb75373c2" + integrity sha512-zj3oMQiiUCZbddSNt3k0zNfIBFK0ZNDIzzDyBaJKy6ZASTtWfB+1WFX0cpTX8q0gUiYK+A94rk5Qp68L6YXjXQ== + +"@react-email/column@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@react-email/column/-/column-0.0.12.tgz#299ac8e3e6210b59aba93e7937286cd8639a8b30" + integrity sha512-Rsl7iSdDaeHZO938xb+0wR5ud0Z3MVfdtPbNKJNojZi2hApwLAQXmDrnn/AcPDM5Lpl331ZljJS8vHTWxxkvKw== + +"@react-email/components@^0.0.25": + version "0.0.25" + resolved "https://registry.yarnpkg.com/@react-email/components/-/components-0.0.25.tgz#fcfa745db53b7dca0141ed8bd619f3454293ed87" + integrity sha512-lnfVVrThEcET5NPoeaXvrz9UxtWpGRcut2a07dLbyKgNbP7vj/cXTI5TuHtanCvhCddFpMDnElNRghDOfPzwUg== + dependencies: + "@react-email/body" "0.0.10" + "@react-email/button" "0.0.17" + "@react-email/code-block" "0.0.9" + "@react-email/code-inline" "0.0.4" + "@react-email/column" "0.0.12" + "@react-email/container" "0.0.14" + "@react-email/font" "0.0.8" + "@react-email/head" "0.0.11" + "@react-email/heading" "0.0.14" + "@react-email/hr" "0.0.10" + "@react-email/html" "0.0.10" + "@react-email/img" "0.0.10" + "@react-email/link" "0.0.10" + "@react-email/markdown" "0.0.12" + "@react-email/preview" "0.0.11" + "@react-email/render" "1.0.1" + "@react-email/row" "0.0.10" + "@react-email/section" "0.0.14" + "@react-email/tailwind" "0.1.0" + "@react-email/text" "0.0.10" + +"@react-email/container@0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@react-email/container/-/container-0.0.14.tgz#f2809b036ce8482ccd8d726de7a70b2acb3743c5" + integrity sha512-NgoaJJd9tTtsrveL86Ocr/AYLkGyN3prdXKd/zm5fQpfDhy/NXezyT3iF6VlwAOEUIu64ErHpAJd+P6ygR+vjg== + +"@react-email/font@0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@react-email/font/-/font-0.0.8.tgz#efc45b3c3fff7a4e1603e796401d890f8264a1c7" + integrity sha512-fSBEqYyVPAyyACBBHcs3wEYzNknpHMuwcSAAKE8fOoDfGqURr/vSxKPdh4tOa9z7G4hlcEfgGrCYEa2iPT22cw== + +"@react-email/head@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@react-email/head/-/head-0.0.11.tgz#cc274b2627a70ed8110db5fd2d4339f2f401ad99" + integrity sha512-skw5FUgyamIMK+LN+fZQ5WIKQYf0dPiRAvsUAUR2eYoZp9oRsfkIpFHr0GWPkKAYjFEj+uJjaxQ/0VzQH7svVg== + +"@react-email/heading@0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@react-email/heading/-/heading-0.0.14.tgz#46e97e6439c2f227f4d5777f1512b6fe362a2e37" + integrity sha512-jZM7IVuZOXa0G110ES8OkxajPTypIKlzlO1K1RIe1auk76ukQRiCg1IRV4HZlWk1GGUbec5hNxsvZa2kU8cb9w== + +"@react-email/hr@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/hr/-/hr-0.0.10.tgz#0efe8e28f6a675027c127de5adca1cf8eed37603" + integrity sha512-3AA4Yjgl3zEid/KVx6uf6TuLJHVZvUc2cG9Wm9ZpWeAX4ODA+8g9HyuC0tfnjbRsVMhMcCGiECuWWXINi+60vA== + +"@react-email/html@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/html/-/html-0.0.10.tgz#ac3d243b700e36257f0ef6a5ef1e5955d99a44e0" + integrity sha512-06uiuSKJBWQJfhCKv4MPupELei4Lepyz9Sth7Yq7Fq29CAeB1ejLgKkGqn1I+FZ72hQxPLdYF4iq4yloKv3JCg== + +"@react-email/img@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/img/-/img-0.0.10.tgz#4d237dd269e25a269786510db81fb2be2409a0bc" + integrity sha512-pJ8glJjDNaJ53qoM95pvX9SK05yh0bNQY/oyBKmxlBDdUII6ixuMc3SCwYXPMl+tgkQUyDgwEBpSTrLAnjL3hA== + +"@react-email/link@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/link/-/link-0.0.10.tgz#5f983f0f95a195da4ef06ba53671b5edad8d0ab7" + integrity sha512-tva3wvAWSR10lMJa9fVA09yRn7pbEki0ZZpHE6GD1jKbFhmzt38VgLO9B797/prqoDZdAr4rVK7LJFcdPx3GwA== + +"@react-email/markdown@0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@react-email/markdown/-/markdown-0.0.12.tgz#23bc3e7576d96d76cdf0ea7ee0f37b054b0b392f" + integrity sha512-wsuvj1XAb6O63aizCLNEeqVgKR3oFjAwt9vjfg2y2oh4G1dZeo8zonZM2x1fmkEkBZhzwSHraNi70jSXhA3A9w== + dependencies: + md-to-react-email "5.0.2" + +"@react-email/preview@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@react-email/preview/-/preview-0.0.11.tgz#bf25a24608817ba00f1fbc8f2f02e2423078105c" + integrity sha512-7O/CT4b16YlSGrj18htTPx3Vbhu2suCGv/cSe5c+fuSrIM/nMiBSZ3Js16Vj0XJbAmmmlVmYFZw9L20wXJ+LjQ== + +"@react-email/render@0.0.17": + version "0.0.17" + resolved "https://registry.yarnpkg.com/@react-email/render/-/render-0.0.17.tgz#9ad401c5bbc6b71c3e93f34795c726f3f5bfeb9f" + integrity sha512-xBQ+/73+WsGuXKY7r1U73zMBNV28xdV0cp9cFjhNYipBReDHhV97IpA6v7Hl0dDtDzt+yS/72dY5vYXrF1v8NA== + dependencies: + html-to-text "9.0.5" + js-beautify "^1.14.11" + react-promise-suspense "0.3.4" + +"@react-email/render@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@react-email/render/-/render-1.0.1.tgz#5a8897a2b87c1aa41ebe5dd36233bd8d983b801a" + integrity sha512-W3gTrcmLOVYnG80QuUp22ReIT/xfLsVJ+n7ghSlG2BITB8evNABn1AO2rGQoXuK84zKtDAlxCdm3hRyIpZdGSA== + dependencies: + html-to-text "9.0.5" + js-beautify "^1.14.11" + react-promise-suspense "0.3.4" + +"@react-email/row@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/row/-/row-0.0.10.tgz#c8312ba35e91f8e8c65801307a96b8a7d428b0f5" + integrity sha512-jPyEhG3gsLX+Eb9U+A30fh0gK6hXJwF4ghJ+ZtFQtlKAKqHX+eCpWlqB3Xschd/ARJLod8WAswg0FB+JD9d0/A== + +"@react-email/section@0.0.14": + version "0.0.14" + resolved "https://registry.yarnpkg.com/@react-email/section/-/section-0.0.14.tgz#50585fe7d63da03b56c30cebbd8e9908a3256f0a" + integrity sha512-+fYWLb4tPU1A/+GE5J1+SEMA7/wR3V30lQ+OR9t2kAJqNrARDbMx0bLnYnR1QL5TiFRz0pCF05SQUobk6gHEDQ== + +"@react-email/tailwind@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@react-email/tailwind/-/tailwind-0.1.0.tgz#81bed368c225501dedf6385f9c7c4ebd05e83107" + integrity sha512-qysVUEY+M3SKUvu35XDpzn7yokhqFOT3tPU6Mj/pgc62TL5tQFj6msEbBtwoKs2qO3WZvai0DIHdLhaOxBQSow== + +"@react-email/text@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@react-email/text/-/text-0.0.10.tgz#7b02aa7711fabb070e204c13cb1c43421e96d5cb" + integrity sha512-wNAnxeEAiFs6N+SxS0y6wTJWfewEzUETuyS2aZmT00xk50VijwyFRuhm4sYSjusMyshevomFwz5jNISCxRsGWw== + "@react-stately/calendar@^3.5.5": version "3.5.5" resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.5.5.tgz#52249991e1e9c40921cd3d6dce727c0dd37536cb" @@ -4474,6 +4622,14 @@ event-source-polyfill "1.0.31" eventsource "2.0.2" +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== + dependencies: + domhandler "^5.0.3" + selderee "^0.11.0" + "@sendgrid/client@^8.1.3": version "8.1.3" resolved "https://registry.yarnpkg.com/@sendgrid/client/-/client-8.1.3.tgz#51fd4a318627c4b615ff98e35609e98486a3bd6f" @@ -5349,6 +5505,11 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.14.2" +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -6268,6 +6429,14 @@ concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +config-chain@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + configstore@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -6484,7 +6653,7 @@ deeks@3.1.0: resolved "https://registry.yarnpkg.com/deeks/-/deeks-3.1.0.tgz#ecc47c600bcc6dbda656c6d86bbc96cbe126fd41" integrity sha512-e7oWH1LzIdv/prMQ7pmlDlaVoL64glqzvNgkgQNgyec9ORPHrT2jaOqMtRyqJuwWjtfb6v+2rk9pmaHj+F137A== -deepmerge@^4.2.2: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -6577,11 +6746,41 @@ doc-path@4.1.1: resolved "https://registry.yarnpkg.com/doc-path/-/doc-path-4.1.1.tgz#5be8c1671877f6b719af5a6077c41904be8913ac" integrity sha512-h1ErTglQAVv2gCnOpD3sFS6uolDbOKHDU1BZq+Kl3npPqroU3dYL42lUgMfd5UimlwtRgp7C9dLGwqQ5D2HYgQ== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + dot-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" @@ -6631,6 +6830,16 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" +editorconfig@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" + integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== + dependencies: + "@one-ini/wasm" "0.1.1" + commander "^10.0.0" + minimatch "9.0.1" + semver "^7.5.3" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -6671,6 +6880,11 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -6875,6 +7089,11 @@ extract-stack@^2.0.0: resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -7173,7 +7392,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.10: +glob@^10.3.10, glob@^10.3.3: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== @@ -7318,6 +7537,27 @@ html-parse-stringify@^3.0.1: dependencies: void-elements "3.1.0" +html-to-text@9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -7423,6 +7663,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@^8.0.0: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -8091,6 +8336,22 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== +js-beautify@^1.14.11: + version "1.15.1" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64" + integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA== + dependencies: + config-chain "^1.1.13" + editorconfig "^1.0.4" + glob "^10.3.3" + js-cookie "^3.0.5" + nopt "^7.2.0" + +js-cookie@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" + integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8221,6 +8482,11 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -8406,6 +8672,11 @@ map-cache@^0.2.0: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== +marked@7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/marked/-/marked-7.0.4.tgz#e2558ee2d535b9df6a27c6e282dc603a18388a6d" + integrity sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ== + match-sorter@^6.3.4: version "6.3.4" resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.4.tgz#afa779d8e922c81971fbcb4781c7003ace781be7" @@ -8419,6 +8690,13 @@ math-random@^1.0.1: resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +md-to-react-email@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/md-to-react-email/-/md-to-react-email-5.0.2.tgz#2ee848a7248d4df6e6a95466a269ca6b6697a704" + integrity sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA== + dependencies: + marked "7.0.4" + meant@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.3.tgz#67769af9de1d158773e928ae82c456114903554c" @@ -8527,6 +8805,13 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +minimatch@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -8710,6 +8995,13 @@ node-schedule@^2.1.1: long-timeout "0.1.1" sorted-array-functions "^1.3.0" +nopt@^7.2.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -8880,6 +9172,14 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -8959,6 +9259,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + pg-cloudflare@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" @@ -9176,7 +9481,7 @@ prism-react-renderer@^2.0.6: "@types/prismjs" "^1.26.0" clsx "^2.0.0" -prismjs@^1.29.0: +prismjs@1.29.0, prismjs@^1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== @@ -9223,6 +9528,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -9393,6 +9703,13 @@ react-jwt@^1.2.0: optionalDependencies: fsevents "^2.3.2" +react-promise-suspense@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/react-promise-suspense/-/react-promise-suspense-0.3.4.tgz#05d19a75703d71374674840056cfef2fcd38809d" + integrity sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ== + dependencies: + fast-deep-equal "^2.0.1" + react-refresh@^0.14.2: version "0.14.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" @@ -9611,6 +9928,13 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resend@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resend/-/resend-4.0.0.tgz#37e981c9e9bc78395f5c06c377483a63565af84f" + integrity sha512-rDX0rspl/XcmC2JV2V5obQvRX2arzxXUvNFUDMOv5ObBLR68+7kigCOysb7+dlkb0JE3erhQG0nHrbBt/ZCWIg== + dependencies: + "@react-email/render" "0.0.17" + resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -9726,6 +10050,13 @@ scrypt-kdf@^2.0.1: resolved "https://registry.yarnpkg.com/scrypt-kdf/-/scrypt-kdf-2.0.1.tgz#3355224c52d398331b2cbf2b70a7be26b52c53e6" integrity sha512-dMhpgBVJPDWZP5erOCwTjI6oAO9hKhFAjZsdSQ0spaWJYHuA/wFNF2weQQfsyCIk8eNKoLfEDxr3zAtM+gZo0Q== +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"