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 (
+
+
+
+
+ {/* */}
+
+
+
+
+
+ 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
+
+
+
+
+
+
+
+
+ );
+}
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}
+
+
+
+
+ );
+}
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
+
+
+
+
+
+ {/* */}
+
+
+
+
+ Two chip chocolate chip
+
+
+ from $29.00
+
+
+
+
+
+ {/* */}
+
+
+
+
+ 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"