From 79ad0818f516c1eed95e886bf05b7f4c6b072196 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Sun, 14 Jul 2024 02:49:21 -0600 Subject: [PATCH] feat(notifications): add build failed and invitation emails from react-email --- .../cluster/registry/add-docker-registry.tsx | 2 +- .../registry/add-self-docker-registry.tsx | 2 +- .../cluster/registry/show-registry.tsx | 4 +- .../notifications/add-notification.tsx | 315 +- .../notifications/show-notifications.tsx | 66 +- .../notifications/update-notification.tsx | 686 +++ components/icons/notification-icons.tsx | 60 +- drizzle/0022_keen_norrin_radd.sql | 1 + drizzle/0023_military_korg.sql | 1 + drizzle/0024_bored_the_hand.sql | 2 + drizzle/meta/0022_snapshot.json | 2919 ++++++++++++ drizzle/meta/0023_snapshot.json | 2919 ++++++++++++ drizzle/meta/0024_snapshot.json | 2919 ++++++++++++ drizzle/meta/_journal.json | 21 + emails/.gitignore | 2 + emails/emails/build-failed.tsx | 108 + emails/emails/invitation.tsx | 96 + emails/emails/notion-magic-link.tsx | 150 + emails/emails/plaid-verify-identity.tsx | 158 + emails/emails/static/notion-logo.png | Bin 0 -> 1929 bytes emails/emails/static/plaid-logo.png | Bin 0 -> 3987 bytes emails/emails/static/plaid.png | Bin 0 -> 3987 bytes emails/emails/static/stripe-logo.png | Bin 0 -> 1813 bytes emails/emails/static/vercel-arrow.png | Bin 0 -> 426 bytes emails/emails/static/vercel-logo.png | Bin 0 -> 1178 bytes emails/emails/static/vercel-team.png | Bin 0 -> 3122 bytes emails/emails/static/vercel-user.png | Bin 0 -> 55726 bytes emails/emails/stripe-welcome.tsx | 152 + emails/emails/vercel-invite-user.tsx | 154 + emails/package.json | 20 + emails/pnpm-lock.yaml | 4209 +++++++++++++++++ emails/readme.md | 27 + package.json | 9 +- pnpm-lock.yaml | 436 +- server/api/routers/notification.ts | 277 +- server/api/services/application.ts | 10 + server/api/services/notification.ts | 372 +- server/db/schema/notification.ts | 55 +- 38 files changed, 15799 insertions(+), 353 deletions(-) create mode 100644 components/dashboard/settings/notifications/update-notification.tsx create mode 100644 drizzle/0022_keen_norrin_radd.sql create mode 100644 drizzle/0023_military_korg.sql create mode 100644 drizzle/0024_bored_the_hand.sql create mode 100644 drizzle/meta/0022_snapshot.json create mode 100644 drizzle/meta/0023_snapshot.json create mode 100644 drizzle/meta/0024_snapshot.json create mode 100644 emails/.gitignore create mode 100644 emails/emails/build-failed.tsx create mode 100644 emails/emails/invitation.tsx create mode 100644 emails/emails/notion-magic-link.tsx create mode 100644 emails/emails/plaid-verify-identity.tsx create mode 100644 emails/emails/static/notion-logo.png create mode 100644 emails/emails/static/plaid-logo.png create mode 100644 emails/emails/static/plaid.png create mode 100644 emails/emails/static/stripe-logo.png create mode 100644 emails/emails/static/vercel-arrow.png create mode 100644 emails/emails/static/vercel-logo.png create mode 100644 emails/emails/static/vercel-team.png create mode 100644 emails/emails/static/vercel-user.png create mode 100644 emails/emails/stripe-welcome.tsx create mode 100644 emails/emails/vercel-invite-user.tsx create mode 100644 emails/package.json create mode 100644 emails/pnpm-lock.yaml create mode 100644 emails/readme.md diff --git a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx index 8d9eab16..193bf672 100644 --- a/components/dashboard/settings/cluster/registry/add-docker-registry.tsx +++ b/components/dashboard/settings/cluster/registry/add-docker-registry.tsx @@ -99,7 +99,7 @@ export const AddRegistry = () => { return ( - diff --git a/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx b/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx index ef4ad03f..fe5a0ca9 100644 --- a/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx +++ b/components/dashboard/settings/cluster/registry/add-self-docker-registry.tsx @@ -88,7 +88,7 @@ export const AddSelfHostedRegistry = () => { return ( - diff --git a/components/dashboard/settings/cluster/registry/show-registry.tsx b/components/dashboard/settings/cluster/registry/show-registry.tsx index 839af232..a754737d 100644 --- a/components/dashboard/settings/cluster/registry/show-registry.tsx +++ b/components/dashboard/settings/cluster/registry/show-registry.tsx @@ -42,11 +42,11 @@ export const ShowRegistry = () => { {data?.length === 0 ? (
- + To create a cluster is required to set a registry. -
+
diff --git a/components/dashboard/settings/notifications/add-notification.tsx b/components/dashboard/settings/notifications/add-notification.tsx index 646b2430..f8a4e686 100644 --- a/components/dashboard/settings/notifications/add-notification.tsx +++ b/components/dashboard/settings/notifications/add-notification.tsx @@ -34,8 +34,10 @@ import { } from "@/components/icons/notification-icons"; import { Switch } from "@/components/ui/switch"; -const baseDatabaseSchema = z.object({ - name: z.string().min(1, "Name required"), +const notificationBaseSchema = z.object({ + name: z.string().min(1, { + message: "Name is required", + }), appDeploy: z.boolean().default(false), userJoin: z.boolean().default(false), appBuilderError: z.boolean().default(false), @@ -43,41 +45,47 @@ const baseDatabaseSchema = z.object({ dokployRestart: z.boolean().default(false), }); -const mySchema = z.discriminatedUnion("type", [ +export const notificationSchema = z.discriminatedUnion("type", [ z .object({ type: z.literal("slack"), - webhookUrl: z.string().min(1), - channel: z.string().min(1), + webhookUrl: z.string().min(1, { message: "Webhook URL is required" }), + channel: z.string(), }) - .merge(baseDatabaseSchema), + .merge(notificationBaseSchema), z .object({ type: z.literal("telegram"), - botToken: z.string().min(1), - chatId: z.string().min(1), + botToken: z.string().min(1, { message: "Bot Token is required" }), + chatId: z.string().min(1, { message: "Chat ID is required" }), }) - .merge(baseDatabaseSchema), + .merge(notificationBaseSchema), z .object({ type: z.literal("discord"), - webhookUrl: z.string().min(1), + webhookUrl: z.string().min(1, { message: "Webhook URL is required" }), }) - .merge(baseDatabaseSchema), + .merge(notificationBaseSchema), z .object({ type: z.literal("email"), - smtpServer: z.string().min(1), - smtpPort: z.string().min(1), - username: z.string().min(1), - password: z.string().min(1), - fromAddress: z.string().min(1), - toAddresses: z.array(z.string()).min(1), + smtpServer: z.string().min(1, { message: "SMTP Server is required" }), + smtpPort: z.number().min(1, { message: "SMTP Port is required" }), + username: z.string().min(1, { message: "Username is required" }), + password: z.string().min(1, { message: "Password is required" }), + fromAddress: z.string().min(1, { message: "From Address is required" }), + toAddresses: z + .array( + z.string().min(1, { message: "Email is required" }).email({ + message: "Email is invalid", + }), + ) + .min(1, { message: "At least one email is required" }), }) - .merge(baseDatabaseSchema), + .merge(notificationBaseSchema), ]); -const notificationsMap = { +export const notificationsMap = { slack: { icon: , label: "Slack", @@ -96,31 +104,40 @@ const notificationsMap = { }, }; -type AddNotification = z.infer; +export type NotificationSchema = z.infer; export const AddNotification = () => { const utils = api.useUtils(); const [visible, setVisible] = useState(false); - const { mutateAsync: testConnection, isLoading: isLoadingConnection } = - api.notification.testConnection.useMutation(); + + const { mutateAsync: testSlackConnection, isLoading: isLoadingSlack } = + api.notification.testSlackConnection.useMutation(); + + const { mutateAsync: testTelegramConnection, isLoading: isLoadingTelegram } = + api.notification.testTelegramConnection.useMutation(); + const { mutateAsync: testDiscordConnection, isLoading: isLoadingDiscord } = + api.notification.testDiscordConnection.useMutation(); + const { mutateAsync: testEmailConnection, isLoading: isLoadingEmail } = + api.notification.testEmailConnection.useMutation(); const slackMutation = api.notification.createSlack.useMutation(); const telegramMutation = api.notification.createTelegram.useMutation(); const discordMutation = api.notification.createDiscord.useMutation(); const emailMutation = api.notification.createEmail.useMutation(); - const form = useForm({ + const form = useForm({ defaultValues: { type: "slack", webhookUrl: "", channel: "", + name: "", }, - resolver: zodResolver(mySchema), + resolver: zodResolver(notificationSchema), }); const type = form.watch("type"); const { fields, append, remove } = useFieldArray({ control: form.control, - name: "toAddresses", + name: "toAddresses" as never, }); useEffect(() => { @@ -140,7 +157,7 @@ export const AddNotification = () => { email: emailMutation, }; - const onSubmit = async (data: AddNotification) => { + const onSubmit = async (data: NotificationSchema) => { const { appBuilderError, appDeploy, @@ -226,8 +243,6 @@ export const AddNotification = () => { Create new notifications providers for multiple - {/* {isError && {error?.message}} */} -
{ {type === "email" && ( <> - ( - - SMTP Server - - - +
+ ( + + SMTP Server + + + - - - )} - /> - ( - - SMTP Port - - - + + + )} + /> + ( + + SMTP Port + + { + const value = e.target.value; + if (value) { + const port = Number.parseInt(value); + if (port > 0 && port < 65536) { + field.onChange(port); + } + } + }} + type="number" + /> + - - - )} - /> + + + )} + /> +
- ( - - Username - - - +
+ ( + + Username + + + - - - )} - /> + + + )} + /> - ( - - Password - - - + ( + + Password + + + + + + + )} + /> +
- -
- )} - /> {
)} /> - - {/* ( - - To Addresses - - - - - - - )} - /> */}
To Addresses @@ -531,6 +549,12 @@ export const AddNotification = () => {
))} + {type === "email" && + "toAddresses" in form.formState.errors && ( +
+ {form.formState?.errors?.toAddresses?.root?.message} +
+ )}
-
+
Select the actions. -
+
( - -
+ +
App Deploy Trigger the action when a app is deployed. @@ -576,7 +600,7 @@ export const AddNotification = () => { control={form.control} name="userJoin" render={({ field }) => ( - +
User Join @@ -596,7 +620,7 @@ export const AddNotification = () => { control={form.control} name="databaseBackup" render={({ field }) => ( - +
Database Backup @@ -612,11 +636,12 @@ export const AddNotification = () => { )} /> + ( - +
Deploy Restart @@ -632,38 +657,72 @@ export const AddNotification = () => { )} /> + ( + +
+ App Builder Error + + Trigger the action when the build fails. + +
+ + + +
+ )} + />
) : (
- {data?.map((destination, index) => ( -
- - {index + 1}. {destination.name} - -
- {/* */} - +
+ {data?.map((notification, index) => ( +
+
+ {notification.notificationType === "slack" && ( + + )} + {notification.notificationType === "telegram" && ( + + )} + {notification.notificationType === "discord" && ( + + )} + {notification.notificationType === "email" && ( + + )} + + {notification.name} + +
+ +
+ + +
-
- ))} -
+ ))} +
+
diff --git a/components/dashboard/settings/notifications/update-notification.tsx b/components/dashboard/settings/notifications/update-notification.tsx new file mode 100644 index 00000000..0ab2b127 --- /dev/null +++ b/components/dashboard/settings/notifications/update-notification.tsx @@ -0,0 +1,686 @@ +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { api } from "@/utils/api"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { Mail, PenBoxIcon } from "lucide-react"; +import { useEffect } from "react"; +import { FieldErrors, useFieldArray, useForm } from "react-hook-form"; +import { toast } from "sonner"; +import { Switch } from "@/components/ui/switch"; +import { + TelegramIcon, + DiscordIcon, + SlackIcon, +} from "@/components/icons/notification-icons"; +import { + notificationSchema, + type NotificationSchema, +} from "./add-notification"; + +interface Props { + notificationId: string; +} + +export const UpdateNotification = ({ notificationId }: Props) => { + const utils = api.useUtils(); + const { data, refetch } = api.notification.one.useQuery( + { + notificationId, + }, + { + enabled: !!notificationId, + }, + ); + const { mutateAsync: testSlackConnection, isLoading: isLoadingSlack } = + api.notification.testSlackConnection.useMutation(); + + const { mutateAsync: testTelegramConnection, isLoading: isLoadingTelegram } = + api.notification.testTelegramConnection.useMutation(); + const { mutateAsync: testDiscordConnection, isLoading: isLoadingDiscord } = + api.notification.testDiscordConnection.useMutation(); + const { mutateAsync: testEmailConnection, isLoading: isLoadingEmail } = + api.notification.testEmailConnection.useMutation(); + const slackMutation = api.notification.updateSlack.useMutation(); + const telegramMutation = api.notification.updateTelegram.useMutation(); + const discordMutation = api.notification.updateDiscord.useMutation(); + const emailMutation = api.notification.updateEmail.useMutation(); + + const form = useForm({ + defaultValues: { + type: "slack", + webhookUrl: "", + channel: "", + }, + resolver: zodResolver(notificationSchema), + }); + const type = form.watch("type"); + + const { fields, append, remove } = useFieldArray({ + control: form.control, + name: "toAddresses" as never, + }); + + useEffect(() => { + if (data) { + if (data.notificationType === "slack") { + form.reset({ + appBuilderError: data.appBuildError, + appDeploy: data.appDeploy, + dokployRestart: data.dokployRestart, + databaseBackup: data.databaseBackup, + userJoin: data.userJoin, + webhookUrl: data.slack?.webhookUrl, + channel: data.slack?.channel || "", + name: data.name, + type: data.notificationType, + }); + } else if (data.notificationType === "telegram") { + form.reset({ + appBuilderError: data.appBuildError, + appDeploy: data.appDeploy, + dokployRestart: data.dokployRestart, + databaseBackup: data.databaseBackup, + userJoin: data.userJoin, + botToken: data.telegram?.botToken, + chatId: data.telegram?.chatId, + type: data.notificationType, + name: data.name, + }); + } else if (data.notificationType === "discord") { + form.reset({ + appBuilderError: data.appBuildError, + appDeploy: data.appDeploy, + dokployRestart: data.dokployRestart, + databaseBackup: data.databaseBackup, + userJoin: data.userJoin, + type: data.notificationType, + webhookUrl: data.discord?.webhookUrl, + name: data.name, + }); + } else if (data.notificationType === "email") { + form.reset({ + appBuilderError: data.appBuildError, + appDeploy: data.appDeploy, + dokployRestart: data.dokployRestart, + databaseBackup: data.databaseBackup, + type: data.notificationType, + userJoin: data.userJoin, + smtpServer: data.email?.smtpServer, + smtpPort: data.email?.smtpPort, + username: data.email?.username, + password: data.email?.password, + toAddresses: data.email?.toAddresses, + fromAddress: data.email?.fromAddress, + name: data.name, + }); + } + } + }, [form, form.reset, data]); + + const onSubmit = async (formData: NotificationSchema) => { + const { + appBuilderError, + appDeploy, + dokployRestart, + databaseBackup, + userJoin, + } = formData; + let promise: Promise | null = null; + if (formData?.type === "slack" && data?.slackId) { + promise = slackMutation.mutateAsync({ + appBuildError: appBuilderError, + appDeploy: appDeploy, + dokployRestart: dokployRestart, + databaseBackup: databaseBackup, + userJoin: userJoin, + webhookUrl: formData.webhookUrl, + channel: formData.channel, + name: formData.name, + notificationId: notificationId, + slackId: data?.slackId, + }); + } else if (formData.type === "telegram" && data?.telegramId) { + promise = telegramMutation.mutateAsync({ + appBuildError: appBuilderError, + appDeploy: appDeploy, + dokployRestart: dokployRestart, + databaseBackup: databaseBackup, + userJoin: userJoin, + botToken: formData.botToken, + chatId: formData.chatId, + name: formData.name, + notificationId: notificationId, + telegramId: data?.telegramId, + }); + } else if (formData.type === "discord" && data?.discordId) { + promise = discordMutation.mutateAsync({ + appBuildError: appBuilderError, + appDeploy: appDeploy, + dokployRestart: dokployRestart, + databaseBackup: databaseBackup, + userJoin: userJoin, + webhookUrl: formData.webhookUrl, + name: formData.name, + notificationId: notificationId, + discordId: data?.discordId, + }); + } else if (formData.type === "email" && data?.emailId) { + promise = emailMutation.mutateAsync({ + appBuildError: appBuilderError, + appDeploy: appDeploy, + dokployRestart: dokployRestart, + databaseBackup: databaseBackup, + userJoin: userJoin, + smtpServer: formData.smtpServer, + smtpPort: formData.smtpPort, + username: formData.username, + password: formData.password, + fromAddress: formData.fromAddress, + toAddresses: formData.toAddresses, + name: formData.name, + notificationId: notificationId, + emailId: data?.emailId, + }); + } + + if (promise) { + await promise + .then(async () => { + toast.success("Notification Updated"); + await utils.notification.all.invalidate(); + refetch(); + }) + .catch(() => { + toast.error("Error to update a notification"); + }); + } + }; + return ( + + + + + + + Update Notification + + Update the current notification config + + +
+ +
+
+
+ + {data?.notificationType === "slack" + ? "Slack" + : data?.notificationType === "telegram" + ? "Telegram" + : data?.notificationType === "discord" + ? "Discord" + : "Email"} + +
+ {data?.notificationType === "slack" && ( + + )} + {data?.notificationType === "telegram" && ( + + )} + {data?.notificationType === "discord" && ( + + )} + {data?.notificationType === "email" && ( + + )} +
+ +
+ ( + + Name + + + + + + + )} + /> + + {type === "slack" && ( + <> + ( + + Webhook URL + + + + + + + )} + /> + + ( + + Channel + + + + + + + )} + /> + + )} + + {type === "telegram" && ( + <> + ( + + Bot Token + + + + + + + )} + /> + + ( + + Chat ID + + + + + + + )} + /> + + )} + + {type === "discord" && ( + <> + ( + + Webhook URL + + + + + + + )} + /> + + )} + {type === "email" && ( + <> +
+ ( + + SMTP Server + + + + + + + )} + /> + ( + + SMTP Port + + + + + + + )} + /> +
+ +
+ ( + + Username + + + + + + + )} + /> + + ( + + Password + + + + + + + )} + /> +
+ + ( + + From Address + + + + + + )} + /> +
+ To Addresses + + {fields.map((field, index) => ( +
+ ( + + + + + + + + )} + /> + +
+ ))} + {type === "email" && + "toAddresses" in form.formState.errors && ( +
+ {form.formState?.errors?.toAddresses?.root?.message} +
+ )} +
+ + + + )} +
+
+
+ + Select the actions. + + +
+ ( + +
+ App Deploy + + Trigger the action when a app is deployed. + +
+ + + +
+ )} + /> + ( + +
+ User Join + + Trigger the action when a user joins the app. + +
+ + + +
+ )} + /> + ( + +
+ Database Backup + + Trigger the action when a database backup is created. + +
+ + + +
+ )} + /> + ( + +
+ Deploy Restart + + Trigger the action when a deploy is restarted. + +
+ + + +
+ )} + /> + ( + +
+ App Builder Error + + Trigger the action when the build fails. + +
+ + + +
+ )} + /> +
+
+
+ + + + + + +
+
+ ); +}; diff --git a/components/icons/notification-icons.tsx b/components/icons/notification-icons.tsx index cf557bcc..67104b20 100644 --- a/components/icons/notification-icons.tsx +++ b/components/icons/notification-icons.tsx @@ -1,34 +1,34 @@ +import { cn } from "@/lib/utils"; + interface Props { className?: string; } export const SlackIcon = ({ className }: Props) => { return ( - <> - - - - - - - - - + + + + + + + + ); }; @@ -39,7 +39,7 @@ export const TelegramIcon = ({ className }: Props) => { viewBox="0 0 48 48" width="48px" height="48px" - className="size-9" + className={cn("size-9", className)} > { y2="38.142" gradientUnits="userSpaceOnUse" > - - + + { viewBox="0 0 48 48" width="48px" height="48px" - className="size-9" + className={cn("size-9", className)} > statement-breakpoint +ALTER TABLE "email" ALTER COLUMN "smtpPort" SET DATA TYPE integer; \ No newline at end of file diff --git a/drizzle/meta/0022_snapshot.json b/drizzle/meta/0022_snapshot.json new file mode 100644 index 00000000..fc946df8 --- /dev/null +++ b/drizzle/meta/0022_snapshot.json @@ -0,0 +1,2919 @@ +{ + "id": "5bff440f-bfe3-44ef-90c0-0a217dc6ffef", + "prevId": "9f532ab9-fcd2-4deb-a2de-1cb899ab15d9", + "version": "6", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 80 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + } + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + } + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "userJoin": { + "name": "userJoin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0023_snapshot.json b/drizzle/meta/0023_snapshot.json new file mode 100644 index 00000000..10c3222a --- /dev/null +++ b/drizzle/meta/0023_snapshot.json @@ -0,0 +1,2919 @@ +{ + "id": "a79302d4-cbe4-4954-a3c3-76f1315fc6de", + "prevId": "5bff440f-bfe3-44ef-90c0-0a217dc6ffef", + "version": "6", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 80 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + } + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + } + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "userJoin": { + "name": "userJoin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0024_snapshot.json b/drizzle/meta/0024_snapshot.json new file mode 100644 index 00000000..b5015d34 --- /dev/null +++ b/drizzle/meta/0024_snapshot.json @@ -0,0 +1,2919 @@ +{ + "id": "ad76a3e3-e82c-44e9-88f8-d27f109d9fd2", + "prevId": "a79302d4-cbe4-4954-a3c3-76f1315fc6de", + "version": "6", + "dialect": "postgresql", + "tables": { + "public.application": { + "name": "application", + "schema": "", + "columns": { + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "subtitle": { + "name": "subtitle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "buildPath": { + "name": "buildPath", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBuildPath": { + "name": "customGitBuildPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerfile": { + "name": "dockerfile", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "healthCheckSwarm": { + "name": "healthCheckSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "restartPolicySwarm": { + "name": "restartPolicySwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "placementSwarm": { + "name": "placementSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "updateConfigSwarm": { + "name": "updateConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "rollbackConfigSwarm": { + "name": "rollbackConfigSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "modeSwarm": { + "name": "modeSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "labelsSwarm": { + "name": "labelsSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "networkSwarm": { + "name": "networkSwarm", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "replicas": { + "name": "replicas", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "buildType": { + "name": "buildType", + "type": "buildType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'nixpacks'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "application_registryId_registry_registryId_fk": { + "name": "application_registryId_registry_registryId_fk", + "tableFrom": "application", + "tableTo": "registry", + "columnsFrom": [ + "registryId" + ], + "columnsTo": [ + "registryId" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "application_projectId_project_projectId_fk": { + "name": "application_projectId_project_projectId_fk", + "tableFrom": "application", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "application_appName_unique": { + "name": "application_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.postgres": { + "name": "postgres", + "schema": "", + "columns": { + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "postgres_projectId_project_projectId_fk": { + "name": "postgres_projectId_project_projectId_fk", + "tableFrom": "postgres", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "postgres_appName_unique": { + "name": "postgres_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "isRegistered": { + "name": "isRegistered", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "expirationDate": { + "name": "expirationDate", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "canCreateProjects": { + "name": "canCreateProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canCreateServices": { + "name": "canCreateServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteProjects": { + "name": "canDeleteProjects", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canDeleteServices": { + "name": "canDeleteServices", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToDocker": { + "name": "canAccessToDocker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToAPI": { + "name": "canAccessToAPI", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "canAccessToTraefikFiles": { + "name": "canAccessToTraefikFiles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "accesedProjects": { + "name": "accesedProjects", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "accesedServices": { + "name": "accesedServices", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY[]::text[]" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "user_adminId_admin_adminId_fk": { + "name": "user_adminId_admin_adminId_fk", + "tableFrom": "user", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_authId_auth_id_fk": { + "name": "user_authId_auth_id_fk", + "tableFrom": "user", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.admin": { + "name": "admin", + "schema": "", + "columns": { + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "githubAppId": { + "name": "githubAppId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "githubAppName": { + "name": "githubAppName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serverIp": { + "name": "serverIp", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientId": { + "name": "githubClientId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubClientSecret": { + "name": "githubClientSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubInstallationId": { + "name": "githubInstallationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubPrivateKey": { + "name": "githubPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "githubWebhookSecret": { + "name": "githubWebhookSecret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "letsEncryptEmail": { + "name": "letsEncryptEmail", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sshPrivateKey": { + "name": "sshPrivateKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enableDockerCleanup": { + "name": "enableDockerCleanup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "authId": { + "name": "authId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "admin_authId_auth_id_fk": { + "name": "admin_authId_auth_id_fk", + "tableFrom": "admin", + "tableTo": "auth", + "columnsFrom": [ + "authId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.auth": { + "name": "auth", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rol": { + "name": "rol", + "type": "Roles", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is2FAEnabled": { + "name": "is2FAEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "auth_email_unique": { + "name": "auth_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "public.project": { + "name": "project", + "schema": "", + "columns": { + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_adminId_admin_adminId_fk": { + "name": "project_adminId_admin_adminId_fk", + "tableFrom": "project", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.domain": { + "name": "domain", + "schema": "", + "columns": { + "domainId": { + "name": "domainId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "host": { + "name": "host", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "https": { + "name": "https", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "port": { + "name": "port", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 80 + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'/'" + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateType": { + "name": "certificateType", + "type": "certificateType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'none'" + } + }, + "indexes": {}, + "foreignKeys": { + "domain_applicationId_application_applicationId_fk": { + "name": "domain_applicationId_application_applicationId_fk", + "tableFrom": "domain", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mariadb": { + "name": "mariadb", + "schema": "", + "columns": { + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mariadb_projectId_project_projectId_fk": { + "name": "mariadb_projectId_project_projectId_fk", + "tableFrom": "mariadb", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mariadb_appName_unique": { + "name": "mariadb_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mongo": { + "name": "mongo", + "schema": "", + "columns": { + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mongo_projectId_project_projectId_fk": { + "name": "mongo_projectId_project_projectId_fk", + "tableFrom": "mongo", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mongo_appName_unique": { + "name": "mongo_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.mysql": { + "name": "mysql", + "schema": "", + "columns": { + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "databaseName": { + "name": "databaseName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseUser": { + "name": "databaseUser", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databasePassword": { + "name": "databasePassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "rootPassword": { + "name": "rootPassword", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mysql_projectId_project_projectId_fk": { + "name": "mysql_projectId_project_projectId_fk", + "tableFrom": "mysql", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mysql_appName_unique": { + "name": "mysql_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.backup": { + "name": "backup", + "schema": "", + "columns": { + "backupId": { + "name": "backupId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule": { + "name": "schedule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "database": { + "name": "database", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "prefix": { + "name": "prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "databaseType": { + "name": "databaseType", + "type": "databaseType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "backup_destinationId_destination_destinationId_fk": { + "name": "backup_destinationId_destination_destinationId_fk", + "tableFrom": "backup", + "tableTo": "destination", + "columnsFrom": [ + "destinationId" + ], + "columnsTo": [ + "destinationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_postgresId_postgres_postgresId_fk": { + "name": "backup_postgresId_postgres_postgresId_fk", + "tableFrom": "backup", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mariadbId_mariadb_mariadbId_fk": { + "name": "backup_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "backup", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mysqlId_mysql_mysqlId_fk": { + "name": "backup_mysqlId_mysql_mysqlId_fk", + "tableFrom": "backup", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "backup_mongoId_mongo_mongoId_fk": { + "name": "backup_mongoId_mongo_mongoId_fk", + "tableFrom": "backup", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.destination": { + "name": "destination", + "schema": "", + "columns": { + "destinationId": { + "name": "destinationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessKey": { + "name": "accessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "bucket": { + "name": "bucket", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "destination_adminId_admin_adminId_fk": { + "name": "destination_adminId_admin_adminId_fk", + "tableFrom": "destination", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.deployment": { + "name": "deployment", + "schema": "", + "columns": { + "deploymentId": { + "name": "deploymentId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "deploymentStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": false, + "default": "'running'" + }, + "logPath": { + "name": "logPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "deployment_applicationId_application_applicationId_fk": { + "name": "deployment_applicationId_application_applicationId_fk", + "tableFrom": "deployment", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deployment_composeId_compose_composeId_fk": { + "name": "deployment_composeId_compose_composeId_fk", + "tableFrom": "deployment", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.mount": { + "name": "mount", + "schema": "", + "columns": { + "mountId": { + "name": "mountId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "mountType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "hostPath": { + "name": "hostPath", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "volumeName": { + "name": "volumeName", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "serviceType": { + "name": "serviceType", + "type": "serviceType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'application'" + }, + "mountPath": { + "name": "mountPath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "postgresId": { + "name": "postgresId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mariadbId": { + "name": "mariadbId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mongoId": { + "name": "mongoId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "mysqlId": { + "name": "mysqlId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "mount_applicationId_application_applicationId_fk": { + "name": "mount_applicationId_application_applicationId_fk", + "tableFrom": "mount", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_postgresId_postgres_postgresId_fk": { + "name": "mount_postgresId_postgres_postgresId_fk", + "tableFrom": "mount", + "tableTo": "postgres", + "columnsFrom": [ + "postgresId" + ], + "columnsTo": [ + "postgresId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mariadbId_mariadb_mariadbId_fk": { + "name": "mount_mariadbId_mariadb_mariadbId_fk", + "tableFrom": "mount", + "tableTo": "mariadb", + "columnsFrom": [ + "mariadbId" + ], + "columnsTo": [ + "mariadbId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mongoId_mongo_mongoId_fk": { + "name": "mount_mongoId_mongo_mongoId_fk", + "tableFrom": "mount", + "tableTo": "mongo", + "columnsFrom": [ + "mongoId" + ], + "columnsTo": [ + "mongoId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_mysqlId_mysql_mysqlId_fk": { + "name": "mount_mysqlId_mysql_mysqlId_fk", + "tableFrom": "mount", + "tableTo": "mysql", + "columnsFrom": [ + "mysqlId" + ], + "columnsTo": [ + "mysqlId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_redisId_redis_redisId_fk": { + "name": "mount_redisId_redis_redisId_fk", + "tableFrom": "mount", + "tableTo": "redis", + "columnsFrom": [ + "redisId" + ], + "columnsTo": [ + "redisId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mount_composeId_compose_composeId_fk": { + "name": "mount_composeId_compose_composeId_fk", + "tableFrom": "mount", + "tableTo": "compose", + "columnsFrom": [ + "composeId" + ], + "columnsTo": [ + "composeId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.certificate": { + "name": "certificate", + "schema": "", + "columns": { + "certificateId": { + "name": "certificateId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificateData": { + "name": "certificateData", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "certificatePath": { + "name": "certificatePath", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "autoRenew": { + "name": "autoRenew", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "certificate_certificatePath_unique": { + "name": "certificate_certificatePath_unique", + "nullsNotDistinct": false, + "columns": [ + "certificatePath" + ] + } + } + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_auth_id_fk": { + "name": "session_user_id_auth_id_fk", + "tableFrom": "session", + "tableTo": "auth", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redirect": { + "name": "redirect", + "schema": "", + "columns": { + "redirectId": { + "name": "redirectId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "regex": { + "name": "regex", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "replacement": { + "name": "replacement", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permanent": { + "name": "permanent", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "uniqueConfigKey": { + "name": "uniqueConfigKey", + "type": "serial", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redirect_applicationId_application_applicationId_fk": { + "name": "redirect_applicationId_application_applicationId_fk", + "tableFrom": "redirect", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.security": { + "name": "security", + "schema": "", + "columns": { + "securityId": { + "name": "securityId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "security_applicationId_application_applicationId_fk": { + "name": "security_applicationId_application_applicationId_fk", + "tableFrom": "security", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "security_username_applicationId_unique": { + "name": "security_username_applicationId_unique", + "nullsNotDistinct": false, + "columns": [ + "username", + "applicationId" + ] + } + } + }, + "public.port": { + "name": "port", + "schema": "", + "columns": { + "portId": { + "name": "portId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "publishedPort": { + "name": "publishedPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "targetPort": { + "name": "targetPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "protocol": { + "name": "protocol", + "type": "protocolType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "applicationId": { + "name": "applicationId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "port_applicationId_application_applicationId_fk": { + "name": "port_applicationId_application_applicationId_fk", + "tableFrom": "port", + "tableTo": "application", + "columnsFrom": [ + "applicationId" + ], + "columnsTo": [ + "applicationId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.redis": { + "name": "redis", + "schema": "", + "columns": { + "redisId": { + "name": "redisId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "dockerImage": { + "name": "dockerImage", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "memoryReservation": { + "name": "memoryReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memoryLimit": { + "name": "memoryLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuReservation": { + "name": "cpuReservation", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cpuLimit": { + "name": "cpuLimit", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "externalPort": { + "name": "externalPort", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applicationStatus": { + "name": "applicationStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "redis_projectId_project_projectId_fk": { + "name": "redis_projectId_project_projectId_fk", + "tableFrom": "redis", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "redis_appName_unique": { + "name": "redis_appName_unique", + "nullsNotDistinct": false, + "columns": [ + "appName" + ] + } + } + }, + "public.compose": { + "name": "compose", + "schema": "", + "columns": { + "composeId": { + "name": "composeId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appName": { + "name": "appName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env": { + "name": "env", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composeFile": { + "name": "composeFile", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sourceType": { + "name": "sourceType", + "type": "sourceTypeCompose", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'github'" + }, + "composeType": { + "name": "composeType", + "type": "composeType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'docker-compose'" + }, + "repository": { + "name": "repository", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "branch": { + "name": "branch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "autoDeploy": { + "name": "autoDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "customGitUrl": { + "name": "customGitUrl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitBranch": { + "name": "customGitBranch", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "customGitSSHKey": { + "name": "customGitSSHKey", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "command": { + "name": "command", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "composePath": { + "name": "composePath", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'./docker-compose.yml'" + }, + "composeStatus": { + "name": "composeStatus", + "type": "applicationStatus", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'idle'" + }, + "projectId": { + "name": "projectId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "compose_projectId_project_projectId_fk": { + "name": "compose_projectId_project_projectId_fk", + "tableFrom": "compose", + "tableTo": "project", + "columnsFrom": [ + "projectId" + ], + "columnsTo": [ + "projectId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.registry": { + "name": "registry", + "schema": "", + "columns": { + "registryId": { + "name": "registryId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "registryName": { + "name": "registryName", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "imagePrefix": { + "name": "imagePrefix", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "registryUrl": { + "name": "registryUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "selfHosted": { + "name": "selfHosted", + "type": "RegistryType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'cloud'" + }, + "adminId": { + "name": "adminId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "registry_adminId_admin_adminId_fk": { + "name": "registry_adminId_admin_adminId_fk", + "tableFrom": "registry", + "tableTo": "admin", + "columnsFrom": [ + "adminId" + ], + "columnsTo": [ + "adminId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.discord": { + "name": "discord", + "schema": "", + "columns": { + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.email": { + "name": "email", + "schema": "", + "columns": { + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "smtpServer": { + "name": "smtpServer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "smtpPort": { + "name": "smtpPort", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "fromAddress": { + "name": "fromAddress", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "toAddress": { + "name": "toAddress", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.notification": { + "name": "notification", + "schema": "", + "columns": { + "notificationId": { + "name": "notificationId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "appDeploy": { + "name": "appDeploy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "userJoin": { + "name": "userJoin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "appBuildError": { + "name": "appBuildError", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "databaseBackup": { + "name": "databaseBackup", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dokployRestart": { + "name": "dokployRestart", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notificationType": { + "name": "notificationType", + "type": "notificationType", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "discordId": { + "name": "discordId", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "emailId": { + "name": "emailId", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "notification_slackId_slack_slackId_fk": { + "name": "notification_slackId_slack_slackId_fk", + "tableFrom": "notification", + "tableTo": "slack", + "columnsFrom": [ + "slackId" + ], + "columnsTo": [ + "slackId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_telegramId_telegram_telegramId_fk": { + "name": "notification_telegramId_telegram_telegramId_fk", + "tableFrom": "notification", + "tableTo": "telegram", + "columnsFrom": [ + "telegramId" + ], + "columnsTo": [ + "telegramId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_discordId_discord_discordId_fk": { + "name": "notification_discordId_discord_discordId_fk", + "tableFrom": "notification", + "tableTo": "discord", + "columnsFrom": [ + "discordId" + ], + "columnsTo": [ + "discordId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "notification_emailId_email_emailId_fk": { + "name": "notification_emailId_email_emailId_fk", + "tableFrom": "notification", + "tableTo": "email", + "columnsFrom": [ + "emailId" + ], + "columnsTo": [ + "emailId" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.slack": { + "name": "slack", + "schema": "", + "columns": { + "slackId": { + "name": "slackId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "webhookUrl": { + "name": "webhookUrl", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel": { + "name": "channel", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.telegram": { + "name": "telegram", + "schema": "", + "columns": { + "telegramId": { + "name": "telegramId", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "botToken": { + "name": "botToken", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "public.buildType": { + "name": "buildType", + "schema": "public", + "values": [ + "dockerfile", + "heroku_buildpacks", + "paketo_buildpacks", + "nixpacks" + ] + }, + "public.sourceType": { + "name": "sourceType", + "schema": "public", + "values": [ + "docker", + "git", + "github" + ] + }, + "public.Roles": { + "name": "Roles", + "schema": "public", + "values": [ + "admin", + "user" + ] + }, + "public.databaseType": { + "name": "databaseType", + "schema": "public", + "values": [ + "postgres", + "mariadb", + "mysql", + "mongo" + ] + }, + "public.deploymentStatus": { + "name": "deploymentStatus", + "schema": "public", + "values": [ + "running", + "done", + "error" + ] + }, + "public.mountType": { + "name": "mountType", + "schema": "public", + "values": [ + "bind", + "volume", + "file" + ] + }, + "public.serviceType": { + "name": "serviceType", + "schema": "public", + "values": [ + "application", + "postgres", + "mysql", + "mariadb", + "mongo", + "redis", + "compose" + ] + }, + "public.protocolType": { + "name": "protocolType", + "schema": "public", + "values": [ + "tcp", + "udp" + ] + }, + "public.applicationStatus": { + "name": "applicationStatus", + "schema": "public", + "values": [ + "idle", + "running", + "done", + "error" + ] + }, + "public.certificateType": { + "name": "certificateType", + "schema": "public", + "values": [ + "letsencrypt", + "none" + ] + }, + "public.composeType": { + "name": "composeType", + "schema": "public", + "values": [ + "docker-compose", + "stack" + ] + }, + "public.sourceTypeCompose": { + "name": "sourceTypeCompose", + "schema": "public", + "values": [ + "git", + "github", + "raw" + ] + }, + "public.RegistryType": { + "name": "RegistryType", + "schema": "public", + "values": [ + "selfHosted", + "cloud" + ] + }, + "public.notificationType": { + "name": "notificationType", + "schema": "public", + "values": [ + "slack", + "telegram", + "discord", + "email" + ] + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 7b2a2406..d74596fe 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -155,6 +155,27 @@ "when": 1720768664067, "tag": "0021_nervous_dragon_lord", "breakpoints": true + }, + { + "idx": 22, + "version": "6", + "when": 1720935190450, + "tag": "0022_keen_norrin_radd", + "breakpoints": true + }, + { + "idx": 23, + "version": "6", + "when": 1720937318257, + "tag": "0023_military_korg", + "breakpoints": true + }, + { + "idx": 24, + "version": "6", + "when": 1720937370382, + "tag": "0024_bored_the_hand", + "breakpoints": true } ] } \ No newline at end of file diff --git a/emails/.gitignore b/emails/.gitignore new file mode 100644 index 00000000..b2d59d1f --- /dev/null +++ b/emails/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/dist \ No newline at end of file diff --git a/emails/emails/build-failed.tsx b/emails/emails/build-failed.tsx new file mode 100644 index 00000000..542ae498 --- /dev/null +++ b/emails/emails/build-failed.tsx @@ -0,0 +1,108 @@ +import * as React from "react"; +import { + Body, + Button, + Container, + Head, + Html, + Link, + Preview, + Section, + Text, + Tailwind, + Img, + Heading, +} from "@react-email/components"; + +export type TemplateProps = { + projectName: string; + applicationName: string; + applicationType: string; + errorMessage: string; + buildLink: string; +}; + +export const BuildFailedEmail = ({ + projectName = "dokploy", + applicationName = "frontend", + applicationType = "application", + errorMessage = "Error array.length is not a function", + buildLink = "https://dokploy.com/projects/dokploy-test/applications/dokploy-test", +}: TemplateProps) => { + const previewText = `Build failed for ${applicationName}`; + return ( + + + {previewText} + + + +
+ Dokploy +
+ + Build failed for {applicationName} + + + Hello, + + + Your build for {applicationName} failed. Please + check the error message below. + +
+ Details: + + Project Name: {projectName} + + + Application Name: {applicationName} + + + Application Type: {applicationType} + +
+
+ Reason: + {errorMessage} +
+
+ +
+ + or copy and paste this URL into your browser:{" "} + + {buildLink} + + +
+ +
+ + ); +}; + +export default BuildFailedEmail; diff --git a/emails/emails/invitation.tsx b/emails/emails/invitation.tsx new file mode 100644 index 00000000..d9b710c9 --- /dev/null +++ b/emails/emails/invitation.tsx @@ -0,0 +1,96 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Link, + Preview, + Section, + Text, + Tailwind, + Img, + Heading, +} from "@react-email/components"; + +export type TemplateProps = { + email: string; + name: string; +}; + +interface VercelInviteUserEmailProps { + inviteLink: string; + toEmail: string; +} + +export const InvitationEmail = ({ + inviteLink, + toEmail, +}: VercelInviteUserEmailProps) => { + const previewText = "Join to Dokploy"; + return ( + + + {previewText} + + + +
+ Dokploy +
+ + Join to Dokploy + + + Hello, + + + You have been invited to join Dokploy, a platform + that helps for deploying your apps to the cloud. + +
+ +
+ + or copy and paste this URL into your browser:{" "} + + https://dokploy.com + + +
+ + This invitation was intended for {toEmail}. This invite was sent + from dokploy.com. If you + were not expecting this invitation, you can ignore this email. If + you are concerned about your account's safety, please reply to + +
+ +
+ + ); +}; + +export default InvitationEmail; diff --git a/emails/emails/notion-magic-link.tsx b/emails/emails/notion-magic-link.tsx new file mode 100644 index 00000000..89cc3444 --- /dev/null +++ b/emails/emails/notion-magic-link.tsx @@ -0,0 +1,150 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Link, + Preview, + Text, +} from "@react-email/components"; +import * as React from "react"; + +interface NotionMagicLinkEmailProps { + loginCode?: string; +} + +const baseUrl = process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : ""; + +export const NotionMagicLinkEmail = ({ + loginCode, +}: NotionMagicLinkEmailProps) => ( + + + Log in with this magic link + + + Login + + Click here to log in with this magic link + + + Or, copy and paste this temporary login code: + + {loginCode} + + If you didn't try to login, you can safely ignore this email. + + + Hint: You can set a permanent password in Settings & members → My + account. + + Notion's Logo + + + Notion.so + + , the all-in-one-workspace +
+ for your notes, tasks, wikis, and databases. +
+
+ + +); + +NotionMagicLinkEmail.PreviewProps = { + loginCode: "sparo-ndigo-amurt-secan", +} as NotionMagicLinkEmailProps; + +export default NotionMagicLinkEmail; + +const main = { + backgroundColor: "#ffffff", +}; + +const container = { + paddingLeft: "12px", + paddingRight: "12px", + margin: "0 auto", +}; + +const h1 = { + color: "#333", + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", + fontSize: "24px", + fontWeight: "bold", + margin: "40px 0", + padding: "0", +}; + +const link = { + color: "#2754C5", + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", + fontSize: "14px", + textDecoration: "underline", +}; + +const text = { + color: "#333", + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", + fontSize: "14px", + margin: "24px 0", +}; + +const footer = { + color: "#898989", + fontFamily: + "-apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif", + fontSize: "12px", + lineHeight: "22px", + marginTop: "12px", + marginBottom: "24px", +}; + +const code = { + display: "inline-block", + padding: "16px 4.5%", + width: "90.5%", + backgroundColor: "#f4f4f4", + borderRadius: "5px", + border: "1px solid #eee", + color: "#333", +}; diff --git a/emails/emails/plaid-verify-identity.tsx b/emails/emails/plaid-verify-identity.tsx new file mode 100644 index 00000000..877162d1 --- /dev/null +++ b/emails/emails/plaid-verify-identity.tsx @@ -0,0 +1,158 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Link, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +interface PlaidVerifyIdentityEmailProps { + validationCode?: string; +} + +const baseUrl = process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : ""; + +export const PlaidVerifyIdentityEmail = ({ + validationCode, +}: PlaidVerifyIdentityEmailProps) => ( + + + + + Plaid + Verify Your Identity + + Enter the following code to finish linking Venmo. + +
+ {validationCode} +
+ Not expecting this email? + + Contact{" "} + + login@plaid.com + {" "} + if you did not request this code. + +
+ Securely powered by Plaid. + + +); + +PlaidVerifyIdentityEmail.PreviewProps = { + validationCode: "144833", +} as PlaidVerifyIdentityEmailProps; + +export default PlaidVerifyIdentityEmail; + +const main = { + backgroundColor: "#ffffff", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", +}; + +const container = { + backgroundColor: "#ffffff", + border: "1px solid #eee", + borderRadius: "5px", + boxShadow: "0 5px 10px rgba(20,50,70,.2)", + marginTop: "20px", + maxWidth: "360px", + margin: "0 auto", + padding: "68px 0 130px", +}; + +const logo = { + margin: "0 auto", +}; + +const tertiary = { + color: "#0a85ea", + fontSize: "11px", + fontWeight: 700, + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + height: "16px", + letterSpacing: "0", + lineHeight: "16px", + margin: "16px 8px 8px 8px", + textTransform: "uppercase" as const, + textAlign: "center" as const, +}; + +const secondary = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Medium,Helvetica,Arial,sans-serif", + fontSize: "20px", + fontWeight: 500, + lineHeight: "24px", + marginBottom: "0", + marginTop: "0", + textAlign: "center" as const, +}; + +const codeContainer = { + background: "rgba(0,0,0,.05)", + borderRadius: "4px", + margin: "16px auto 14px", + verticalAlign: "middle", + width: "280px", +}; + +const code = { + color: "#000", + display: "inline-block", + fontFamily: "HelveticaNeue-Bold", + fontSize: "32px", + fontWeight: 700, + letterSpacing: "6px", + lineHeight: "40px", + paddingBottom: "8px", + paddingTop: "8px", + margin: "0 auto", + width: "100%", + textAlign: "center" as const, +}; + +const paragraph = { + color: "#444", + fontSize: "15px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + letterSpacing: "0", + lineHeight: "23px", + padding: "0 40px", + margin: "0", + textAlign: "center" as const, +}; + +const link = { + color: "#444", + textDecoration: "underline", +}; + +const footer = { + color: "#000", + fontSize: "12px", + fontWeight: 800, + letterSpacing: "0", + lineHeight: "23px", + margin: "0", + marginTop: "20px", + fontFamily: "HelveticaNeue,Helvetica,Arial,sans-serif", + textAlign: "center" as const, + textTransform: "uppercase" as const, +}; diff --git a/emails/emails/static/notion-logo.png b/emails/emails/static/notion-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..57cddee9b737055f418bd95f126093204bb09e3f GIT binary patch literal 1929 zcmV;42X^?0P)hmX z+?la#F$UPeFocWj!A>VJ$i_%Io=9I`NJdtFt_Ztqq}li>{sjSA#zgT>*+a+D*CSz2 zo8V-a`#^*c37{HJHteNjyeeMl8k=m)vT=x&0Fx5W>np}R=|co~%ElBkF@n#MA)j8jkR*I=aKiH3a_e>Qx-l3VxCQ+!437_eqQi@6wMPggqDTZ zoy#VO2l>R6Nca{N36lspxU)HLi9xpdA`-h6#mXv6!d<4Z+S>)3@ijQBc( zl?wuJIA8W;F;ka~GgQj43+34L61A1E!zY}#aN_(nC_lL`H)B*|6d7l%F?fjm1*Vdq zjR>Gh!UI7xm}rc1sqxO3F_Yz>Z34)$@T=r|{R-X*G@JXIHYK1;7EmR)lfVCQhWUsa zAVB0e#}ovKqUCK95FlLRZIxqnrPQA37pC$mXKk7=g8*hw4RI)_X6hJ^>e}X_iUR>^ z8ZXrt(|4redIw!2fNF>?8jo_WCZP}@75bNIj0tqG3i#BL1mfxg>|p%33GfqBA2$I2 z5C8xH01yBG0f0#R05M>q9IH#$sw^Dk{rv|JARKTb@`o~}grA29(7^Lfy|*y`S^lDi zl*m{Kqg}(e2LX;JnS0mw6QR`<{Cz#&So51lx5UQh*RufuJ{vl*5Ei)(FNEGU!I;qN zdAr=|t6)N`0&G5ge9PRv=O7hQ^j9{%vXebJ%|DY#-E5256_M_&+2CkSONrY?N;DH6Cl!q#`-z;_2q^-rq!1}*{bLK-ol5}-;1T4|nkscX zH32xmmMnsI8$bfev4}wmKmffIfB+F=)O8sE0jf#C5Cnh}fB+F=BKiX$0Hgo}h!uk_ zN&yHExfH}ifEA=5ZUX#Zbj!Z(L4Ytp^~&1Lyyh-80_?N#NZ1<~fB@lP$!L~Zb)qVW zwF;OKeNOOF5Gw(A1fY7_CTJ;$xesv1Xdb!J6 z1!x7+^#+El+9uE-fQM2rC;BYcPZxmzHL+rJPvrz91t37=QUC&cfR}_+ZQ@{_E&>5Q zW69{A$bA9D@mjV!=yf;881q%=$Jn+5%RhxJM z0>s@LfCL0A1#=J}Zmd{`_b>thB9{UXpc;5d_y_{TjU{X0#f>0<|55+~L=4I{F$fSS zDBHwd5?~7(YkLE;E)!q}8*9P)0-LT9AccM7=?$Efgt!&#TS*G$T_ixB=m2`GLXVhb z1lV`2++pu~4B1$n6SNeZY08~0^}qQ_-REq)vG>gzmhAmLebY7k+*uyGNPrN^9q!Tp z)c8Ga_=OJT8$2LOM2BUTBJCpt6CwRaerCd*A$1a&sa2^hu+ zdebFgbA|;ZK42gc>#5B$uq+>#iOg~UJ6H+nL&eat#`neXsP6nz>>Zrv18ald=|_@` z4Ne%dUy!g(+P=sh;b-x-X4U<4cp3TC<8V6C81q8onLZ=U#ua4*kn@32MHchPd$LeT zs9sj&RhJsi>^io#B0%m5F9v$VBf(=yB3a~BV~uA5dhj03#ufo`k4rGmUgAi4zgRlS zpKSb%`SuQ6a{q1XWE3}zFzCj#ZMNn404Cqoub#`xlB5RZ9z4L z>V2wrl6qfk1ju^?_l%}(T4ao^#yh?8z8DE0Cx;VFa@cwA0|4jvPk;dc68z~C(;byw P00000NkvXXu0mjfWmII? literal 0 HcmV?d00001 diff --git a/emails/emails/static/plaid-logo.png b/emails/emails/static/plaid-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9d08cb23a9d033c9be3c5a28cefae06214bf52 GIT binary patch literal 3987 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 Q`MOc)X&Y$~G#!!u13Bs91poj5 literal 0 HcmV?d00001 diff --git a/emails/emails/static/vercel-user.png b/emails/emails/static/vercel-user.png new file mode 100644 index 0000000000000000000000000000000000000000..81beac6945a486f6c03edaad5e035a1c6a67026b GIT binary patch literal 55726 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

b_4NZ02x!e-&bvaid>@c6qBDycI@ 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

N10A(43%#Xj0Fa8KtC0cBko)!Tx5rY*_)wkZy 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 literal 0 HcmV?d00001 diff --git a/emails/emails/stripe-welcome.tsx b/emails/emails/stripe-welcome.tsx new file mode 100644 index 00000000..17a41b82 --- /dev/null +++ b/emails/emails/stripe-welcome.tsx @@ -0,0 +1,152 @@ +import { + Body, + Button, + Container, + Head, + Hr, + Html, + Img, + Link, + Preview, + Section, + Text, +} from "@react-email/components"; +import * as React from "react"; + +const baseUrl = process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : ""; + +export const StripeWelcomeEmail = () => ( + + + You're now ready to make live transactions with Stripe! + + +

+ Stripe +
+ + Thanks for submitting your account information. You're now ready to + make live transactions with Stripe! + + + You can view your payments and a variety of other information about + your account right from your dashboard. + + +
+ + If you haven't finished your integration, you might find our{" "} + + docs + {" "} + handy. + + + Once you're ready to start accepting payments, you'll just need to + use your live{" "} + + API keys + {" "} + instead of your test API keys. Your account can simultaneously be + used for both test and live requests, so you can continue testing + while accepting live payments. Check out our{" "} + + tutorial about account basics + + . + + + Finally, we've put together a{" "} + + quick checklist + {" "} + to ensure your website conforms to card network standards. + + + We'll be here to help you with any step along the way. You can find + answers to most questions and get in touch with us on our{" "} + + support site + + . + + — The Stripe team +
+ + Stripe, 354 Oyster Point Blvd, South San Francisco, CA 94080 + +
+ + + +); + +export default StripeWelcomeEmail; + +const main = { + backgroundColor: "#f6f9fc", + fontFamily: + '-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Ubuntu,sans-serif', +}; + +const container = { + backgroundColor: "#ffffff", + margin: "0 auto", + padding: "20px 0 48px", + marginBottom: "64px", +}; + +const box = { + padding: "0 48px", +}; + +const hr = { + borderColor: "#e6ebf1", + margin: "20px 0", +}; + +const paragraph = { + color: "#525f7f", + + fontSize: "16px", + lineHeight: "24px", + textAlign: "left" as const, +}; + +const anchor = { + color: "#556cd6", +}; + +const button = { + backgroundColor: "#656ee8", + borderRadius: "5px", + color: "#fff", + fontSize: "16px", + fontWeight: "bold", + textDecoration: "none", + textAlign: "center" as const, + display: "block", + width: "100%", + padding: "10px", +}; + +const footer = { + color: "#8898aa", + fontSize: "12px", + lineHeight: "16px", +}; diff --git a/emails/emails/vercel-invite-user.tsx b/emails/emails/vercel-invite-user.tsx new file mode 100644 index 00000000..a7a82a99 --- /dev/null +++ b/emails/emails/vercel-invite-user.tsx @@ -0,0 +1,154 @@ +import { + Body, + Button, + Container, + Column, + Head, + Heading, + Hr, + Html, + Img, + Link, + Preview, + Row, + Section, + Text, + Tailwind, +} from "@react-email/components"; +import * as React from "react"; + +interface VercelInviteUserEmailProps { + username?: string; + userImage?: string; + invitedByUsername?: string; + invitedByEmail?: string; + teamName?: string; + teamImage?: string; + inviteLink?: string; + inviteFromIp?: string; + inviteFromLocation?: string; +} + +const baseUrl = process.env.VERCEL_URL + ? `https://${process.env.VERCEL_URL}` + : ""; + +export const VercelInviteUserEmail = ({ + username, + userImage, + invitedByUsername, + invitedByEmail, + teamName, + teamImage, + inviteLink, + inviteFromIp, + inviteFromLocation, +}: VercelInviteUserEmailProps) => { + const previewText = `Join ${invitedByUsername} on Vercel`; + + return ( + + + {previewText} + + + +
+ Vercel +
+ + Join {teamName} on Vercel + + + Hello {username}, + + + {invitedByUsername} ( + + {invitedByEmail} + + ) has invited you to the {teamName} team on{" "} + Vercel. + +
+ + + + + + invited you to + + + + + +
+
+ +
+ + or copy and paste this URL into your browser:{" "} + + {inviteLink} + + +
+ + This invitation was intended for{" "} + {username}. This invite was + sent from {inviteFromIp}{" "} + located in{" "} + {inviteFromLocation}. If you + were not expecting this invitation, you can ignore this email. If + you are concerned about your account's safety, please reply to + this email to get in touch with us. + +
+ +
+ + ); +}; + +VercelInviteUserEmail.PreviewProps = { + username: "alanturing", + userImage: `${baseUrl}/static/vercel-user.png`, + invitedByUsername: "Alan", + invitedByEmail: "alan.turing@example.com", + teamName: "Enigma", + teamImage: `${baseUrl}/static/vercel-team.png`, + inviteLink: "https://vercel.com/teams/invite/foo", + inviteFromIp: "204.13.186.218", + inviteFromLocation: "São Paulo, Brazil", +} as VercelInviteUserEmailProps; + +export default VercelInviteUserEmail; diff --git a/emails/package.json b/emails/package.json new file mode 100644 index 00000000..c7aad5b5 --- /dev/null +++ b/emails/package.json @@ -0,0 +1,20 @@ +{ + "name": "emails", + "version": "0.0.19", + "private": true, + "type": "module", + "scripts": { + "build": "email build", + "dev": "email dev", + "export": "email export" + }, + "dependencies": { + "@react-email/components": "0.0.21", + "react-email": "2.1.5", + "react": "^18.2.0" + }, + "devDependencies": { + "@types/react": "18.2.33", + "@types/react-dom": "18.2.14" + } +} diff --git a/emails/pnpm-lock.yaml b/emails/pnpm-lock.yaml new file mode 100644 index 00000000..270dd6cb --- /dev/null +++ b/emails/pnpm-lock.yaml @@ -0,0 +1,4209 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@react-email/components': + specifier: 0.0.21 + version: 0.0.21(@types/react@18.2.33)(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ^18.2.0 + version: 18.3.1 + react-email: + specifier: 2.1.5 + version: 2.1.5(eslint@9.7.0) + +devDependencies: + '@types/react': + specifier: 18.2.33 + version: 18.2.33 + '@types/react-dom': + specifier: 18.2.14 + version: 18.2.14 + +packages: + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + dev: false + + /@babel/compat-data@7.24.8: + resolution: {integrity: sha512-c4IM7OTg6k1Q+AJ153e2mc2QVTezTwnb4VzquwcyiEzGnW0Kedv4do/TrkU98qPeC5LNiMt/QXwIjzYXLBpyZg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.24.5: + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.8 + '@babel/helper-compilation-targets': 7.24.8 + '@babel/helper-module-transforms': 7.24.8(@babel/core@7.24.5) + '@babel/helpers': 7.24.8 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.24.8: + resolution: {integrity: sha512-47DG+6F5SzOi0uEvK4wMShmn5yY0mVjVJoWTphdY2B4Rx9wHgjK7Yhtr0ru6nE+sn0v38mzrWOlah0p/YlHHOQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-compilation-targets@7.24.8: + resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-module-transforms@7.24.8(@babel/core@7.24.5): + resolution: {integrity: sha512-m4vWKVqvkVAWLXfHCCfff2luJj86U+J0/x+0N3ArG/tP0Fq7zky2dYwMbtPmkc/oulkkbjdL3uWzuoBwQ8R00Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.8 + '@babel/types': 7.24.8 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.24.8: + resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.8 + dev: false + + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + dev: false + + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/parser@7.24.8: + resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.8 + dev: false + + /@babel/runtime@7.24.8: + resolution: {integrity: sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.8 + dev: false + + /@babel/traverse@7.24.8: + resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.8 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.8 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.24.8: + resolution: {integrity: sha512-SkSBEHwwJRU52QEVZBmMBnE5Ux2/6WU1grdYyOhpbCNxbmJrDuDCphBzKZSO3taf0zztp+qkWlymE5tVL5l0TA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: false + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false + optional: true + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@9.7.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.7.0 + eslint-visitor-keys: 3.4.3 + dev: false + + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: false + + /@eslint/config-array@0.17.0: + resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@eslint/eslintrc@3.1.0: + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@eslint/js@9.7.0: + resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: false + + /@eslint/object-schema@2.1.4: + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: false + + /@floating-ui/core@1.6.4: + resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} + dependencies: + '@floating-ui/utils': 0.2.4 + dev: false + + /@floating-ui/dom@1.6.7: + resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} + dependencies: + '@floating-ui/core': 1.6.4 + '@floating-ui/utils': 0.2.4 + dev: false + + /@floating-ui/react-dom@2.1.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.7 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@floating-ui/utils@0.2.4: + resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} + dev: false + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: false + + /@humanwhocodes/retry@0.3.0: + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + dev: false + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: false + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: false + + /@next/env@14.1.4: + resolution: {integrity: sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==} + dev: false + + /@next/swc-darwin-arm64@14.1.4: + resolution: {integrity: sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@14.1.4: + resolution: {integrity: sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@14.1.4: + resolution: {integrity: sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@14.1.4: + resolution: {integrity: sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@14.1.4: + resolution: {integrity: sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@14.1.4: + resolution: {integrity: sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@14.1.4: + resolution: {integrity: sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@14.1.4: + resolution: {integrity: sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@14.1.4: + resolution: {integrity: sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: false + + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@radix-ui/colors@1.0.1: + resolution: {integrity: sha512-xySw8f0ZVsAEP+e7iLl3EvcBXX7gsIlC1Zso/sPBW9gIWerBTgz6axrjU+MZ39wD+WFi5h5zdWpsg3+hwt2Qsg==} + dev: false + + /@radix-ui/primitive@1.1.0: + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + dev: false + + /@radix-ui/react-arrow@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-collection@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.33)(react@18.3.1): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.8 + '@types/react': 18.2.33 + react: 18.3.1 + dev: false + + /@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-context@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-direction@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-id@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-popover@1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.3.1) + dev: false + + /@radix-ui/react-popper@1.2.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-portal@1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-primitive@2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.33)(react@18.3.1): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.8 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.33)(react@18.3.1) + '@types/react': 18.2.33 + react: 18.3.1 + dev: false + + /@radix-ui/react-slot@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-toggle-group@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-toggle': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-toggle@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-tooltip@1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-rect@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/rect': 1.1.0 + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-use-size@1.1.0(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@types/react': 18.2.47 + react: 18.3.1 + dev: false + + /@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /@radix-ui/rect@1.1.0: + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + dev: false + + /@react-email/body@0.0.8(react@18.3.1): + resolution: {integrity: sha512-gqdkNYlIaIw0OdpWu8KjIcQSIFvx7t2bZpXVxMMvBS859Ia1+1X3b5RNbjI3S1ZqLddUf7owOHkO4MiXGE+nxg==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/button@0.0.15(react@18.3.1): + resolution: {integrity: sha512-9Zi6SO3E8PoHYDfcJTecImiHLyitYWmIRs0HE3Ogra60ZzlWP2EXu+AZqwQnhXuq+9pbgwBWNWxB5YPetNPTNA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/code-block@0.0.5(react@18.3.1): + resolution: {integrity: sha512-mmInpZsSIkNaYC1y40/S0XXrIqbTzrpllP6J1JMJuDOBG8l5T7pNl4V+gwfsSTvy9hVsuzQFmhHK8kVb1UXv3A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + prismjs: 1.29.0 + react: 18.3.1 + dev: false + + /@react-email/code-inline@0.0.2(react@18.3.1): + resolution: {integrity: sha512-0cmgbbibFeOJl0q04K9jJlPDuJ+SEiX/OG6m3Ko7UOkG3TqjRD8Dtvkij6jNDVfUh/zESpqJCP2CxrCLLMUjdA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/column@0.0.10(react@18.3.1): + resolution: {integrity: sha512-MnP8Mnwipr0X3XtdD6jMLckb0sI5/IlS6Kl/2F6/rsSWBJy5Gg6nizlekTdkwDmy0kNSe3/1nGU0Zqo98pl63Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/components@0.0.21(@types/react@18.2.33)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-fwGfH7FF+iuq+IdPcbEO5HoF0Pakk9big+fFW9+3kiyvbSNuo8Io1rhPTMLd8q41XomN4g7mgWovdAeS/8PHrA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + '@react-email/body': 0.0.8(react@18.3.1) + '@react-email/button': 0.0.15(react@18.3.1) + '@react-email/code-block': 0.0.5(react@18.3.1) + '@react-email/code-inline': 0.0.2(react@18.3.1) + '@react-email/column': 0.0.10(react@18.3.1) + '@react-email/container': 0.0.12(react@18.3.1) + '@react-email/font': 0.0.6(react@18.3.1) + '@react-email/head': 0.0.9(react@18.3.1) + '@react-email/heading': 0.0.12(@types/react@18.2.33)(react@18.3.1) + '@react-email/hr': 0.0.8(react@18.3.1) + '@react-email/html': 0.0.8(react@18.3.1) + '@react-email/img': 0.0.8(react@18.3.1) + '@react-email/link': 0.0.8(react@18.3.1) + '@react-email/markdown': 0.0.10(react@18.3.1) + '@react-email/preview': 0.0.9(react@18.3.1) + '@react-email/render': 0.0.16(react-dom@18.3.1)(react@18.3.1) + '@react-email/row': 0.0.8(react@18.3.1) + '@react-email/section': 0.0.12(react@18.3.1) + '@react-email/tailwind': 0.0.18(react@18.3.1) + '@react-email/text': 0.0.8(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: false + + /@react-email/container@0.0.12(react@18.3.1): + resolution: {integrity: sha512-HFu8Pu5COPFfeZxSL+wKv/TV5uO/sp4zQ0XkRCdnGkj/xoq0lqOHVDL4yC2Pu6fxXF/9C3PHDA++5uEYV5WVJw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/font@0.0.6(react@18.3.1): + resolution: {integrity: sha512-sZZFvEZ4U3vNCAZ8wXqIO3DuGJR2qE/8m2fEH+tdqwa532zGO3zW+UlCTg0b9455wkJSzEBeaWik0IkNvjXzxw==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/head@0.0.9(react@18.3.1): + resolution: {integrity: sha512-dF3Uv1qy3oh+IU2atXdv5Xk0hk2udOlMb1A/MNGngC0eHyoEV9ThA0XvhN7mm5x9dDLkVamoWUKXDtmkiuSRqQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/heading@0.0.12(@types/react@18.2.33)(react@18.3.1): + resolution: {integrity: sha512-eB7mpnAvDmwvQLoPuwEiPRH4fPXWe6ltz6Ptbry2BlI88F0a2k11Ghb4+sZHBqg7vVw/MKbqEgtLqr3QJ/KfCQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.33)(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@react-email/hr@0.0.8(react@18.3.1): + resolution: {integrity: sha512-JLVvpCg2wYKEB+n/PGCggWG9fRU5e4lxsGdpK5SDLsCL0ic3OLKSpHMfeE+ZSuw0GixAVVQN7F64PVJHQkd4MQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/html@0.0.8(react@18.3.1): + resolution: {integrity: sha512-arII3wBNLpeJtwyIJXPaILm5BPKhA+nvdC1F9QkuKcOBJv2zXctn8XzPqyGqDfdplV692ulNJP7XY55YqbKp6w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/img@0.0.8(react@18.3.1): + resolution: {integrity: sha512-jx/rPuKo31tV18fu7P5rRqelaH5wkhg83Dq7uLwJpfqhbi4KFBGeBfD0Y3PiLPPoh+WvYf+Adv9W2ghNW8nOMQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/link@0.0.8(react@18.3.1): + resolution: {integrity: sha512-nVikuTi8WJHa6Baad4VuRUbUCa/7EtZ1Qy73TRejaCHn+vhetc39XGqHzKLNh+Z/JFL8Hv9g+4AgG16o2R0ogQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/markdown@0.0.10(react@18.3.1): + resolution: {integrity: sha512-MH0xO+NJ4IuJcx9nyxbgGKAMXyudFjCZ0A2GQvuWajemW9qy2hgnJ3mW3/z5lwcenG+JPn7JyO/iZpizQ7u1tA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + md-to-react-email: 5.0.2(react@18.3.1) + react: 18.3.1 + dev: false + + /@react-email/preview@0.0.9(react@18.3.1): + resolution: {integrity: sha512-2fyAA/zzZYfYmxfyn3p2YOIU30klyA6Dq4ytyWq4nfzQWWglt5hNDE0cMhObvRtfjM9ghMSVtoELAb0MWiF/kw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/render@0.0.16(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wDaMy27xAq1cJHtSFptp0DTKPuV2GYhloqia95ub/DH9Dea1aWYsbdM918MOc/b/HvVS3w1z8DWzfAk13bGStQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-promise-suspense: 0.3.4 + dev: false + + /@react-email/row@0.0.8(react@18.3.1): + resolution: {integrity: sha512-JsB6pxs/ZyjYpEML3nbwJRGAerjcN/Pa/QG48XUwnT/MioDWrUuyQuefw+CwCrSUZ2P1IDrv2tUD3/E3xzcoKw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/section@0.0.12(react@18.3.1): + resolution: {integrity: sha512-UCD/N/BeOTN4h3VZBUaFdiSem6HnpuxD1Q51TdBFnqeNqS5hBomp8LWJJ9s4gzwHWk1XPdNfLA3I/fJwulJshg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/tailwind@0.0.18(react@18.3.1): + resolution: {integrity: sha512-ob8CXX/Pqq1U8YfL5OJTL48WJkixizyoXMMRYTiDLDN9LVLU7lSLtcK9kOD9CgFbO2yUPQr7/5+7gnQJ+cXa8Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@react-email/text@0.0.8(react@18.3.1): + resolution: {integrity: sha512-uvN2TNWMrfC9wv/LLmMLbbEN1GrMWZb9dBK14eYxHHAEHCeyvGb5ePZZ2MPyzO7Y5yTC+vFEnCEr76V+hWMxCQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.3.1 + dev: false + + /@selderee/plugin-htmlparser2@0.11.0: + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + dev: false + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@swc/core-darwin-arm64@1.3.101: + resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-darwin-x64@1.3.101: + resolution: {integrity: sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.101: + resolution: {integrity: sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-gnu@1.3.101: + resolution: {integrity: sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-arm64-musl@1.3.101: + resolution: {integrity: sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-gnu@1.3.101: + resolution: {integrity: sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-linux-x64-musl@1.3.101: + resolution: {integrity: sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-arm64-msvc@1.3.101: + resolution: {integrity: sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-ia32-msvc@1.3.101: + resolution: {integrity: sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core-win32-x64-msvc@1.3.101: + resolution: {integrity: sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@swc/core@1.3.101: + resolution: {integrity: sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.9 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.101 + '@swc/core-darwin-x64': 1.3.101 + '@swc/core-linux-arm-gnueabihf': 1.3.101 + '@swc/core-linux-arm64-gnu': 1.3.101 + '@swc/core-linux-arm64-musl': 1.3.101 + '@swc/core-linux-x64-gnu': 1.3.101 + '@swc/core-linux-x64-musl': 1.3.101 + '@swc/core-win32-arm64-msvc': 1.3.101 + '@swc/core-win32-ia32-msvc': 1.3.101 + '@swc/core-win32-x64-msvc': 1.3.101 + dev: false + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + dependencies: + tslib: 2.6.3 + dev: false + + /@swc/types@0.1.9: + resolution: {integrity: sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==} + dependencies: + '@swc/counter': 0.1.3 + dev: false + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: false + + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + dependencies: + '@types/node': 20.14.10 + dev: false + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + dev: false + + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/node@20.14.10: + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/prismjs@1.26.4: + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + dev: false + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + /@types/react-dom@18.2.14: + resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} + dependencies: + '@types/react': 18.2.33 + + /@types/react@18.2.33: + resolution: {integrity: sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==} + dependencies: + '@types/prop-types': 15.7.12 + '@types/scheduler': 0.23.0 + csstype: 3.1.3 + + /@types/react@18.2.47: + resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} + dependencies: + '@types/prop-types': 15.7.12 + '@types/scheduler': 0.23.0 + csstype: 3.1.3 + dev: false + + /@types/scheduler@0.23.0: + resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} + + /@types/webpack@5.28.5(@swc/core@1.3.101)(esbuild@0.19.11): + resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} + dependencies: + '@types/node': 20.14.10 + tapable: 2.2.1 + webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.11) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: false + + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: false + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: false + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: false + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + dev: false + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: false + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: false + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + dev: false + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: false + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: false + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: false + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + dev: false + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: false + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + dev: false + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: false + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + dev: false + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: false + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: false + + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-import-attributes@1.9.5(acorn@8.12.1): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.12.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.12.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.12.1 + dev: false + + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.3 + dev: false + + /autoprefixer@10.4.14(postcss@8.4.38): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.2 + caniuse-lite: 1.0.30001642 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: false + + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001642 + electron-to-chromium: 1.4.827 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + + /caniuse-lite@1.0.30001642: + resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: false + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: false + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + dev: false + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: false + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: false + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.2 + dev: false + + /electron-to-chromium@1.4.827: + resolution: {integrity: sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + dev: false + + /engine.io@6.5.5: + resolution: {integrity: sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 20.14.10 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.5 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: false + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + dev: false + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: false + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /eslint-config-prettier@9.0.0(eslint@9.7.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 9.7.0 + dev: false + + /eslint-config-turbo@1.10.12(eslint@9.7.0): + resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + eslint: 9.7.0 + eslint-plugin-turbo: 1.10.12(eslint@9.7.0) + dev: false + + /eslint-plugin-turbo@1.10.12(eslint@9.7.0): + resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} + peerDependencies: + eslint: '>6.6.0' + dependencies: + dotenv: 16.0.3 + eslint: 9.7.0 + dev: false + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: false + + /eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: false + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: false + + /eslint@9.7.0: + resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.17.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.7.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + dev: false + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: false + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: false + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: false + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + + /fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: false + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + dev: false + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: false + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + dev: false + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: false + + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /framer-motion@10.17.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.3 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.2.1 + jackspeak: 2.3.6 + minimatch: 9.0.5 + minipass: 7.1.2 + path-scurry: 1.11.1 + dev: false + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + dev: false + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: false + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.14.10 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false + + /jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + dev: false + + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + dev: false + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: false + + /leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: false + + /lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + dev: false + + /md-to-react-email@5.0.2(react@18.3.1): + resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} + peerDependencies: + react: 18.x + dependencies: + marked: 7.0.4 + react: 18.3.1 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: false + + /next@14.1.4(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + sass: + optional: true + dependencies: + '@next/env': 14.1.4 + '@swc/helpers': 0.5.2 + busboy: 1.6.0 + caniuse-lite: 1.0.30001642 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.1.4 + '@next/swc-darwin-x64': 14.1.4 + '@next/swc-linux-arm64-gnu': 14.1.4 + '@next/swc-linux-arm64-musl': 14.1.4 + '@next/swc-linux-x64-gnu': 14.1.4 + '@next/swc-linux-x64-musl': 14.1.4 + '@next/swc-win32-arm64-msvc': 14.1.4 + '@next/swc-win32-ia32-msvc': 14.1.4 + '@next/swc-win32-x64-msvc': 14.1.4 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: false + + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: false + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + dev: false + + /peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + dev: false + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.2 + postcss: 8.4.38 + yaml: 2.4.5 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.1.1 + dev: false + + /postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: false + + /prism-react-renderer@2.1.0(react@18.3.1): + resolution: {integrity: sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ==} + peerDependencies: + react: '>=16.0.0' + dependencies: + '@types/prismjs': 1.26.4 + clsx: 1.2.1 + react: 18.3.1 + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-email@2.1.5(eslint@9.7.0): + resolution: {integrity: sha512-SjGt5XiqNwrC6FT0rAxERj0MC9binUOVZDzspAxcRHpxjZavvePAHvV29uROWNQ1Ha7ssg1sfy4dTQi7bjCXrg==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + '@radix-ui/colors': 1.0.1 + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-popover': 1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.2.47)(react@18.3.1) + '@radix-ui/react-toggle-group': 1.1.0(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.1(@types/react-dom@18.2.14)(@types/react@18.2.47)(react-dom@18.3.1)(react@18.3.1) + '@swc/core': 1.3.101 + '@types/react': 18.2.47 + '@types/react-dom': 18.2.14 + '@types/webpack': 5.28.5(@swc/core@1.3.101)(esbuild@0.19.11) + autoprefixer: 10.4.14(postcss@8.4.38) + chalk: 4.1.2 + chokidar: 3.5.3 + clsx: 2.1.0 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.19.11 + eslint-config-prettier: 9.0.0(eslint@9.7.0) + eslint-config-turbo: 1.10.12(eslint@9.7.0) + framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 14.1.4(@babel/core@7.24.5)(react-dom@18.3.1)(react@18.3.1) + normalize-path: 3.0.0 + ora: 5.4.1 + postcss: 8.4.38 + prism-react-renderer: 2.1.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + socket.io: 4.7.3 + socket.io-client: 4.7.3 + sonner: 1.3.1(react-dom@18.3.1)(react@18.3.1) + source-map-js: 1.0.2 + stacktrace-parser: 0.1.10 + tailwind-merge: 2.2.0 + tailwindcss: 3.4.0 + typescript: 5.1.6 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - babel-plugin-macros + - bufferutil + - eslint + - sass + - supports-color + - ts-node + - uglify-js + - utf-8-validate + - webpack-cli + dev: false + + /react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + dependencies: + fast-deep-equal: 2.0.1 + dev: false + + /react-remove-scroll-bar@2.3.6(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.3.1) + tslib: 2.6.3 + dev: false + + /react-remove-scroll@2.5.7(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.2.47)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.3.1) + tslib: 2.6.3 + use-callback-ref: 1.3.2(@types/react@18.2.47)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.3.1) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.3 + dev: false + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: false + + /selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + dependencies: + parseley: 0.12.1 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + dependencies: + debug: 4.3.5 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-client@4.7.3: + resolution: {integrity: sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io@4.7.3: + resolution: {integrity: sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.5 + engine.io: 6.5.5 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /sonner@1.3.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + dependencies: + type-fest: 0.7.1 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + + /styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.24.5 + client-only: 0.0.1 + react: 18.3.1 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /tailwind-merge@2.2.0: + resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} + dependencies: + '@babel/runtime': 7.24.8 + dev: false + + /tailwindcss@3.4.0: + resolution: {integrity: sha512-VigzymniH77knD1dryXbyxR+ePHihHociZbXnLZHUyzf2MMs2ZVqlUrZ3FvpXP8pno9JzmILt1sZPD19M3IxtA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.1.1 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + + /terser-webpack-plugin@5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.93.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@swc/core': 1.3.101 + esbuild: 0.19.11 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.2 + webpack: 5.93.0(@swc/core@1.3.101)(esbuild@0.19.11) + dev: false + + /terser@5.31.2: + resolution: {integrity: sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: false + + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + dev: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /use-callback-ref@1.3.2(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.3.1 + tslib: 2.6.3 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.47)(react@18.3.1): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.3 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: false + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: false + + /webpack@5.93.0(@swc/core@1.3.101)(esbuild@0.19.11): + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.93.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} + engines: {node: '>= 14'} + hasBin: true + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false diff --git a/emails/readme.md b/emails/readme.md new file mode 100644 index 00000000..fc875bfa --- /dev/null +++ b/emails/readme.md @@ -0,0 +1,27 @@ +# React Email Starter + +A live preview right in your browser so you don't need to keep sending real emails during development. + +## Getting Started + +First, install the dependencies: + +```sh +npm install +# or +yarn +``` + +Then, run the development server: + +```sh +npm run dev +# or +yarn dev +``` + +Open [localhost:3000](http://localhost:3000) with your browser to see the result. + +## License + +MIT License diff --git a/package.json b/package.json index 583f677c..32fbf648 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "@radix-ui/react-tabs": "^1.0.4", "@radix-ui/react-toggle": "^1.0.3", "@radix-ui/react-tooltip": "^1.0.7", + "@react-email/components": "^0.0.21", "@tanstack/react-query": "^4.36.1", "@tanstack/react-table": "^8.16.0", "@trpc/client": "^10.43.6", @@ -99,6 +100,7 @@ "node-os-utils": "1.3.7", "node-pty": "1.0.0", "node-schedule": "2.1.1", + "nodemailer": "6.9.14", "octokit": "3.1.2", "otpauth": "^9.2.3", "postgres": "3.4.4", @@ -118,8 +120,7 @@ "use-resize-observer": "9.1.0", "ws": "8.16.0", "xterm-addon-fit": "^0.8.0", - "zod": "^3.23.4", - "nodemailer": "6.9.14" + "zod": "^3.23.4" }, "devDependencies": { "@biomejs/biome": "1.7.1", @@ -130,6 +131,7 @@ "@types/node": "^18.17.0", "@types/node-os-utils": "1.3.4", "@types/node-schedule": "2.1.6", + "@types/nodemailer": "^6.4.15", "@types/qrcode": "^1.5.5", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", @@ -148,8 +150,7 @@ "typescript": "^5.4.2", "vite-tsconfig-paths": "4.3.2", "vitest": "^1.6.0", - "xterm-readline": "1.1.1", - "@types/nodemailer": "^6.4.15" + "xterm-readline": "1.1.1" }, "ct3aMetadata": { "initVersion": "7.25.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5900e3d..174dfba9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -92,6 +92,9 @@ dependencies: '@radix-ui/react-tooltip': specifier: ^1.0.7 version: 1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) + '@react-email/components': + specifier: ^0.0.21 + version: 0.0.21(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0) '@tanstack/react-query': specifier: ^4.36.1 version: 4.36.1(react-dom@18.2.0)(react@18.2.0) @@ -2745,6 +2748,10 @@ packages: aggregate-error: 5.0.0 dev: false + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + dev: false + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3922,6 +3929,226 @@ packages: '@babel/runtime': 7.24.0 dev: false + /@react-email/body@0.0.8(react@18.2.0): + resolution: {integrity: sha512-gqdkNYlIaIw0OdpWu8KjIcQSIFvx7t2bZpXVxMMvBS859Ia1+1X3b5RNbjI3S1ZqLddUf7owOHkO4MiXGE+nxg==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/button@0.0.15(react@18.2.0): + resolution: {integrity: sha512-9Zi6SO3E8PoHYDfcJTecImiHLyitYWmIRs0HE3Ogra60ZzlWP2EXu+AZqwQnhXuq+9pbgwBWNWxB5YPetNPTNA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/code-block@0.0.5(react@18.2.0): + resolution: {integrity: sha512-mmInpZsSIkNaYC1y40/S0XXrIqbTzrpllP6J1JMJuDOBG8l5T7pNl4V+gwfsSTvy9hVsuzQFmhHK8kVb1UXv3A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + prismjs: 1.29.0 + react: 18.2.0 + dev: false + + /@react-email/code-inline@0.0.2(react@18.2.0): + resolution: {integrity: sha512-0cmgbbibFeOJl0q04K9jJlPDuJ+SEiX/OG6m3Ko7UOkG3TqjRD8Dtvkij6jNDVfUh/zESpqJCP2CxrCLLMUjdA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/column@0.0.10(react@18.2.0): + resolution: {integrity: sha512-MnP8Mnwipr0X3XtdD6jMLckb0sI5/IlS6Kl/2F6/rsSWBJy5Gg6nizlekTdkwDmy0kNSe3/1nGU0Zqo98pl63Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/components@0.0.21(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-fwGfH7FF+iuq+IdPcbEO5HoF0Pakk9big+fFW9+3kiyvbSNuo8Io1rhPTMLd8q41XomN4g7mgWovdAeS/8PHrA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + '@react-email/body': 0.0.8(react@18.2.0) + '@react-email/button': 0.0.15(react@18.2.0) + '@react-email/code-block': 0.0.5(react@18.2.0) + '@react-email/code-inline': 0.0.2(react@18.2.0) + '@react-email/column': 0.0.10(react@18.2.0) + '@react-email/container': 0.0.12(react@18.2.0) + '@react-email/font': 0.0.6(react@18.2.0) + '@react-email/head': 0.0.9(react@18.2.0) + '@react-email/heading': 0.0.12(@types/react@18.2.66)(react@18.2.0) + '@react-email/hr': 0.0.8(react@18.2.0) + '@react-email/html': 0.0.8(react@18.2.0) + '@react-email/img': 0.0.8(react@18.2.0) + '@react-email/link': 0.0.8(react@18.2.0) + '@react-email/markdown': 0.0.10(react@18.2.0) + '@react-email/preview': 0.0.9(react@18.2.0) + '@react-email/render': 0.0.16(react-dom@18.2.0)(react@18.2.0) + '@react-email/row': 0.0.8(react@18.2.0) + '@react-email/section': 0.0.12(react@18.2.0) + '@react-email/tailwind': 0.0.18(react@18.2.0) + '@react-email/text': 0.0.8(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + - react-dom + dev: false + + /@react-email/container@0.0.12(react@18.2.0): + resolution: {integrity: sha512-HFu8Pu5COPFfeZxSL+wKv/TV5uO/sp4zQ0XkRCdnGkj/xoq0lqOHVDL4yC2Pu6fxXF/9C3PHDA++5uEYV5WVJw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/font@0.0.6(react@18.2.0): + resolution: {integrity: sha512-sZZFvEZ4U3vNCAZ8wXqIO3DuGJR2qE/8m2fEH+tdqwa532zGO3zW+UlCTg0b9455wkJSzEBeaWik0IkNvjXzxw==} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/head@0.0.9(react@18.2.0): + resolution: {integrity: sha512-dF3Uv1qy3oh+IU2atXdv5Xk0hk2udOlMb1A/MNGngC0eHyoEV9ThA0XvhN7mm5x9dDLkVamoWUKXDtmkiuSRqQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/heading@0.0.12(@types/react@18.2.66)(react@18.2.0): + resolution: {integrity: sha512-eB7mpnAvDmwvQLoPuwEiPRH4fPXWe6ltz6Ptbry2BlI88F0a2k11Ghb4+sZHBqg7vVw/MKbqEgtLqr3QJ/KfCQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.66)(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@react-email/hr@0.0.8(react@18.2.0): + resolution: {integrity: sha512-JLVvpCg2wYKEB+n/PGCggWG9fRU5e4lxsGdpK5SDLsCL0ic3OLKSpHMfeE+ZSuw0GixAVVQN7F64PVJHQkd4MQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/html@0.0.8(react@18.2.0): + resolution: {integrity: sha512-arII3wBNLpeJtwyIJXPaILm5BPKhA+nvdC1F9QkuKcOBJv2zXctn8XzPqyGqDfdplV692ulNJP7XY55YqbKp6w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/img@0.0.8(react@18.2.0): + resolution: {integrity: sha512-jx/rPuKo31tV18fu7P5rRqelaH5wkhg83Dq7uLwJpfqhbi4KFBGeBfD0Y3PiLPPoh+WvYf+Adv9W2ghNW8nOMQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/link@0.0.8(react@18.2.0): + resolution: {integrity: sha512-nVikuTi8WJHa6Baad4VuRUbUCa/7EtZ1Qy73TRejaCHn+vhetc39XGqHzKLNh+Z/JFL8Hv9g+4AgG16o2R0ogQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/markdown@0.0.10(react@18.2.0): + resolution: {integrity: sha512-MH0xO+NJ4IuJcx9nyxbgGKAMXyudFjCZ0A2GQvuWajemW9qy2hgnJ3mW3/z5lwcenG+JPn7JyO/iZpizQ7u1tA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + md-to-react-email: 5.0.2(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-email/preview@0.0.9(react@18.2.0): + resolution: {integrity: sha512-2fyAA/zzZYfYmxfyn3p2YOIU30klyA6Dq4ytyWq4nfzQWWglt5hNDE0cMhObvRtfjM9ghMSVtoELAb0MWiF/kw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/render@0.0.16(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wDaMy27xAq1cJHtSFptp0DTKPuV2GYhloqia95ub/DH9Dea1aWYsbdM918MOc/b/HvVS3w1z8DWzfAk13bGStQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + react-dom: ^18.2.0 + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-promise-suspense: 0.3.4 + dev: false + + /@react-email/row@0.0.8(react@18.2.0): + resolution: {integrity: sha512-JsB6pxs/ZyjYpEML3nbwJRGAerjcN/Pa/QG48XUwnT/MioDWrUuyQuefw+CwCrSUZ2P1IDrv2tUD3/E3xzcoKw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/section@0.0.12(react@18.2.0): + resolution: {integrity: sha512-UCD/N/BeOTN4h3VZBUaFdiSem6HnpuxD1Q51TdBFnqeNqS5hBomp8LWJJ9s4gzwHWk1XPdNfLA3I/fJwulJshg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/tailwind@0.0.18(react@18.2.0): + resolution: {integrity: sha512-ob8CXX/Pqq1U8YfL5OJTL48WJkixizyoXMMRYTiDLDN9LVLU7lSLtcK9kOD9CgFbO2yUPQr7/5+7gnQJ+cXa8Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + + /@react-email/text@0.0.8(react@18.2.0): + resolution: {integrity: sha512-uvN2TNWMrfC9wv/LLmMLbbEN1GrMWZb9dBK14eYxHHAEHCeyvGb5ePZZ2MPyzO7Y5yTC+vFEnCEr76V+hWMxCQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + react: 18.2.0 + dev: false + /@rollup/rollup-android-arm-eabi@4.18.0: resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] @@ -4050,6 +4277,13 @@ packages: dev: true optional: true + /@selderee/plugin-htmlparser2@0.11.0: + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + dev: false + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true @@ -5559,6 +5793,11 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -5934,6 +6173,18 @@ packages: electron-to-chromium: 1.4.708 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001642 + electron-to-chromium: 1.4.827 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + dev: false /btoa-lite@1.0.0: resolution: {integrity: sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==} @@ -6045,6 +6296,10 @@ packages: /caniuse-lite@1.0.30001598: resolution: {integrity: sha512-j8mQRDziG94uoBfeFuqsJUNECW37DXpnvhcMJMdlH2u3MRkq1sAI0LJcXP1i/Py0KbSIC4UDj8YHPrTn5YsL+Q==} + /caniuse-lite@1.0.30001642: + resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} + dev: false + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -6252,6 +6507,11 @@ packages: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} dev: false + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false @@ -6273,6 +6533,13 @@ packages: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} dev: true + /config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -6658,10 +6925,37 @@ packages: csstype: 3.1.3 dev: false + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + /dompurify@3.1.4: resolution: {integrity: sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==} dev: false + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -6800,8 +7094,24 @@ packages: safe-buffer: 5.2.1 dev: false + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.0 + dev: false + /electron-to-chromium@1.4.708: resolution: {integrity: sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==} + dev: true + + /electron-to-chromium@1.4.827: + resolution: {integrity: sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==} + dev: false /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -6827,6 +7137,11 @@ packages: tapable: 2.2.1 dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7085,6 +7400,10 @@ packages: type: 2.7.2 dev: true + /fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: false @@ -7452,6 +7771,26 @@ packages: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false + /html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + dev: false + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: false + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -7539,7 +7878,6 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} requiresBuild: true dev: false - optional: true /input-otp@1.2.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==} @@ -7681,6 +8019,23 @@ packages: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.3.10 + js-cookie: 3.0.5 + nopt: 7.2.1 + dev: false + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + dev: false + /js-file-download@0.4.12: resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} dev: false @@ -7770,6 +8125,10 @@ packages: json-buffer: 3.0.1 dev: false + /leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + dev: false + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -7944,6 +8303,21 @@ packages: semver: 6.3.1 dev: false + /marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + dev: false + + /md-to-react-email@5.0.2(react@18.2.0): + resolution: {integrity: sha512-x6kkpdzIzUhecda/yahltfEl53mH26QdWu4abUF9+S0Jgam8P//Ciro8cdhyMHnT5MQUJYrIbO6ORM2UxPiNNA==} + peerDependencies: + react: 18.x + dependencies: + marked: 7.0.4 + react: 18.2.0 + dev: false + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -8051,6 +8425,13 @@ packages: brace-expansion: 2.0.1 dev: false + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -8331,6 +8712,14 @@ packages: abbrev: 1.1.1 dev: false + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: false + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -8483,6 +8872,13 @@ packages: is-hexadecimal: 1.0.4 dev: false + /parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + dev: false + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -8529,9 +8925,17 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: false + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -8763,6 +9167,10 @@ packages: xtend: 4.0.2 dev: false + /proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false @@ -8958,6 +9366,12 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true + /react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + dependencies: + fast-deep-equal: 2.0.1 + dev: false + /react-redux@9.1.2(@types/react@18.2.66)(react@18.2.0)(redux@5.0.1): resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} peerDependencies: @@ -9329,6 +9743,12 @@ packages: ajv-keywords: 5.1.0(ajv@8.14.0) dev: false + /selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + dependencies: + parseley: 0.12.1 + dev: false + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -10094,6 +10514,18 @@ packages: browserslist: 4.23.0 escalade: 3.1.2 picocolors: 1.0.0 + dev: true + + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: false /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -10368,7 +10800,7 @@ packages: '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 + browserslist: 4.23.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.16.1 es-module-lexer: 1.5.3 diff --git a/server/api/routers/notification.ts b/server/api/routers/notification.ts index 1781188e..e7a252fb 100644 --- a/server/api/routers/notification.ts +++ b/server/api/routers/notification.ts @@ -10,11 +10,17 @@ import { apiCreateSlack, apiCreateTelegram, apiFindOneNotification, - apiSendTest, - apiUpdateDestination, + apiTestDiscordConnection, + apiTestEmailConnection, + apiTestSlackConnection, + apiTestTelegramConnection, + apiUpdateDiscord, + apiUpdateEmail, + apiUpdateSlack, + apiUpdateTelegram, + notifications, } from "@/server/db/schema"; import { TRPCError } from "@trpc/server"; -import { updateDestinationById } from "../services/destination"; import { createDiscordNotification, createEmailNotification, @@ -22,8 +28,16 @@ import { createTelegramNotification, findNotificationById, removeNotificationById, + sendDiscordTestNotification, + sendEmailTestNotification, + sendSlackTestNotification, + sendTelegramTestNotification, + updateDiscordNotification, + updateEmailNotification, + updateSlackNotification, + updateTelegramNotification, } from "../services/notification"; -import nodemailer from "nodemailer"; +import { desc } from "drizzle-orm"; export const notificationRouter = createTRPCRouter({ createSlack: adminProcedure @@ -35,7 +49,34 @@ export const notificationRouter = createTRPCRouter({ console.log(error); throw new TRPCError({ code: "BAD_REQUEST", - message: "Error to create the destination", + message: "Error to create the notification", + cause: error, + }); + } + }), + updateSlack: adminProcedure + .input(apiUpdateSlack) + .mutation(async ({ input }) => { + try { + return await updateSlackNotification(input); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to update the notification", + cause: error, + }); + } + }), + testSlackConnection: adminProcedure + .input(apiTestSlackConnection) + .mutation(async ({ input }) => { + try { + await sendSlackTestNotification(input); + return true; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to test the notification", cause: error, }); } @@ -48,7 +89,35 @@ export const notificationRouter = createTRPCRouter({ } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", - message: "Error to create the destination", + message: "Error to create the notification", + cause: error, + }); + } + }), + + updateTelegram: adminProcedure + .input(apiUpdateTelegram) + .mutation(async ({ input }) => { + try { + return await updateTelegramNotification(input); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to update the notification", + cause: error, + }); + } + }), + testTelegramConnection: adminProcedure + .input(apiTestTelegramConnection) + .mutation(async ({ input }) => { + try { + await sendTelegramTestNotification(input); + return true; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to test the notification", cause: error, }); } @@ -61,7 +130,36 @@ export const notificationRouter = createTRPCRouter({ } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", - message: "Error to create the destination", + message: "Error to create the notification", + cause: error, + }); + } + }), + + updateDiscord: adminProcedure + .input(apiUpdateDiscord) + .mutation(async ({ input }) => { + try { + return await updateDiscordNotification(input); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to update the notification", + cause: error, + }); + } + }), + + testDiscordConnection: adminProcedure + .input(apiTestDiscordConnection) + .mutation(async ({ input }) => { + try { + await sendDiscordTestNotification(input); + return true; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to test the notification", cause: error, }); } @@ -72,9 +170,37 @@ export const notificationRouter = createTRPCRouter({ try { return await createEmailNotification(input); } catch (error) { + console.log(error); throw new TRPCError({ code: "BAD_REQUEST", - message: "Error to create the destination", + message: "Error to create the notification", + cause: error, + }); + } + }), + updateEmail: adminProcedure + .input(apiUpdateEmail) + .mutation(async ({ input }) => { + try { + return await updateEmailNotification(input); + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to update the notification", + cause: error, + }); + } + }), + testEmailConnection: adminProcedure + .input(apiTestEmailConnection) + .mutation(async ({ input }) => { + try { + await sendEmailTestNotification(input); + return true; + } catch (error) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error to test the notification", cause: error, }); } @@ -97,127 +223,6 @@ export const notificationRouter = createTRPCRouter({ const notification = await findNotificationById(input.notificationId); return notification; }), - testConnection: adminProcedure - .input(apiSendTest) - .mutation(async ({ input }) => { - const notificationType = input.notificationType; - console.log(input); - - if (notificationType === "slack") { - // go to your slack dashboard - // go to integrations - // add a new integration - // select incoming webhook - // copy the webhook url - console.log("test slack"); - const { webhookUrl, channel } = input; - try { - const response = await fetch(webhookUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ text: "Test notification", channel }), - }); - } catch (err) { - console.log(err); - } - } else if (notificationType === "telegram") { - // start telegram - // search BotFather - // send /newbot - // name - // name-with-bot-at-the-end - // copy the token - // search @userinfobot - // send /start - // copy the Id - const { botToken, chatId } = input; - try { - const url = `https://api.telegram.org/bot${botToken}/sendMessage`; - const response = await fetch(url, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - chat_id: chatId, - text: "Test notification", - }), - }); - - if (!response.ok) { - throw new Error( - `Error sending Telegram notification: ${response.statusText}`, - ); - } - - console.log("Telegram notification sent successfully"); - } catch (error) { - console.error("Error sending Telegram notification:", error); - throw new Error("Error sending Telegram notification"); - } - } else if (notificationType === "discord") { - const { webhookUrl } = input; - try { - // go to your discord server - // go to settings - // go to integrations - // add a new integration - // select webhook - // copy the webhook url - const response = await fetch(webhookUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - content: "Test notification", - }), - }); - - if (!response.ok) { - throw new Error( - `Error sending Discord notification: ${response.statusText}`, - ); - } - - console.log("Discord notification sent successfully"); - } catch (error) { - console.error("Error sending Discord notification:", error); - throw new Error("Error sending Discord notification"); - } - } else if (notificationType === "email") { - const { smtpServer, smtpPort, username, password, toAddresses } = input; - try { - const transporter = nodemailer.createTransport({ - host: smtpServer, - port: smtpPort, - secure: smtpPort === "465", - auth: { - user: username, - pass: password, - }, - }); - // need to add a valid from address - const fromAddress = "no-reply@emails.dokploy.com"; - const mailOptions = { - from: fromAddress, - to: toAddresses?.join(", "), - subject: "Test email", - text: "Test email", - }; - - await transporter.sendMail(mailOptions); - - console.log("Email notification sent successfully"); - } catch (error) { - console.error("Error sending Email notification:", error); - throw new Error("Error sending Email notification"); - } - } - }), - all: adminProcedure.query(async () => { return await db.query.notifications.findMany({ with: { @@ -226,19 +231,7 @@ export const notificationRouter = createTRPCRouter({ discord: true, email: true, }, + orderBy: desc(notifications.createdAt), }); }), - update: adminProcedure - .input(apiUpdateDestination) - .mutation(async ({ input }) => { - try { - return await updateDestinationById(input.destinationId, input); - } catch (error) { - throw new TRPCError({ - code: "BAD_REQUEST", - message: "Error to update this destination", - cause: error, - }); - } - }), }); diff --git a/server/api/services/application.ts b/server/api/services/application.ts index b093f63f..c757f80b 100644 --- a/server/api/services/application.ts +++ b/server/api/services/application.ts @@ -18,6 +18,7 @@ import { getAdvancedStats } from "@/server/monitoring/utilts"; import { validUniqueServerAppName } from "./project"; import { generatePassword } from "@/templates/utils"; import { generateAppName } from "@/server/db/schema/utils"; +import { sendBuildFailedEmail } from "./notification"; export type Application = typeof applications.$inferSelect; export const createApplication = async ( @@ -157,8 +158,17 @@ export const deployApplication = async ({ await updateDeploymentStatus(deployment.deploymentId, "done"); await updateApplicationStatus(applicationId, "done"); } catch (error) { + console.log("Error on build", error); await updateDeploymentStatus(deployment.deploymentId, "error"); await updateApplicationStatus(applicationId, "error"); + await sendBuildFailedEmail({ + projectName: application.project.name, + applicationName: application.appName, + applicationType: "application", + errorMessage: error?.message || "Error to build", + buildLink: deployment.logPath, + }); + console.log( "Error on ", application.buildType, diff --git a/server/api/services/notification.ts b/server/api/services/notification.ts index 04c56b9e..ca926adf 100644 --- a/server/api/services/notification.ts +++ b/server/api/services/notification.ts @@ -4,14 +4,26 @@ import { type apiCreateEmail, type apiCreateSlack, type apiCreateTelegram, + type apiTestDiscordConnection, + type apiTestEmailConnection, + type apiTestSlackConnection, + type apiTestTelegramConnection, + type apiUpdateDiscord, + type apiUpdateEmail, + type apiUpdateSlack, + type apiUpdateTelegram, discord, email, notifications, slack, telegram, } from "@/server/db/schema"; +import { render } from "@react-email/components"; import { TRPCError } from "@trpc/server"; -import { eq } from "drizzle-orm"; +import nodemailer from "nodemailer"; +import { and, eq, isNotNull } from "drizzle-orm"; +import type SMTPTransport from "nodemailer/lib/smtp-transport"; +import { BuildFailedEmail } from "@/emails/emails/build-failed"; export type Notification = typeof notifications.$inferSelect; @@ -61,6 +73,45 @@ export const createSlackNotification = async ( }); }; +export const updateSlackNotification = async ( + input: typeof apiUpdateSlack._type, +) => { + await db.transaction(async (tx) => { + const newDestination = await tx + .update(notifications) + .set({ + name: input.name, + appDeploy: input.appDeploy, + userJoin: input.userJoin, + appBuildError: input.appBuildError, + databaseBackup: input.databaseBackup, + dokployRestart: input.dokployRestart, + }) + .where(eq(notifications.notificationId, input.notificationId)) + .returning() + .then((value) => value[0]); + + if (!newDestination) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error Updating notification", + }); + } + + await tx + .update(slack) + .set({ + channel: input.channel, + webhookUrl: input.webhookUrl, + }) + .where(eq(slack.slackId, input.slackId)) + .returning() + .then((value) => value[0]); + + return newDestination; + }); +}; + export const createTelegramNotification = async ( input: typeof apiCreateTelegram._type, ) => { @@ -107,6 +158,45 @@ export const createTelegramNotification = async ( }); }; +export const updateTelegramNotification = async ( + input: typeof apiUpdateTelegram._type, +) => { + await db.transaction(async (tx) => { + const newDestination = await tx + .update(notifications) + .set({ + name: input.name, + appDeploy: input.appDeploy, + userJoin: input.userJoin, + appBuildError: input.appBuildError, + databaseBackup: input.databaseBackup, + dokployRestart: input.dokployRestart, + }) + .where(eq(notifications.notificationId, input.notificationId)) + .returning() + .then((value) => value[0]); + + if (!newDestination) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error Updating notification", + }); + } + + await tx + .update(telegram) + .set({ + botToken: input.botToken, + chatId: input.chatId, + }) + .where(eq(telegram.telegramId, input.telegramId)) + .returning() + .then((value) => value[0]); + + return newDestination; + }); +}; + export const createDiscordNotification = async ( input: typeof apiCreateDiscord._type, ) => { @@ -152,6 +242,44 @@ export const createDiscordNotification = async ( }); }; +export const updateDiscordNotification = async ( + input: typeof apiUpdateDiscord._type, +) => { + await db.transaction(async (tx) => { + const newDestination = await tx + .update(notifications) + .set({ + name: input.name, + appDeploy: input.appDeploy, + userJoin: input.userJoin, + appBuildError: input.appBuildError, + databaseBackup: input.databaseBackup, + dokployRestart: input.dokployRestart, + }) + .where(eq(notifications.notificationId, input.notificationId)) + .returning() + .then((value) => value[0]); + + if (!newDestination) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error Updating notification", + }); + } + + await tx + .update(discord) + .set({ + webhookUrl: input.webhookUrl, + }) + .where(eq(discord.discordId, input.discordId)) + .returning() + .then((value) => value[0]); + + return newDestination; + }); +}; + export const createEmailNotification = async ( input: typeof apiCreateEmail._type, ) => { @@ -163,6 +291,7 @@ export const createEmailNotification = async ( smtpPort: input.smtpPort, username: input.username, password: input.password, + fromAddress: input.fromAddress, toAddresses: input.toAddresses, }) .returning() @@ -201,6 +330,49 @@ export const createEmailNotification = async ( }); }; +export const updateEmailNotification = async ( + input: typeof apiUpdateEmail._type, +) => { + await db.transaction(async (tx) => { + const newDestination = await tx + .update(notifications) + .set({ + name: input.name, + appDeploy: input.appDeploy, + userJoin: input.userJoin, + appBuildError: input.appBuildError, + databaseBackup: input.databaseBackup, + dokployRestart: input.dokployRestart, + }) + .where(eq(notifications.notificationId, input.notificationId)) + .returning() + .then((value) => value[0]); + + if (!newDestination) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error Updating notification", + }); + } + + await tx + .update(email) + .set({ + smtpServer: input.smtpServer, + smtpPort: input.smtpPort, + username: input.username, + password: input.password, + fromAddress: input.fromAddress, + toAddresses: input.toAddresses, + }) + .where(eq(email.emailId, input.emailId)) + .returning() + .then((value) => value[0]); + + return newDestination; + }); +}; + export const findNotificationById = async (notificationId: string) => { const notification = await db.query.notifications.findFirst({ where: eq(notifications.notificationId, notificationId), @@ -244,21 +416,187 @@ export const updateDestinationById = async ( return result[0]; }; -export const sendNotification = async ( - notificationData: Partial, +export const sendSlackTestNotification = async ( + slackTestConnection: typeof apiTestSlackConnection._type, ) => { - // if(notificationData.notificationType === "slack"){ - // const { webhookUrl, channel } = notificationData; - // try { - // const response = await fetch(webhookUrl, { - // method: "POST", - // headers: { - // "Content-Type": "application/json", - // }, - // body: JSON.stringify({ text: "Test notification", channel }), - // }); - // } catch (err) { - // console.log(err); - // } - // } + const { webhookUrl, channel } = slackTestConnection; + + const response = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ text: "Hi, From Dokploy 👋", channel }), + }); + + if (!response.ok) { + throw new Error("Error to send test notification"); + } +}; + +export const sendTelegramTestNotification = async ( + telegramTestConnection: typeof apiTestTelegramConnection._type, +) => { + const { botToken, chatId } = telegramTestConnection; + const url = `https://api.telegram.org/bot${botToken}/sendMessage`; + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + chat_id: chatId, + text: "Hi, From Dokploy 👋", + }), + }); + + if (!response.ok) { + throw new Error("Error to send test notification"); + } +}; + +export const sendDiscordTestNotification = async ( + discordTestConnection: typeof apiTestDiscordConnection._type, +) => { + const { webhookUrl } = discordTestConnection; + // go to your discord server + // go to settings + // go to integrations + // add a new integration + // select webhook + // copy the webhook url + const response = await fetch(webhookUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + content: "Hi, From Dokploy 👋", + }), + }); + + if (!response.ok) { + throw new Error("Error to send test notification"); + } +}; + +export const sendEmailTestNotification = async ( + emailTestConnection: typeof apiTestEmailConnection._type, +) => { + const { smtpServer, smtpPort, username, password, toAddresses, fromAddress } = + emailTestConnection; + const transporter = nodemailer.createTransport({ + host: smtpServer, + port: smtpPort, + secure: smtpPort === 465, + auth: { + user: username, + pass: password, + }, + } as SMTPTransport.Options); + // need to add a valid from address + const mailOptions = { + from: fromAddress, + to: toAddresses?.join(", "), + subject: "Test email", + text: "Hi, From Dokploy 👋", + }; + + await transporter.sendMail(mailOptions); + + console.log("Email notification sent successfully"); +}; + +// export const sendInvitationEmail = async ( +// emailTestConnection: typeof apiTestEmailConnection._type, +// inviteLink: string, +// toEmail: string, +// ) => { +// const { smtpServer, smtpPort, username, password, fromAddress } = +// emailTestConnection; +// const transporter = nodemailer.createTransport({ +// host: smtpServer, +// port: smtpPort, +// secure: smtpPort === 465, +// auth: { +// user: username, +// pass: password, +// }, +// } as SMTPTransport.Options); +// // need to add a valid from address +// const mailOptions = { +// from: fromAddress, +// to: toEmail, +// subject: "Invitation to join Dokploy", +// html: InvitationTemplate({ +// inviteLink: inviteLink, +// toEmail: toEmail, +// }), +// }; + +// await transporter.sendMail(mailOptions); + +// console.log("Email notification sent successfully"); +// }; + +export const sendBuildFailedEmail = async ({ + projectName, + applicationName, + applicationType, + errorMessage, + buildLink, +}: { + projectName: string; + applicationName: string; + applicationType: string; + errorMessage: string; + buildLink: string; +}) => { + const notificationList = await db.query.notifications.findMany({ + where: and( + isNotNull(notifications.emailId), + eq(notifications.appBuildError, true), + ), + with: { + email: true, + }, + }); + + for (const notification of notificationList) { + const { email } = notification; + if (email) { + const { + smtpServer, + smtpPort, + username, + password, + fromAddress, + toAddresses, + } = email; + const transporter = nodemailer.createTransport({ + host: smtpServer, + port: smtpPort, + secure: smtpPort === 465, + auth: { + user: username, + pass: password, + }, + } as SMTPTransport.Options); + const mailOptions = { + from: fromAddress, + to: toAddresses?.join(", "), + subject: "Build failed for dokploy", + html: render( + BuildFailedEmail({ + projectName, + applicationName, + applicationType, + errorMessage, + buildLink, + }), + ), + }; + await transporter.sendMail(mailOptions); + } + } }; diff --git a/server/db/schema/notification.ts b/server/db/schema/notification.ts index ea77183b..a66cf095 100644 --- a/server/db/schema/notification.ts +++ b/server/db/schema/notification.ts @@ -1,5 +1,5 @@ import { nanoid } from "nanoid"; -import { boolean, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; +import { boolean, integer, pgEnum, pgTable, text } from "drizzle-orm/pg-core"; import { relations } from "drizzle-orm"; import { z } from "zod"; import { createInsertSchema } from "drizzle-zod"; @@ -46,7 +46,7 @@ export const slack = pgTable("slack", { .primaryKey() .$defaultFn(() => nanoid()), webhookUrl: text("webhookUrl").notNull(), - channel: text("channel").notNull(), + channel: text("channel"), }); export const telegram = pgTable("telegram", { @@ -72,7 +72,7 @@ export const email = pgTable("email", { .primaryKey() .$defaultFn(() => nanoid()), smtpServer: text("smtpServer").notNull(), - smtpPort: text("smtpPort").notNull(), + smtpPort: integer("smtpPort").notNull(), username: text("username").notNull(), password: text("password").notNull(), fromAddress: text("fromAddress").notNull(), @@ -111,10 +111,20 @@ export const apiCreateSlack = notificationsSchema }) .extend({ webhookUrl: z.string().min(1), - channel: z.string().min(1), + channel: z.string(), }) .required(); +export const apiUpdateSlack = apiCreateSlack.partial().extend({ + notificationId: z.string().min(1), + slackId: z.string(), +}); + +export const apiTestSlackConnection = apiCreateSlack.pick({ + webhookUrl: true, + channel: true, +}); + export const apiCreateTelegram = notificationsSchema .pick({ appBuildError: true, @@ -130,6 +140,16 @@ export const apiCreateTelegram = notificationsSchema }) .required(); +export const apiUpdateTelegram = apiCreateTelegram.partial().extend({ + notificationId: z.string().min(1), + telegramId: z.string().min(1), +}); + +export const apiTestTelegramConnection = apiCreateTelegram.pick({ + botToken: true, + chatId: true, +}); + export const apiCreateDiscord = notificationsSchema .pick({ appBuildError: true, @@ -144,6 +164,15 @@ export const apiCreateDiscord = notificationsSchema }) .required(); +export const apiUpdateDiscord = apiCreateDiscord.partial().extend({ + notificationId: z.string().min(1), + discordId: z.string().min(1), +}); + +export const apiTestDiscordConnection = apiCreateDiscord.pick({ + webhookUrl: true, +}); + export const apiCreateEmail = notificationsSchema .pick({ appBuildError: true, @@ -155,7 +184,7 @@ export const apiCreateEmail = notificationsSchema }) .extend({ smtpServer: z.string().min(1), - smtpPort: z.string().min(1), + smtpPort: z.number().min(1), username: z.string().min(1), password: z.string().min(1), fromAddress: z.string().min(1), @@ -163,6 +192,20 @@ export const apiCreateEmail = notificationsSchema }) .required(); +export const apiUpdateEmail = apiCreateEmail.partial().extend({ + notificationId: z.string().min(1), + emailId: z.string().min(1), +}); + +export const apiTestEmailConnection = apiCreateEmail.pick({ + smtpServer: true, + smtpPort: true, + username: true, + password: true, + toAddresses: true, + fromAddress: true, +}); + export const apiFindOneNotification = notificationsSchema .pick({ notificationId: true, @@ -176,7 +219,7 @@ export const apiSendTest = notificationsSchema webhookUrl: z.string(), channel: z.string(), smtpServer: z.string(), - smtpPort: z.string(), + smtpPort: z.number(), fromAddress: z.string(), username: z.string(), password: z.string(),