From 4d197898dba84c58e1f8f1341df60521db645067 Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 16:13:21 +0200 Subject: [PATCH 1/8] feat(email): add email service app with react email templates --- apps/email/Dockerfile | 31 ++++ apps/email/package.json | 31 ++++ apps/email/src/email.ts | 18 ++ apps/email/src/emails/access-denied.tsx | 64 +++++++ apps/email/src/emails/access-granted.tsx | 45 +++++ .../emails/access-request-notification.tsx | 62 +++++++ .../emails/deregistration-notification.tsx | 58 +++++++ apps/email/src/emails/email-verification.tsx | 75 +++++++++ .../src/emails/got-spot-notification.tsx | 52 ++++++ apps/email/src/emails/magic-link.tsx | 87 ++++++++++ .../src/emails/registration-confirmation.tsx | 52 ++++++ apps/email/src/emails/strike-notification.tsx | 73 ++++++++ apps/email/src/index.ts | 10 ++ apps/email/src/routes.ts | 158 ++++++++++++++++++ apps/email/tsconfig.json | 15 ++ 15 files changed, 831 insertions(+) create mode 100644 apps/email/Dockerfile create mode 100644 apps/email/package.json create mode 100644 apps/email/src/email.ts create mode 100644 apps/email/src/emails/access-denied.tsx create mode 100644 apps/email/src/emails/access-granted.tsx create mode 100644 apps/email/src/emails/access-request-notification.tsx create mode 100644 apps/email/src/emails/deregistration-notification.tsx create mode 100644 apps/email/src/emails/email-verification.tsx create mode 100644 apps/email/src/emails/got-spot-notification.tsx create mode 100644 apps/email/src/emails/magic-link.tsx create mode 100644 apps/email/src/emails/registration-confirmation.tsx create mode 100644 apps/email/src/emails/strike-notification.tsx create mode 100644 apps/email/src/index.ts create mode 100644 apps/email/src/routes.ts create mode 100644 apps/email/tsconfig.json diff --git a/apps/email/Dockerfile b/apps/email/Dockerfile new file mode 100644 index 0000000000..03f42d134f --- /dev/null +++ b/apps/email/Dockerfile @@ -0,0 +1,31 @@ +FROM node:20-alpine AS base + +FROM base AS builder + +RUN apk add --no-cache libc6-compat + +WORKDIR /app + +COPY apps/email/package.json ./ +RUN npm install + +COPY apps/email/ ./ + +RUN npm run build + +FROM node:20-alpine AS runner + +WORKDIR /app + +RUN addgroup -S -g 1001 nodejs && adduser -S -u 1001 -G nodejs nodeuser +USER nodeuser + +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/node_modules ./node_modules + +ENV NODE_ENV=production +ENV PORT=3001 + +EXPOSE 3001 + +CMD ["node", "dist/index.js"] diff --git a/apps/email/package.json b/apps/email/package.json new file mode 100644 index 0000000000..e6533a989e --- /dev/null +++ b/apps/email/package.json @@ -0,0 +1,31 @@ +{ + "name": "@echo-webkom/email-service", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "dotenv -e ../../.env -- tsx watch src/index.ts", + "build": "tsdown src/index.ts --format cjs --out-dir dist", + "start": "node dist/index.js", + "check": "oxlint . && oxfmt --check . && tsc --noEmit", + "check:fix": "oxlint . --fix && oxfmt . && tsc --noEmit", + "clean": "rm -rf dist .turbo node_modules" + }, + "dependencies": { + "@hono/node-server": "^1.13.7", + "@react-email/components": "1.0.6", + "@react-email/render": "2.0.4", + "hono": "^4.7.10", + "react": "19.2.4", + "react-dom": "19.2.4", + "resend": "6.9.1" + }, + "devDependencies": { + "@types/node": "22.19.7", + "@types/react": "19.2.10", + "@types/react-dom": "19.2.3", + "dotenv-cli": "11.0.0", + "tsdown": "^0.21.7", + "tsx": "^4.19.4", + "typescript": "5.9.3" + } +} diff --git a/apps/email/src/email.ts b/apps/email/src/email.ts new file mode 100644 index 0000000000..7493b57be1 --- /dev/null +++ b/apps/email/src/email.ts @@ -0,0 +1,18 @@ +/* eslint-disable no-console */ +import { Resend } from "resend"; + +const FROM_EMAIL = "echo "; +const IS_PROD = process.env.ENVIRONMENT?.startsWith("p") && !!process.env.RESEND_API_KEY; + +export async function sendEmail(to: Array, subject: string, html: string): Promise { + if (!IS_PROD) { + console.log("\n========== EMAIL SENT (DEV MODE) =========="); + console.log("TO:", to.join(", ")); + console.log("SUBJECT:", subject); + console.log("==========================================\n"); + return; + } + + const resend = new Resend(process.env.RESEND_API_KEY); + await resend.emails.send({ from: FROM_EMAIL, to, subject, html }); +} diff --git a/apps/email/src/emails/access-denied.tsx b/apps/email/src/emails/access-denied.tsx new file mode 100644 index 0000000000..5524149cdc --- /dev/null +++ b/apps/email/src/emails/access-denied.tsx @@ -0,0 +1,64 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, +} from "@react-email/components"; +import * as React from "react"; + +type AccessDeniedProps = { + reason?: string; +}; + +export default function AccessDenied({ reason }: AccessDeniedProps) { + return ( + + + Din forespørsel om tilgang til echo.uib.no har blitt avslått + + + +
+ echo + Tilgang ikke godkjent + +
+ Din forespørsel om tilgang til{" "} + + echo.uib.no + {" "} + har dessverre blitt avslått. +
+ + {reason && ( +
+
Begrunnelse:
+
{reason}
+
+ )} + +
+ Hvis du mener dette er en feil, kan du kontakte oss på{" "} + + webkom@echo.uib.no + + . +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/access-granted.tsx b/apps/email/src/emails/access-granted.tsx new file mode 100644 index 0000000000..1f2ebf18ea --- /dev/null +++ b/apps/email/src/emails/access-granted.tsx @@ -0,0 +1,45 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, +} from "@react-email/components"; +import * as React from "react"; + +export default function AccessGranted() { + return ( + + + Du har fått tilgang til echo.uib.no + + + +
+ echo + Du har fått tilgang! + +
+ Velkommen! Prøv å logge inn på{" "} + + echo.uib.no + + . +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/access-request-notification.tsx b/apps/email/src/emails/access-request-notification.tsx new file mode 100644 index 0000000000..e213702261 --- /dev/null +++ b/apps/email/src/emails/access-request-notification.tsx @@ -0,0 +1,62 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type DeregistrationNotificationEmailProps = { + email?: string; + reason?: string; +}; + +export default function AcccessRequestNotificationEmail({ + email = "bo.salhus@echo.uib.no", + reason = "Jeg har blitt syk", +}: DeregistrationNotificationEmailProps) { + return ( + + + {email} ønsker tilgang til echo.uib.no + + + +
+ echo + + {email} ønsker tilgang til echo.uib.no + + +
+ + {email} ønsker tilgang til echo.uib.no med følgende grunn: + + + {reason} +
+ +
+ + Du kan godkjenne eller avvise forespørselen på whitelist-dashbordet. + +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/deregistration-notification.tsx b/apps/email/src/emails/deregistration-notification.tsx new file mode 100644 index 0000000000..12fac597b1 --- /dev/null +++ b/apps/email/src/emails/deregistration-notification.tsx @@ -0,0 +1,58 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type DeregistrationNotificationEmailProps = { + name?: string; + reason?: string; + happeningTitle?: string; +}; + +export default function DeregistrationNotificationEmail({ + name = "Bo Salhus", + reason = "Jeg har blitt syk", + happeningTitle = "Workshop med Webkom", +}: DeregistrationNotificationEmailProps) { + return ( + + + + {name} har meldt seg av {happeningTitle} + + + + +
+ echo + + {name} har meldt seg av {happeningTitle} + + +
+ {name} har meldt seg av med følgende grunn: + + {reason} +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/email-verification.tsx b/apps/email/src/emails/email-verification.tsx new file mode 100644 index 0000000000..a50b6528aa --- /dev/null +++ b/apps/email/src/emails/email-verification.tsx @@ -0,0 +1,75 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type EmailVerificationProps = { + verificationUrl: string; + firstName?: string; +}; + +export default function EmailVerificationEmail({ + verificationUrl, + firstName = "der", +}: EmailVerificationProps) { + return ( + + + Bekreft e-postadressen din for echo + + + +
+ echo + Velkommen til echo! + + Hei {firstName}!. + + + Vi trenger at du bekrefter den alternative e-postaddressen din for at vi skal kunne + bruke den. + + +
+ +
+ + + Hvis du ikke kan klikke på knappen, kan du kopiere og lime inn denne lenken i + nettleseren din: + + + {verificationUrl} + + + Hvis du ikke vet hva echo er, eller ikke har lagt til denne e-postadressen selv, kan + du trygt ignorere denne e-posten. + +
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/got-spot-notification.tsx b/apps/email/src/emails/got-spot-notification.tsx new file mode 100644 index 0000000000..8ea61875b3 --- /dev/null +++ b/apps/email/src/emails/got-spot-notification.tsx @@ -0,0 +1,52 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type GotSpotNotificationProps = { + name?: string; + happeningTitle?: string; +}; + +export default function GotSpotNotification({ + name = "Bo Salhus", + happeningTitle = "Workshop med Webkom", +}: GotSpotNotificationProps) { + return ( + + + Du har fått plass på {happeningTitle} + + + +
+ echo + Du har fått plass! + +
+ + Gratulerer, {name}! Du har fått plass på {happeningTitle}. + +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/magic-link.tsx b/apps/email/src/emails/magic-link.tsx new file mode 100644 index 0000000000..cc99cbcee6 --- /dev/null +++ b/apps/email/src/emails/magic-link.tsx @@ -0,0 +1,87 @@ +import { + Body, + Button, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type MagicLinkProps = { + magicLinkUrl: string; + code: string; + firstName?: string; +}; + +export default function MagicLinkEmail({ magicLinkUrl, code, firstName = "der" }: MagicLinkProps) { + return ( + + + Din magic link til å logge inn på echo + + + +
+ echo + Logg inn på echo + + Hei {firstName}! + + + Klikk på knappen under for å logge inn på echo, eller bruk koden nedenfor. Denne + lenken er gyldig i 5 minutter. + + +
+ +
+ + Eller bruk denne koden: + +
+ + {code} + +
+ + + Hvis du ikke kan klikke på knappen, kan du kopiere og lime inn denne lenken i + nettleseren din: + + + {magicLinkUrl} + + + Hvis du ikke har bedt om en innloggingslenke, kan du trygt ignorere denne e-posten. + + + + Denne lenken og koden utløper automatisk etter 5 minutter av sikkerhetshensyn. + +
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/registration-confirmation.tsx b/apps/email/src/emails/registration-confirmation.tsx new file mode 100644 index 0000000000..46c4eca8c5 --- /dev/null +++ b/apps/email/src/emails/registration-confirmation.tsx @@ -0,0 +1,52 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type RegistrationConfirmationEmailProps = { + title?: string; + isBedpres?: boolean; +}; + +export default function RegistrationConfirmationEmail({ + title = "Workshop med Webkom", + isBedpres = false, +}: RegistrationConfirmationEmailProps) { + const typeText = isBedpres ? "bedriftspresentasjonen" : "arrangmentet"; + + return ( + + + Du har fått plass på {title}. + + + +
+ echo + Du har fått plass! + + + Du har fått plass på {typeText}, {title}. + +
+
+ +
+ + ); +} diff --git a/apps/email/src/emails/strike-notification.tsx b/apps/email/src/emails/strike-notification.tsx new file mode 100644 index 0000000000..84c402a938 --- /dev/null +++ b/apps/email/src/emails/strike-notification.tsx @@ -0,0 +1,73 @@ +import { + Body, + Container, + Head, + Heading, + Html, + Img, + Preview, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import * as React from "react"; + +type StrikeNotificationEmailProps = { + name?: string; + reason?: string; + amount?: number; + isBanned?: boolean; +}; + +export default function StrikeNotificationEmail({ + name = "Bo Salhus", + reason = "Kom for sent", + amount = 3, + isBanned = false, +}: StrikeNotificationEmailProps) { + return ( + + + VIKITG: Du har fått prikk + + + +
+ echo + + Du har mottatt {amount > 1 ? `${amount} prikker` : "en prikk"} + + +
+ Hei, {name}. + + + Du har motatt {amount} prikk{amount > 1 ? "er" : ""} grunnet: + + + + {'"'} + {reason} + {'"'} + + + {isBanned && ( + + Siden dette har ført til at du har 5 prikker, vil du bli utestengt fra å melde + deg på arrangementer i en periode. Besøk profil-siden din for mer informasjon. + + )} +
+
+
+ +
+ + ); +} diff --git a/apps/email/src/index.ts b/apps/email/src/index.ts new file mode 100644 index 0000000000..e5d66df2b9 --- /dev/null +++ b/apps/email/src/index.ts @@ -0,0 +1,10 @@ +import { serve } from "@hono/node-server"; + +import { app } from "./routes"; + +const PORT = Number(process.env.EMAIL_PORT) || 6000; + +serve({ fetch: app.fetch, port: PORT }, () => { + // oxlint-disable-next-line no-console + console.log(`Email service running on http://localhost:${PORT}`); +}); diff --git a/apps/email/src/routes.ts b/apps/email/src/routes.ts new file mode 100644 index 0000000000..53870b5c5a --- /dev/null +++ b/apps/email/src/routes.ts @@ -0,0 +1,158 @@ +import { render } from "@react-email/render"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import { logger } from "hono/logger"; +import * as React from "react"; + +import { sendEmail } from "./email"; +import AccessDeniedEmail from "./emails/access-denied"; +import AccessGrantedEmail from "./emails/access-granted"; +import AccessRequestNotificationEmail from "./emails/access-request-notification"; +import DeregistrationNotificationEmail from "./emails/deregistration-notification"; +import EmailVerificationEmail from "./emails/email-verification"; +import GotSpotNotificationEmail from "./emails/got-spot-notification"; +import MagicLinkEmail from "./emails/magic-link"; +import RegistrationConfirmationEmail from "./emails/registration-confirmation"; +import StrikeNotificationEmail from "./emails/strike-notification"; + +const app = new Hono(); + +app.use(logger()); +app.use(cors()); + +app.use("*", async (c, next) => { + // Allow unauthenticated access to the root path for health checks + if (c.req.path === "/") { + await next(); + } + // For all other paths, require authentication + // Check if the Authorization header is present and matches the expected admin key + const authHeader = c.req.header("Authorization"); + if (!authHeader || authHeader !== `Bearer ${process.env.ADMIN_KEY}`) { + return c.json({ error: "Unauthorized" }, 401); + } + await next(); +}); + +app.get("/", (c) => c.json({ status: "ok" })); + +app.post("/registration-confirmation", async (c) => { + const { to, subject, title, isBedpres } = await c.req.json<{ + to: Array; + subject: string; + title?: string; + isBedpres?: boolean; + }>(); + const html = await render( + React.createElement(RegistrationConfirmationEmail, { title, isBedpres }), + ); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/deregistration-notification", async (c) => { + const { to, subject, name, reason, happeningTitle } = await c.req.json<{ + to: Array; + subject: string; + name?: string; + reason?: string; + happeningTitle?: string; + }>(); + const html = await render( + React.createElement(DeregistrationNotificationEmail, { name, reason, happeningTitle }), + ); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/got-spot-notification", async (c) => { + const { to, subject, name, happeningTitle } = await c.req.json<{ + to: Array; + subject: string; + name?: string; + happeningTitle?: string; + }>(); + const html = await render( + React.createElement(GotSpotNotificationEmail, { name, happeningTitle }), + ); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/strike-notification", async (c) => { + const { to, subject, name, reason, amount, isBanned } = await c.req.json<{ + to: Array; + subject: string; + name?: string; + reason?: string; + amount?: number; + isBanned?: boolean; + }>(); + const html = await render( + React.createElement(StrikeNotificationEmail, { name, reason, amount, isBanned }), + ); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/access-granted", async (c) => { + const { to, subject } = await c.req.json<{ + to: Array; + subject: string; + }>(); + const html = await render(React.createElement(AccessGrantedEmail)); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/access-denied", async (c) => { + const { to, subject, reason } = await c.req.json<{ + to: Array; + subject: string; + reason?: string; + }>(); + const html = await render(React.createElement(AccessDeniedEmail, { reason })); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/access-request-notification", async (c) => { + const { to, subject, email, reason } = await c.req.json<{ + to: Array; + subject: string; + email?: string; + reason?: string; + }>(); + const html = await render(React.createElement(AccessRequestNotificationEmail, { email, reason })); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/email-verification", async (c) => { + const { to, subject, verificationUrl, firstName } = await c.req.json<{ + to: Array; + subject: string; + verificationUrl: string; + firstName?: string; + }>(); + const html = await render( + React.createElement(EmailVerificationEmail, { verificationUrl, firstName }), + ); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +app.post("/magic-link", async (c) => { + const { to, subject, magicLinkUrl, code, firstName } = await c.req.json<{ + to: Array; + subject: string; + magicLinkUrl: string; + code: string; + firstName?: string; + }>(); + const html = await render(React.createElement(MagicLinkEmail, { magicLinkUrl, code, firstName })); + await sendEmail(to, subject, html); + return c.json({ success: true }); +}); + +export { app }; diff --git a/apps/email/tsconfig.json b/apps/email/tsconfig.json new file mode 100644 index 0000000000..57d100cdc9 --- /dev/null +++ b/apps/email/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "es2022", + "module": "commonjs", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "strict": true, + "jsx": "react-jsx", + "outDir": "dist" + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "dist"] +} From 3ca317c63239ec2e14aa2d56a74291e159a01c23 Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 16:13:50 +0200 Subject: [PATCH 2/8] feat: add email notifications for access requests, strikes, and deregistrations --- apps/uno/bootstrap/api.go | 7 +- apps/uno/bootstrap/cron.go | 2 +- apps/uno/config/config.go | 5 + apps/uno/cron/jobs/db_maintenance_test.go | 4 +- apps/uno/docs/docs.go | 122 +++ apps/uno/docs/swagger.json | 122 +++ apps/uno/docs/swagger.yaml | 77 ++ apps/uno/domain/port/email.go | 15 + apps/uno/domain/port/mocks/EmailClient.go | 719 ++++++++++++++++++ apps/uno/domain/service/access_request.go | 89 ++- .../uno/domain/service/access_request_test.go | 4 +- apps/uno/domain/service/happening.go | 115 ++- apps/uno/domain/service/happening_test.go | 12 + apps/uno/domain/service/strike.go | 23 +- apps/uno/domain/service/strike_test.go | 14 +- apps/uno/http/dto/access_request.go | 5 + apps/uno/http/routes/api/access_request.go | 71 +- .../http/routes/api/access_request_test.go | 6 +- apps/uno/http/routes/api/happening_test.go | 20 + apps/uno/http/routes/api/users_test.go | 8 +- apps/uno/infrastructure/external/email.go | 131 ++++ .../postgres/sanity_webhook_test.go | 2 +- 22 files changed, 1543 insertions(+), 30 deletions(-) create mode 100644 apps/uno/domain/port/email.go create mode 100644 apps/uno/domain/port/mocks/EmailClient.go create mode 100644 apps/uno/infrastructure/external/email.go diff --git a/apps/uno/bootstrap/api.go b/apps/uno/bootstrap/api.go index daa165b11e..87e4882cab 100644 --- a/apps/uno/bootstrap/api.go +++ b/apps/uno/bootstrap/api.go @@ -59,6 +59,7 @@ func RunApi() { weatherRepo := external.NewYrRepo(logger, redisClient) databrusRepo := external.NewDatabrusRepo(logger, redisClient) adventOfCodeRepo := external.NewAdventOfCodeClient(aocClient, logger, redisClient) + emailClient := external.NewEmailClient(cfg.EmailBaseURL) groupRepo := postgres.NewGroupRepo(db, logger) reactionRepo := postgres.NewReactionRepo(db, logger) quoteRepo := postgres.NewQuoteRepo(db, logger) @@ -105,13 +106,13 @@ func RunApi() { VerificationTokenRepo: verificationTokenRepo, SignInAttemptCache: cache.NewCache[service.SignInAttempt](redisClient, "sign-in-attempt", logger), }) - happeningService := service.NewHappeningService(happeningRepo, userRepo, registrationRepo, banInfoRepo, groupRepo) + happeningService := service.NewHappeningService(happeningRepo, userRepo, registrationRepo, banInfoRepo, groupRepo, cmsHappeningRepo, emailClient) degreeService := service.NewDegreeService(degreeRepo) siteFeedbackService := service.NewSiteFeedbackService(siteFeedbackRepo) shoppingListService := service.NewShoppingListService(shoppingListItemRepo, usersToShoppingListItemRepo) userService := service.NewUserService(userRepo, profilePictureRepo, groupRepo, degreeRepo) - strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo) - accessRequestService := service.NewAccessRequestService(accessRequestRepo) + strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo, emailClient) + accessRequestService := service.NewAccessRequestService(accessRequestRepo, whitelistRepo, emailClient) whitelistService := service.NewWhitelistService(whitelistRepo) commentService := service.NewCommentService(commentRepo) weatherService := service.NewWeatherService(weatherRepo) diff --git a/apps/uno/bootstrap/cron.go b/apps/uno/bootstrap/cron.go index 833b346c65..d9a3a3570a 100644 --- a/apps/uno/bootstrap/cron.go +++ b/apps/uno/bootstrap/cron.go @@ -101,7 +101,7 @@ func RunCron(job string) { logger.Warn(context.Background(), "file storage not configured, profile picture features disabled") } questionService := service.NewQuestionService(questionRepo) - strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo) + strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo, nil) userService := service.NewUserService(userRepo, profilePictureRepo, nil, nil) // Job to clean up sensitive questions and strikes every 6 months. diff --git a/apps/uno/config/config.go b/apps/uno/config/config.go index ece738f11a..6c42a16aff 100644 --- a/apps/uno/config/config.go +++ b/apps/uno/config/config.go @@ -46,6 +46,9 @@ type Config struct { SanityAPIToken string SanityAPIVersion string + // Email service configuration + EmailBaseURL string + // Storage configuration DatabaseURL string RedisURL string @@ -104,6 +107,8 @@ func Load() *Config { SanityAPIVersion: getEnvOrDefault("SANITY_API_VERSION", "2023-05-03"), SanityAPIToken: os.Getenv("SANITY_API_TOKEN"), + EmailBaseURL: getEnvOrDefault("EMAIL_BASE_URL", "http://localhost:3001"), + DatabaseURL: os.Getenv("DATABASE_URL"), RedisURL: os.Getenv("REDIS_URL"), } diff --git a/apps/uno/cron/jobs/db_maintenance_test.go b/apps/uno/cron/jobs/db_maintenance_test.go index c9075b5359..ce1992c6c1 100644 --- a/apps/uno/cron/jobs/db_maintenance_test.go +++ b/apps/uno/cron/jobs/db_maintenance_test.go @@ -57,7 +57,7 @@ func TestCleanupOldStrikesRun(t *testing.T) { banInfoRepo := mocks.NewBanInfoRepo(t) userRepo := mocks.NewUserRepo(t) - strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo) + strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo, nil) job := NewCleanupOldStrikes(strikeService, &testutil.NoOpLogger{}) err := job.Run(t.Context()) @@ -77,7 +77,7 @@ func TestCleanupOldStrikesRunError(t *testing.T) { banInfoRepo := mocks.NewBanInfoRepo(t) userRepo := mocks.NewUserRepo(t) - strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo) + strikeService := service.NewStrikeService(dotRepo, banInfoRepo, userRepo, nil) job := NewCleanupOldStrikes(strikeService, &testutil.NoOpLogger{}) err := job.Run(t.Context()) diff --git a/apps/uno/docs/docs.go b/apps/uno/docs/docs.go index e6e829644f..5cbdda52b5 100644 --- a/apps/uno/docs/docs.go +++ b/apps/uno/docs/docs.go @@ -175,6 +175,120 @@ const docTemplate = `{ } } }, + "/access-requests/{id}/approve": { + "post": { + "security": [ + { + "AdminAPIKey": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "access-request" + ], + "summary": "Approve access request", + "parameters": [ + { + "type": "string", + "description": "Access request ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/access-requests/{id}/deny": { + "post": { + "security": [ + { + "AdminAPIKey": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "access-request" + ], + "summary": "Deny access request", + "parameters": [ + { + "type": "string", + "description": "Access request ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Denial payload", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/uno_http_dto.DenyAccessRequestRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, "/advent-of-code/leaderboard": { "get": { "produces": [ @@ -5612,6 +5726,14 @@ const docTemplate = `{ } } }, + "uno_http_dto.DenyAccessRequestRequest": { + "type": "object", + "properties": { + "reason": { + "type": "string" + } + } + }, "uno_http_dto.DeregisterRequest": { "type": "object", "properties": { diff --git a/apps/uno/docs/swagger.json b/apps/uno/docs/swagger.json index c8953376a8..b8ffddec12 100644 --- a/apps/uno/docs/swagger.json +++ b/apps/uno/docs/swagger.json @@ -168,6 +168,120 @@ } } }, + "/access-requests/{id}/approve": { + "post": { + "security": [ + { + "AdminAPIKey": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "access-request" + ], + "summary": "Approve access request", + "parameters": [ + { + "type": "string", + "description": "Access request ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/access-requests/{id}/deny": { + "post": { + "security": [ + { + "AdminAPIKey": [] + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "access-request" + ], + "summary": "Deny access request", + "parameters": [ + { + "type": "string", + "description": "Access request ID", + "name": "id", + "in": "path", + "required": true + }, + { + "description": "Denial payload", + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/uno_http_dto.DenyAccessRequestRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, "/advent-of-code/leaderboard": { "get": { "produces": [ @@ -5605,6 +5719,14 @@ } } }, + "uno_http_dto.DenyAccessRequestRequest": { + "type": "object", + "properties": { + "reason": { + "type": "string" + } + } + }, "uno_http_dto.DeregisterRequest": { "type": "object", "properties": { diff --git a/apps/uno/docs/swagger.yaml b/apps/uno/docs/swagger.yaml index fbad0aeb59..29e0ce63b6 100644 --- a/apps/uno/docs/swagger.yaml +++ b/apps/uno/docs/swagger.yaml @@ -775,6 +775,11 @@ definitions: name: type: string type: object + uno_http_dto.DenyAccessRequestRequest: + properties: + reason: + type: string + type: object uno_http_dto.DeregisterRequest: properties: reason: @@ -1478,6 +1483,78 @@ paths: summary: Delete access request tags: - access-request + /access-requests/{id}/approve: + post: + parameters: + - description: Access request ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "401": + description: Unauthorized + schema: + type: string + "404": + description: Not Found + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + security: + - AdminAPIKey: [] + summary: Approve access request + tags: + - access-request + /access-requests/{id}/deny: + post: + consumes: + - application/json + parameters: + - description: Access request ID + in: path + name: id + required: true + type: string + - description: Denial payload + in: body + name: body + required: true + schema: + $ref: '#/definitions/uno_http_dto.DenyAccessRequestRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "401": + description: Unauthorized + schema: + type: string + "404": + description: Not Found + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + security: + - AdminAPIKey: [] + summary: Deny access request + tags: + - access-request /advent-of-code/leaderboard: get: produces: diff --git a/apps/uno/domain/port/email.go b/apps/uno/domain/port/email.go new file mode 100644 index 0000000000..c20e61eca7 --- /dev/null +++ b/apps/uno/domain/port/email.go @@ -0,0 +1,15 @@ +package port + +import "context" + +type EmailClient interface { + SendRegistrationConfirmation(ctx context.Context, to []string, subject, title string, isBedpres bool) error + SendDeregistrationNotification(ctx context.Context, to []string, subject, name, reason, happeningTitle string) error + SendGotSpotNotification(ctx context.Context, to []string, subject, name, happeningTitle string) error + SendStrikeNotification(ctx context.Context, to []string, subject, name, reason string, amount int, isBanned bool) error + SendAccessGranted(ctx context.Context, to []string, subject string) error + SendAccessDenied(ctx context.Context, to []string, subject, reason string) error + SendAccessRequestNotification(ctx context.Context, to []string, subject, email, reason string) error + SendEmailVerification(ctx context.Context, to []string, subject, verificationURL, firstName string) error + SendMagicLink(ctx context.Context, to []string, subject, magicLinkURL, code, firstName string) error +} diff --git a/apps/uno/domain/port/mocks/EmailClient.go b/apps/uno/domain/port/mocks/EmailClient.go new file mode 100644 index 0000000000..e6ececd05b --- /dev/null +++ b/apps/uno/domain/port/mocks/EmailClient.go @@ -0,0 +1,719 @@ +// Code generated by mockery; DO NOT EDIT. +// github.com/vektra/mockery +// template: testify + +package mocks + +import ( + "context" + + mock "github.com/stretchr/testify/mock" +) + +// NewEmailClient creates a new instance of EmailClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEmailClient(t interface { + mock.TestingT + Cleanup(func()) +}) *EmailClient { + mock := &EmailClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} + +// EmailClient is an autogenerated mock type for the EmailClient type +type EmailClient struct { + mock.Mock +} + +type EmailClient_Expecter struct { + mock *mock.Mock +} + +func (_m *EmailClient) EXPECT() *EmailClient_Expecter { + return &EmailClient_Expecter{mock: &_m.Mock} +} + +// SendAccessDenied provides a mock function for the type EmailClient +func (_mock *EmailClient) SendAccessDenied(ctx context.Context, to []string, subject string, reason string) error { + ret := _mock.Called(ctx, to, subject, reason) + + if len(ret) == 0 { + panic("no return value specified for SendAccessDenied") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, reason) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendAccessDenied_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendAccessDenied' +type EmailClient_SendAccessDenied_Call struct { + *mock.Call +} + +// SendAccessDenied is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - reason string +func (_e *EmailClient_Expecter) SendAccessDenied(ctx interface{}, to interface{}, subject interface{}, reason interface{}) *EmailClient_SendAccessDenied_Call { + return &EmailClient_SendAccessDenied_Call{Call: _e.mock.On("SendAccessDenied", ctx, to, subject, reason)} +} + +func (_c *EmailClient_SendAccessDenied_Call) Run(run func(ctx context.Context, to []string, subject string, reason string)) *EmailClient_SendAccessDenied_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + ) + }) + return _c +} + +func (_c *EmailClient_SendAccessDenied_Call) Return(err error) *EmailClient_SendAccessDenied_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendAccessDenied_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, reason string) error) *EmailClient_SendAccessDenied_Call { + _c.Call.Return(run) + return _c +} + +// SendAccessGranted provides a mock function for the type EmailClient +func (_mock *EmailClient) SendAccessGranted(ctx context.Context, to []string, subject string) error { + ret := _mock.Called(ctx, to, subject) + + if len(ret) == 0 { + panic("no return value specified for SendAccessGranted") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string) error); ok { + r0 = returnFunc(ctx, to, subject) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendAccessGranted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendAccessGranted' +type EmailClient_SendAccessGranted_Call struct { + *mock.Call +} + +// SendAccessGranted is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +func (_e *EmailClient_Expecter) SendAccessGranted(ctx interface{}, to interface{}, subject interface{}) *EmailClient_SendAccessGranted_Call { + return &EmailClient_SendAccessGranted_Call{Call: _e.mock.On("SendAccessGranted", ctx, to, subject)} +} + +func (_c *EmailClient_SendAccessGranted_Call) Run(run func(ctx context.Context, to []string, subject string)) *EmailClient_SendAccessGranted_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + run( + arg0, + arg1, + arg2, + ) + }) + return _c +} + +func (_c *EmailClient_SendAccessGranted_Call) Return(err error) *EmailClient_SendAccessGranted_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendAccessGranted_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string) error) *EmailClient_SendAccessGranted_Call { + _c.Call.Return(run) + return _c +} + +// SendAccessRequestNotification provides a mock function for the type EmailClient +func (_mock *EmailClient) SendAccessRequestNotification(ctx context.Context, to []string, subject string, email string, reason string) error { + ret := _mock.Called(ctx, to, subject, email, reason) + + if len(ret) == 0 { + panic("no return value specified for SendAccessRequestNotification") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, email, reason) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendAccessRequestNotification_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendAccessRequestNotification' +type EmailClient_SendAccessRequestNotification_Call struct { + *mock.Call +} + +// SendAccessRequestNotification is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - email string +// - reason string +func (_e *EmailClient_Expecter) SendAccessRequestNotification(ctx interface{}, to interface{}, subject interface{}, email interface{}, reason interface{}) *EmailClient_SendAccessRequestNotification_Call { + return &EmailClient_SendAccessRequestNotification_Call{Call: _e.mock.On("SendAccessRequestNotification", ctx, to, subject, email, reason)} +} + +func (_c *EmailClient_SendAccessRequestNotification_Call) Run(run func(ctx context.Context, to []string, subject string, email string, reason string)) *EmailClient_SendAccessRequestNotification_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + ) + }) + return _c +} + +func (_c *EmailClient_SendAccessRequestNotification_Call) Return(err error) *EmailClient_SendAccessRequestNotification_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendAccessRequestNotification_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, email string, reason string) error) *EmailClient_SendAccessRequestNotification_Call { + _c.Call.Return(run) + return _c +} + +// SendDeregistrationNotification provides a mock function for the type EmailClient +func (_mock *EmailClient) SendDeregistrationNotification(ctx context.Context, to []string, subject string, name string, reason string, happeningTitle string) error { + ret := _mock.Called(ctx, to, subject, name, reason, happeningTitle) + + if len(ret) == 0 { + panic("no return value specified for SendDeregistrationNotification") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, name, reason, happeningTitle) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendDeregistrationNotification_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendDeregistrationNotification' +type EmailClient_SendDeregistrationNotification_Call struct { + *mock.Call +} + +// SendDeregistrationNotification is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - name string +// - reason string +// - happeningTitle string +func (_e *EmailClient_Expecter) SendDeregistrationNotification(ctx interface{}, to interface{}, subject interface{}, name interface{}, reason interface{}, happeningTitle interface{}) *EmailClient_SendDeregistrationNotification_Call { + return &EmailClient_SendDeregistrationNotification_Call{Call: _e.mock.On("SendDeregistrationNotification", ctx, to, subject, name, reason, happeningTitle)} +} + +func (_c *EmailClient_SendDeregistrationNotification_Call) Run(run func(ctx context.Context, to []string, subject string, name string, reason string, happeningTitle string)) *EmailClient_SendDeregistrationNotification_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + var arg5 string + if args[5] != nil { + arg5 = args[5].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + ) + }) + return _c +} + +func (_c *EmailClient_SendDeregistrationNotification_Call) Return(err error) *EmailClient_SendDeregistrationNotification_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendDeregistrationNotification_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, name string, reason string, happeningTitle string) error) *EmailClient_SendDeregistrationNotification_Call { + _c.Call.Return(run) + return _c +} + +// SendEmailVerification provides a mock function for the type EmailClient +func (_mock *EmailClient) SendEmailVerification(ctx context.Context, to []string, subject string, verificationURL string, firstName string) error { + ret := _mock.Called(ctx, to, subject, verificationURL, firstName) + + if len(ret) == 0 { + panic("no return value specified for SendEmailVerification") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, verificationURL, firstName) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendEmailVerification_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendEmailVerification' +type EmailClient_SendEmailVerification_Call struct { + *mock.Call +} + +// SendEmailVerification is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - verificationURL string +// - firstName string +func (_e *EmailClient_Expecter) SendEmailVerification(ctx interface{}, to interface{}, subject interface{}, verificationURL interface{}, firstName interface{}) *EmailClient_SendEmailVerification_Call { + return &EmailClient_SendEmailVerification_Call{Call: _e.mock.On("SendEmailVerification", ctx, to, subject, verificationURL, firstName)} +} + +func (_c *EmailClient_SendEmailVerification_Call) Run(run func(ctx context.Context, to []string, subject string, verificationURL string, firstName string)) *EmailClient_SendEmailVerification_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + ) + }) + return _c +} + +func (_c *EmailClient_SendEmailVerification_Call) Return(err error) *EmailClient_SendEmailVerification_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendEmailVerification_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, verificationURL string, firstName string) error) *EmailClient_SendEmailVerification_Call { + _c.Call.Return(run) + return _c +} + +// SendGotSpotNotification provides a mock function for the type EmailClient +func (_mock *EmailClient) SendGotSpotNotification(ctx context.Context, to []string, subject string, name string, happeningTitle string) error { + ret := _mock.Called(ctx, to, subject, name, happeningTitle) + + if len(ret) == 0 { + panic("no return value specified for SendGotSpotNotification") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, name, happeningTitle) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendGotSpotNotification_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendGotSpotNotification' +type EmailClient_SendGotSpotNotification_Call struct { + *mock.Call +} + +// SendGotSpotNotification is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - name string +// - happeningTitle string +func (_e *EmailClient_Expecter) SendGotSpotNotification(ctx interface{}, to interface{}, subject interface{}, name interface{}, happeningTitle interface{}) *EmailClient_SendGotSpotNotification_Call { + return &EmailClient_SendGotSpotNotification_Call{Call: _e.mock.On("SendGotSpotNotification", ctx, to, subject, name, happeningTitle)} +} + +func (_c *EmailClient_SendGotSpotNotification_Call) Run(run func(ctx context.Context, to []string, subject string, name string, happeningTitle string)) *EmailClient_SendGotSpotNotification_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + ) + }) + return _c +} + +func (_c *EmailClient_SendGotSpotNotification_Call) Return(err error) *EmailClient_SendGotSpotNotification_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendGotSpotNotification_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, name string, happeningTitle string) error) *EmailClient_SendGotSpotNotification_Call { + _c.Call.Return(run) + return _c +} + +// SendMagicLink provides a mock function for the type EmailClient +func (_mock *EmailClient) SendMagicLink(ctx context.Context, to []string, subject string, magicLinkURL string, code string, firstName string) error { + ret := _mock.Called(ctx, to, subject, magicLinkURL, code, firstName) + + if len(ret) == 0 { + panic("no return value specified for SendMagicLink") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string, string) error); ok { + r0 = returnFunc(ctx, to, subject, magicLinkURL, code, firstName) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendMagicLink_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendMagicLink' +type EmailClient_SendMagicLink_Call struct { + *mock.Call +} + +// SendMagicLink is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - magicLinkURL string +// - code string +// - firstName string +func (_e *EmailClient_Expecter) SendMagicLink(ctx interface{}, to interface{}, subject interface{}, magicLinkURL interface{}, code interface{}, firstName interface{}) *EmailClient_SendMagicLink_Call { + return &EmailClient_SendMagicLink_Call{Call: _e.mock.On("SendMagicLink", ctx, to, subject, magicLinkURL, code, firstName)} +} + +func (_c *EmailClient_SendMagicLink_Call) Run(run func(ctx context.Context, to []string, subject string, magicLinkURL string, code string, firstName string)) *EmailClient_SendMagicLink_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + var arg5 string + if args[5] != nil { + arg5 = args[5].(string) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + ) + }) + return _c +} + +func (_c *EmailClient_SendMagicLink_Call) Return(err error) *EmailClient_SendMagicLink_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendMagicLink_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, magicLinkURL string, code string, firstName string) error) *EmailClient_SendMagicLink_Call { + _c.Call.Return(run) + return _c +} + +// SendRegistrationConfirmation provides a mock function for the type EmailClient +func (_mock *EmailClient) SendRegistrationConfirmation(ctx context.Context, to []string, subject string, title string, isBedpres bool) error { + ret := _mock.Called(ctx, to, subject, title, isBedpres) + + if len(ret) == 0 { + panic("no return value specified for SendRegistrationConfirmation") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, bool) error); ok { + r0 = returnFunc(ctx, to, subject, title, isBedpres) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendRegistrationConfirmation_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendRegistrationConfirmation' +type EmailClient_SendRegistrationConfirmation_Call struct { + *mock.Call +} + +// SendRegistrationConfirmation is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - title string +// - isBedpres bool +func (_e *EmailClient_Expecter) SendRegistrationConfirmation(ctx interface{}, to interface{}, subject interface{}, title interface{}, isBedpres interface{}) *EmailClient_SendRegistrationConfirmation_Call { + return &EmailClient_SendRegistrationConfirmation_Call{Call: _e.mock.On("SendRegistrationConfirmation", ctx, to, subject, title, isBedpres)} +} + +func (_c *EmailClient_SendRegistrationConfirmation_Call) Run(run func(ctx context.Context, to []string, subject string, title string, isBedpres bool)) *EmailClient_SendRegistrationConfirmation_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 bool + if args[4] != nil { + arg4 = args[4].(bool) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + ) + }) + return _c +} + +func (_c *EmailClient_SendRegistrationConfirmation_Call) Return(err error) *EmailClient_SendRegistrationConfirmation_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendRegistrationConfirmation_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, title string, isBedpres bool) error) *EmailClient_SendRegistrationConfirmation_Call { + _c.Call.Return(run) + return _c +} + +// SendStrikeNotification provides a mock function for the type EmailClient +func (_mock *EmailClient) SendStrikeNotification(ctx context.Context, to []string, subject string, name string, reason string, amount int, isBanned bool) error { + ret := _mock.Called(ctx, to, subject, name, reason, amount, isBanned) + + if len(ret) == 0 { + panic("no return value specified for SendStrikeNotification") + } + + var r0 error + if returnFunc, ok := ret.Get(0).(func(context.Context, []string, string, string, string, int, bool) error); ok { + r0 = returnFunc(ctx, to, subject, name, reason, amount, isBanned) + } else { + r0 = ret.Error(0) + } + return r0 +} + +// EmailClient_SendStrikeNotification_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendStrikeNotification' +type EmailClient_SendStrikeNotification_Call struct { + *mock.Call +} + +// SendStrikeNotification is a helper method to define mock.On call +// - ctx context.Context +// - to []string +// - subject string +// - name string +// - reason string +// - amount int +// - isBanned bool +func (_e *EmailClient_Expecter) SendStrikeNotification(ctx interface{}, to interface{}, subject interface{}, name interface{}, reason interface{}, amount interface{}, isBanned interface{}) *EmailClient_SendStrikeNotification_Call { + return &EmailClient_SendStrikeNotification_Call{Call: _e.mock.On("SendStrikeNotification", ctx, to, subject, name, reason, amount, isBanned)} +} + +func (_c *EmailClient_SendStrikeNotification_Call) Run(run func(ctx context.Context, to []string, subject string, name string, reason string, amount int, isBanned bool)) *EmailClient_SendStrikeNotification_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 []string + if args[1] != nil { + arg1 = args[1].([]string) + } + var arg2 string + if args[2] != nil { + arg2 = args[2].(string) + } + var arg3 string + if args[3] != nil { + arg3 = args[3].(string) + } + var arg4 string + if args[4] != nil { + arg4 = args[4].(string) + } + var arg5 int + if args[5] != nil { + arg5 = args[5].(int) + } + var arg6 bool + if args[6] != nil { + arg6 = args[6].(bool) + } + run( + arg0, + arg1, + arg2, + arg3, + arg4, + arg5, + arg6, + ) + }) + return _c +} + +func (_c *EmailClient_SendStrikeNotification_Call) Return(err error) *EmailClient_SendStrikeNotification_Call { + _c.Call.Return(err) + return _c +} + +func (_c *EmailClient_SendStrikeNotification_Call) RunAndReturn(run func(ctx context.Context, to []string, subject string, name string, reason string, amount int, isBanned bool) error) *EmailClient_SendStrikeNotification_Call { + _c.Call.Return(run) + return _c +} diff --git a/apps/uno/domain/service/access_request.go b/apps/uno/domain/service/access_request.go index 370c21fb2b..1d15b82782 100644 --- a/apps/uno/domain/service/access_request.go +++ b/apps/uno/domain/service/access_request.go @@ -2,17 +2,27 @@ package service import ( "context" + "fmt" + "time" "uno/domain/model" "uno/domain/port" ) type AccessRequestService struct { accessRequestRepo port.AccessRequestRepo + whitelistRepo port.WhitelistRepo + emailClient port.EmailClient } -func NewAccessRequestService(accessRequestRepo port.AccessRequestRepo) *AccessRequestService { +func NewAccessRequestService( + accessRequestRepo port.AccessRequestRepo, + whitelistRepo port.WhitelistRepo, + emailClient port.EmailClient, +) *AccessRequestService { return &AccessRequestService{ accessRequestRepo: accessRequestRepo, + whitelistRepo: whitelistRepo, + emailClient: emailClient, } } @@ -21,7 +31,22 @@ func (ars *AccessRequestService) GetAccessRequests(ctx context.Context) ([]model } func (ars *AccessRequestService) CreateAccessRequest(ctx context.Context, ar model.NewAccessRequest) (model.AccessRequest, error) { - return ars.accessRequestRepo.CreateAccessRequest(ctx, ar) + created, err := ars.accessRequestRepo.CreateAccessRequest(ctx, ar) + if err != nil { + return model.AccessRequest{}, err + } + + if ars.emailClient != nil { + _ = ars.emailClient.SendAccessRequestNotification( + ctx, + []string{"echo@uib.no"}, + "Forespørsel om tilgang til echo.uib.no", + ar.Email, + ar.Reason, + ) + } + + return created, nil } func (ars *AccessRequestService) GetAccessRequestByID(ctx context.Context, id string) (model.AccessRequest, error) { @@ -31,3 +56,63 @@ func (ars *AccessRequestService) GetAccessRequestByID(ctx context.Context, id st func (ars *AccessRequestService) DeleteAccessRequestByID(ctx context.Context, id string) error { return ars.accessRequestRepo.DeleteAccessRequestByID(ctx, id) } + +func (ars *AccessRequestService) ApproveAccessRequest(ctx context.Context, id string) error { + ar, err := ars.accessRequestRepo.GetAccessRequestByID(ctx, id) + if err != nil { + return err + } + + _, err = ars.whitelistRepo.UpsertWhitelist(ctx, model.NewWhitelist{ + Email: ar.Email, + ExpiresAt: accessRequestNextSemesterStart(), + Reason: fmt.Sprintf("Tilgang etter forespørsel: %s", ar.Reason), + }) + if err != nil { + return err + } + + if err = ars.accessRequestRepo.DeleteAccessRequestByID(ctx, id); err != nil { + return err + } + + if ars.emailClient != nil { + _ = ars.emailClient.SendAccessGranted( + ctx, + []string{ar.Email}, + "Tilgang til echo.uib.no", + ) + } + + return nil +} + +func (ars *AccessRequestService) DenyAccessRequest(ctx context.Context, id, reason string) error { + ar, err := ars.accessRequestRepo.GetAccessRequestByID(ctx, id) + if err != nil { + return err + } + + if err = ars.accessRequestRepo.DeleteAccessRequestByID(ctx, id); err != nil { + return err + } + + if ars.emailClient != nil { + _ = ars.emailClient.SendAccessDenied( + ctx, + []string{ar.Email}, + "Tilgang til echo.uib.no avslått", + reason, + ) + } + + return nil +} + +func accessRequestNextSemesterStart() time.Time { + now := time.Now() + if now.Month() >= time.August { + return time.Date(now.Year()+1, time.January, 1, 0, 0, 0, 0, time.Local) + } + return time.Date(now.Year(), time.August, 1, 0, 0, 0, 0, time.Local) +} diff --git a/apps/uno/domain/service/access_request_test.go b/apps/uno/domain/service/access_request_test.go index c1b20d19a6..335606d54a 100644 --- a/apps/uno/domain/service/access_request_test.go +++ b/apps/uno/domain/service/access_request_test.go @@ -12,7 +12,7 @@ import ( func TestAccessRequestService_GetAccessRequests(t *testing.T) { mockRepo := mocks.NewAccessRequestRepo(t) - accessRequestService := service.NewAccessRequestService(mockRepo) + accessRequestService := service.NewAccessRequestService(mockRepo, nil, nil) mockRepo.EXPECT().GetAccessRequests(t.Context()).Return([]model.AccessRequest{}, nil).Once() requests, err := accessRequestService.GetAccessRequests(t.Context()) @@ -22,7 +22,7 @@ func TestAccessRequestService_GetAccessRequests(t *testing.T) { func TestAccessRequestService_GetAccessRequestByID(t *testing.T) { mockRepo := mocks.NewAccessRequestRepo(t) - accessRequestService := service.NewAccessRequestService(mockRepo) + accessRequestService := service.NewAccessRequestService(mockRepo, nil, nil) id := "request-1" request := testutil.NewFakeStruct[model.AccessRequest]() mockRepo.EXPECT().GetAccessRequestByID(t.Context(), id).Return(request, nil).Once() diff --git a/apps/uno/domain/service/happening.go b/apps/uno/domain/service/happening.go index a8bab15c5c..d7778a6ad9 100644 --- a/apps/uno/domain/service/happening.go +++ b/apps/uno/domain/service/happening.go @@ -18,6 +18,8 @@ type HappeningService struct { registrationRepo port.RegistrationRepo banInfoRepo port.BanInfoRepo groupRepo port.GroupRepo + cmsHappeningRepo port.CMSHappeningRepo + emailClient port.EmailClient } func NewHappeningService( @@ -26,6 +28,8 @@ func NewHappeningService( registrationRepo port.RegistrationRepo, banInfoRepo port.BanInfoRepo, groupRepo port.GroupRepo, + cmsHappeningRepo port.CMSHappeningRepo, + emailClient port.EmailClient, ) *HappeningService { return &HappeningService{ happeningRepo: happeningRepo, @@ -33,6 +37,8 @@ func NewHappeningService( registrationRepo: registrationRepo, banInfoRepo: banInfoRepo, groupRepo: groupRepo, + cmsHappeningRepo: cmsHappeningRepo, + emailClient: emailClient, } } @@ -86,13 +92,120 @@ func (hs *HappeningService) UpdateRegistrationStatus( changedAt *time.Time, unregisterReason *string, ) error { - return hs.registrationRepo.UpdateRegistrationStatus(ctx, userID, happeningID, status, prevStatus, changedBy, changedAt, unregisterReason) + if err := hs.registrationRepo.UpdateRegistrationStatus(ctx, userID, happeningID, status, prevStatus, changedBy, changedAt, unregisterReason); err != nil { + return err + } + + if status == model.RegistrationStatusRegistered && hs.emailClient != nil { + hs.sendGotSpotNotification(ctx, userID, happeningID) + } + + return nil +} + +func (hs *HappeningService) sendGotSpotNotification(ctx context.Context, userID, happeningID string) { + user, err := hs.userRepo.GetUserByID(ctx, userID) + if err != nil { + return + } + + happening, err := hs.happeningRepo.GetHappeningById(ctx, happeningID) + if err != nil { + return + } + + sendTo := user.Email + if user.AlternativeEmail != nil { + sendTo = *user.AlternativeEmail + } + + name := "Ola Nordmann" + if user.Name != nil { + name = *user.Name + } + + subject := fmt.Sprintf("Du har fått plass på %s", happening.Title) + _ = hs.emailClient.SendGotSpotNotification(ctx, []string{sendTo}, subject, name, happening.Title) } func (hs *HappeningService) DeleteAnswersByUserAndHappening(ctx context.Context, userID string, happeningID string) error { return hs.registrationRepo.DeleteAnswersByUserAndHappening(ctx, userID, happeningID) } +// ErrRegistrationNotFound is returned when no registration exists for the given user and happening. +var ErrRegistrationNotFound = errors.New("registration not found") + +// Deregister removes a user from a happening and notifies the happening contacts. +func (hs *HappeningService) Deregister(ctx context.Context, userID, happeningID, reason string) error { + reg, err := hs.registrationRepo.GetByUserAndHappening(ctx, userID, happeningID) + if err != nil { + return err + } + if reg == nil { + return ErrRegistrationNotFound + } + + now := time.Now() + prevStatus := string(reg.Status) + if err = hs.registrationRepo.UpdateRegistrationStatus( + ctx, + userID, + happeningID, + model.RegistrationStatusUnregistered, + &prevStatus, + nil, + &now, + &reason, + ); err != nil { + return err + } + + if err = hs.registrationRepo.DeleteAnswersByUserAndHappening(ctx, userID, happeningID); err != nil { + return err + } + + if hs.emailClient != nil && hs.cmsHappeningRepo != nil { + hs.sendDeregistrationNotification(ctx, userID, happeningID, reason) + } + + return nil +} + +func (hs *HappeningService) sendDeregistrationNotification(ctx context.Context, userID, happeningID, reason string) { + happening, err := hs.happeningRepo.GetHappeningById(ctx, happeningID) + if err != nil { + return + } + + contacts, err := hs.cmsHappeningRepo.GetHappeningContactsBySlug(ctx, happening.Slug) + if err != nil || len(contacts) == 0 { + return + } + + user, err := hs.userRepo.GetUserByID(ctx, userID) + if err != nil { + return + } + + name := "Ukjent" + if user.Name != nil { + name = *user.Name + } + + to := make([]string, 0, len(contacts)) + for _, c := range contacts { + if c.Email != "" { + to = append(to, c.Email) + } + } + if len(to) == 0 { + return + } + + subject := fmt.Sprintf("%s har meldt seg av %s", name, happening.Title) + _ = hs.emailClient.SendDeregistrationNotification(ctx, to, subject, name, reason, happening.Title) +} + func (hs *HappeningService) DeleteRegistrationsByHappeningID(ctx context.Context, happeningID string) error { return hs.registrationRepo.DeleteRegistrationsByHappeningID(ctx, happeningID) } diff --git a/apps/uno/domain/service/happening_test.go b/apps/uno/domain/service/happening_test.go index a3de76c6c0..31fa39221e 100644 --- a/apps/uno/domain/service/happening_test.go +++ b/apps/uno/domain/service/happening_test.go @@ -32,6 +32,8 @@ func TestHappeningService_GetAllHappenings(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) happenings, err := happeningService.GetAllHappenings(t.Context()) @@ -270,6 +272,8 @@ func TestHappeningService_Register_ErrorCases(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -359,6 +363,8 @@ func TestHappeningService_Register_RegistrationWindow(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -481,6 +487,8 @@ func TestHappeningService_Register_QuestionValidation(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -649,6 +657,8 @@ func TestHappeningService_Register_Success(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -1216,6 +1226,8 @@ func TestHappeningService_Register_HostCanSkipSpotRangeCheck(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) questions := []model.QuestionAnswer{} diff --git a/apps/uno/domain/service/strike.go b/apps/uno/domain/service/strike.go index a1703340e8..b328419308 100644 --- a/apps/uno/domain/service/strike.go +++ b/apps/uno/domain/service/strike.go @@ -29,17 +29,20 @@ type StrikeService struct { dotRepo port.DotRepo banInforepo port.BanInfoRepo userRepo port.UserRepo + emailClient port.EmailClient } func NewStrikeService( dotRepo port.DotRepo, banInfoRepo port.BanInfoRepo, userRepo port.UserRepo, + emailClient port.EmailClient, ) *StrikeService { return &StrikeService{ dotRepo: dotRepo, banInforepo: banInfoRepo, userRepo: userRepo, + emailClient: emailClient, } } @@ -95,7 +98,8 @@ func (s *StrikeService) DeleteDotByIDAndUserID(ctx context.Context, id int, user } func (s *StrikeService) AddStrike(ctx context.Context, userID string, opts AddStrikeOptions) (AddStrikeResult, error) { - if _, err := s.userRepo.GetUserByID(ctx, userID); err != nil { + user, err := s.userRepo.GetUserByID(ctx, userID) + if err != nil { return AddStrikeResult{}, ErrUserNotFound } @@ -148,6 +152,7 @@ func (s *StrikeService) AddStrike(ctx context.Context, userID string, opts AddSt } } + s.sendStrikeNotification(ctx, user, opts.Reason, opts.Count, true) return AddStrikeResult{IsBanned: true}, nil } @@ -161,5 +166,21 @@ func (s *StrikeService) AddStrike(ctx context.Context, userID string, opts AddSt return AddStrikeResult{}, err } + s.sendStrikeNotification(ctx, user, opts.Reason, opts.Count, false) return AddStrikeResult{IsBanned: false}, nil } + +func (s *StrikeService) sendStrikeNotification(ctx context.Context, user model.User, reason string, count int, isBanned bool) { + if s.emailClient == nil { + return + } + sendTo := user.Email + if user.AlternativeEmail != nil { + sendTo = *user.AlternativeEmail + } + name := "Ola Nordmann" + if user.Name != nil { + name = *user.Name + } + _ = s.emailClient.SendStrikeNotification(ctx, []string{sendTo}, "VIKTIG: Du har fått prikk", name, reason, count, isBanned) +} diff --git a/apps/uno/domain/service/strike_test.go b/apps/uno/domain/service/strike_test.go index 5ac323bd89..f4c0112ba0 100644 --- a/apps/uno/domain/service/strike_test.go +++ b/apps/uno/domain/service/strike_test.go @@ -13,7 +13,7 @@ import ( func TestStrikeService_GetUserByID(t *testing.T) { mockUserRepo := mocks.NewUserRepo(t) - strikeService := service.NewStrikeService(nil, nil, mockUserRepo) + strikeService := service.NewStrikeService(nil, nil, mockUserRepo, nil) userID := "user-1" mockUser := testutil.NewFakeStruct(func(u *model.User) { u.ID = userID }) @@ -26,7 +26,7 @@ func TestStrikeService_GetUserByID(t *testing.T) { func TestStrikeService_CreateDot(t *testing.T) { mockDotRepo := mocks.NewDotRepo(t) - strikeService := service.NewStrikeService(mockDotRepo, nil, nil) + strikeService := service.NewStrikeService(mockDotRepo, nil, nil, nil) newDot := testutil.NewFakeStruct[model.NewDot]() mockDot := testutil.NewFakeStruct[model.Dot]() @@ -39,7 +39,7 @@ func TestStrikeService_CreateDot(t *testing.T) { func TestStrikeService_GetBanInfoByUserID(t *testing.T) { mockBanInfoRepo := mocks.NewBanInfoRepo(t) - strikeService := service.NewStrikeService(nil, mockBanInfoRepo, nil) + strikeService := service.NewStrikeService(nil, mockBanInfoRepo, nil, nil) userID := "user-1" banInfo := testutil.NewFakeStruct[model.ModBanInfo]() @@ -59,7 +59,7 @@ func TestStrikeService_UnbanUsersWithExpiredStrikes(t *testing.T) { mockBanInfoRepo := mocks.NewBanInfoRepo(t) mockBanInfoRepo.EXPECT().DeleteExpired(mock.Anything).Return(nil).Once() - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) err := strikeService.UnbanUsersWithExpiredStrikes(t.Context()) assert.NoError(t, err, "Expected no error from UnbanUsersWithExpiredStrikes") @@ -75,7 +75,7 @@ func TestStrikeService_UnbanUsersWithExpiredStrikes_BanInfoErr(t *testing.T) { mockBanInfoRepo := mocks.NewBanInfoRepo(t) mockBanInfoRepo.EXPECT().DeleteExpired(mock.Anything).Return(assert.AnError).Once() - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) err := strikeService.UnbanUsersWithExpiredStrikes(t.Context()) assert.Error(t, err, "Expected error from UnbanUsersWithExpiredStrikes due to BanInfoRepo failure") @@ -90,7 +90,7 @@ func TestStrikeService_UnbanUsersWithExpiredStrikes_DotRepoErr(t *testing.T) { mockBanInfoRepo := mocks.NewBanInfoRepo(t) // Does not get called - strikeServiceErr := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeServiceErr := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) err := strikeServiceErr.UnbanUsersWithExpiredStrikes(t.Context()) assert.Error(t, err, "Expected error from UnbanUsersWithExpiredStrikes due to DotRepo failure") @@ -105,7 +105,7 @@ func TestStrikeService_GetUsersWithStrikeDetails(t *testing.T) { } mockUserRepo.EXPECT().GetUsersWithStrikeDetails(mock.Anything).Return(expectedUsers, nil).Once() - strikeService := service.NewStrikeService(nil, nil, mockUserRepo) + strikeService := service.NewStrikeService(nil, nil, mockUserRepo, nil) users, err := strikeService.GetUsersWithStrikeDetails(t.Context()) assert.NoError(t, err, "Expected no error from GetUsersWithStrikeDetails") diff --git a/apps/uno/http/dto/access_request.go b/apps/uno/http/dto/access_request.go index 742246c922..7f2a00d335 100644 --- a/apps/uno/http/dto/access_request.go +++ b/apps/uno/http/dto/access_request.go @@ -37,6 +37,11 @@ func (r *AccessRequestResponse) FromDomain(ar model.AccessRequest) AccessRequest } } +// DenyAccessRequestRequest represents the payload for denying an access request +type DenyAccessRequestRequest struct { + Reason string `json:"reason"` +} + // AccessRequestsFromDomainList converts a slice of domain models to DTOs func AccessRequestsFromDomainList(accessRequests []model.AccessRequest) []AccessRequestResponse { response := make([]AccessRequestResponse, len(accessRequests)) diff --git a/apps/uno/http/routes/api/access_request.go b/apps/uno/http/routes/api/access_request.go index 03ae40f8e9..8b0f54f28e 100644 --- a/apps/uno/http/routes/api/access_request.go +++ b/apps/uno/http/routes/api/access_request.go @@ -15,7 +15,11 @@ type accessRequests struct { accessRequestService *service.AccessRequestService } -func NewAccessRequestMux(logger port.Logger, accessRequestService *service.AccessRequestService, admin handler.Middleware) *router.Mux { +func NewAccessRequestMux( + logger port.Logger, + accessRequestService *service.AccessRequestService, + admin handler.Middleware, +) *router.Mux { a := accessRequests{logger, accessRequestService} mux := router.NewMux() @@ -23,6 +27,8 @@ func NewAccessRequestMux(logger port.Logger, accessRequestService *service.Acces mux.POST("/", a.createAccessRequest, admin) mux.GET("/", a.getAccessRequests, admin) mux.DELETE("/{id}", a.deleteAccessRequest, admin) + mux.POST("/{id}/approve", a.approveAccessRequest, admin) + mux.POST("/{id}/deny", a.denyAccessRequest, admin) return mux } @@ -37,13 +43,11 @@ func NewAccessRequestMux(logger port.Logger, accessRequestService *service.Acces // @Security AdminAPIKey // @Router /access-requests [get] func (a *accessRequests) getAccessRequests(ctx *handler.Context) error { - // Get domain models from service accessRequests, err := a.accessRequestService.GetAccessRequests(ctx.Context()) if err != nil { return ctx.InternalServerError() } - // Convert to DTOs response := dto.AccessRequestsFromDomainList(accessRequests) return ctx.JSON(response) } @@ -105,3 +109,64 @@ func (a *accessRequests) deleteAccessRequest(ctx *handler.Context) error { return ctx.Ok() } + +// approveAccessRequest approves an access request, adding the email to the whitelist and sending a confirmation email. +// @Summary Approve access request +// @Tags access-request +// @Produce json +// @Param id path string true "Access request ID" +// @Success 200 {string} string "OK" +// @Failure 401 {string} string "Unauthorized" +// @Failure 404 {string} string "Not Found" +// @Failure 500 {string} string "Internal Server Error" +// @Security AdminAPIKey +// @Router /access-requests/{id}/approve [post] +func (a *accessRequests) approveAccessRequest(ctx *handler.Context) error { + id := ctx.PathValue("id") + if id == "" { + return ctx.BadRequest(errors.New("missing access request id")) + } + + if err := a.accessRequestService.ApproveAccessRequest(ctx.Context(), id); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return ctx.NotFound(errors.New("access request not found")) + } + return ctx.InternalServerError() + } + + return ctx.Ok() +} + +// denyAccessRequest denies an access request, deleting it and sending a rejection email. +// @Summary Deny access request +// @Tags access-request +// @Accept json +// @Produce json +// @Param id path string true "Access request ID" +// @Param body body dto.DenyAccessRequestRequest true "Denial payload" +// @Success 200 {string} string "OK" +// @Failure 401 {string} string "Unauthorized" +// @Failure 404 {string} string "Not Found" +// @Failure 500 {string} string "Internal Server Error" +// @Security AdminAPIKey +// @Router /access-requests/{id}/deny [post] +func (a *accessRequests) denyAccessRequest(ctx *handler.Context) error { + id := ctx.PathValue("id") + if id == "" { + return ctx.BadRequest(errors.New("missing access request id")) + } + + var req dto.DenyAccessRequestRequest + if err := ctx.ReadJSON(&req); err != nil { + return ctx.BadRequest(ErrFailedToReadJSON) + } + + if err := a.accessRequestService.DenyAccessRequest(ctx.Context(), id, req.Reason); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return ctx.NotFound(errors.New("access request not found")) + } + return ctx.InternalServerError() + } + + return ctx.Ok() +} diff --git a/apps/uno/http/routes/api/access_request_test.go b/apps/uno/http/routes/api/access_request_test.go index adda50f8b5..0c013e59d0 100644 --- a/apps/uno/http/routes/api/access_request_test.go +++ b/apps/uno/http/routes/api/access_request_test.go @@ -54,7 +54,7 @@ func TestGetAccessRequestsHandler(t *testing.T) { mockAccessRequestRepo := mocks.NewAccessRequestRepo(t) tt.setupMocks(mockAccessRequestRepo) - accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo) + accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo, nil, nil) mux := api.NewAccessRequestMux(testutil.NewTestLogger(), accessRequestService, handler.NoMiddleware) r := httptest.NewRequest(http.MethodGet, "/", nil) @@ -121,7 +121,7 @@ func TestCreateAccessRequestHandler(t *testing.T) { mockAccessRequestRepo := mocks.NewAccessRequestRepo(t) tt.setupMocks(mockAccessRequestRepo) - accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo) + accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo, nil, nil) mux := api.NewAccessRequestMux(testutil.NewTestLogger(), accessRequestService, handler.NoMiddleware) var r *http.Request @@ -195,7 +195,7 @@ func TestDeleteAccessRequestHandler(t *testing.T) { mockAccessRequestRepo := mocks.NewAccessRequestRepo(t) tt.setupMocks(mockAccessRequestRepo) - accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo) + accessRequestService := service.NewAccessRequestService(mockAccessRequestRepo, nil, nil) mux := api.NewAccessRequestMux(testutil.NewTestLogger(), accessRequestService, handler.NoMiddleware) r := httptest.NewRequest(http.MethodDelete, "/"+tt.id, nil) diff --git a/apps/uno/http/routes/api/happening_test.go b/apps/uno/http/routes/api/happening_test.go index d8df2436e5..7f036c931d 100644 --- a/apps/uno/http/routes/api/happening_test.go +++ b/apps/uno/http/routes/api/happening_test.go @@ -66,6 +66,8 @@ func TestGetHappeningsHandler(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -129,6 +131,8 @@ func TestGetHappeningById(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -193,6 +197,8 @@ func TestGetHappeningQuestions(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -331,6 +337,8 @@ func TestRegisterForHappening(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -370,6 +378,8 @@ func TestGetHappeningRegistrationsCountMany(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -403,6 +413,8 @@ func TestGetHappeningRegistrations(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -439,6 +451,8 @@ func TestGetHappeningSpotRanges(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -512,6 +526,8 @@ func TestDeregisterFromHappeningHandler(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -580,6 +596,8 @@ func TestUpdateRegistrationStatusHandler(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) @@ -638,6 +656,8 @@ func TestDeleteAllRegistrationsHandler(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, nil, + nil, + nil, ) mux := api.NewHappeningMux(testutil.NewTestLogger(), happeningService, handler.NoMiddleware) diff --git a/apps/uno/http/routes/api/users_test.go b/apps/uno/http/routes/api/users_test.go index 5255307d74..a462f5ddab 100644 --- a/apps/uno/http/routes/api/users_test.go +++ b/apps/uno/http/routes/api/users_test.go @@ -69,7 +69,7 @@ func TestGetUsersWithStrikeDetails(t *testing.T) { tt.setupMocks(mockUserRepo) - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) mux := newUsersTestMux(t, strikeService) r := httptest.NewRequest(http.MethodGet, "/with-strikes", nil) @@ -138,7 +138,7 @@ func TestAddStrikeHandler(t *testing.T) { mockUserRepo := mocks.NewUserRepo(t) tt.setupMocks(mockDotRepo, mockBanInfoRepo, mockUserRepo) - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) mux := newUsersTestMux(t, strikeService) body, _ := json.Marshal(tt.requestBody) @@ -186,7 +186,7 @@ func TestRemoveBanHandler(t *testing.T) { mockUserRepo := mocks.NewUserRepo(t) tt.setupMocks(mockBanInfoRepo) - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) mux := newUsersTestMux(t, strikeService) r := httptest.NewRequest(http.MethodDelete, "/"+tt.userID+"/ban", nil) @@ -236,7 +236,7 @@ func TestRemoveStrikeHandler(t *testing.T) { mockUserRepo := mocks.NewUserRepo(t) tt.setupMocks(mockDotRepo) - strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo) + strikeService := service.NewStrikeService(mockDotRepo, mockBanInfoRepo, mockUserRepo, nil) mux := newUsersTestMux(t, strikeService) r := httptest.NewRequest(http.MethodDelete, "/"+tt.userID+"/strikes/"+tt.strikeID, nil) diff --git a/apps/uno/infrastructure/external/email.go b/apps/uno/infrastructure/external/email.go new file mode 100644 index 0000000000..f52138819a --- /dev/null +++ b/apps/uno/infrastructure/external/email.go @@ -0,0 +1,131 @@ +package external + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "time" + "uno/domain/port" +) + +type EmailClient struct { + baseURL string + httpClient *http.Client +} + +func NewEmailClient(baseURL string) port.EmailClient { + return &EmailClient{ + baseURL: baseURL, + httpClient: &http.Client{Timeout: 10 * time.Second}, + } +} + +func (c *EmailClient) post(ctx context.Context, path string, payload any) error { + body, err := json.Marshal(payload) + if err != nil { + return fmt.Errorf("email client marshal: %w", err) + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/send/"+path, bytes.NewReader(body)) + if err != nil { + return fmt.Errorf("email client request: %w", err) + } + + req.Header.Set("Content-Type", "application/json") + + resp, err := c.httpClient.Do(req) + if err != nil { + return fmt.Errorf("email client send: %w", err) + } + defer func() { _ = resp.Body.Close() }() + + if resp.StatusCode >= 400 { + return fmt.Errorf("email service returned %d", resp.StatusCode) + } + + return nil +} + +func (c *EmailClient) SendRegistrationConfirmation(ctx context.Context, to []string, subject, title string, isBedpres bool) error { + return c.post(ctx, "registration-confirmation", map[string]any{ + "to": to, + "subject": subject, + "title": title, + "isBedpres": isBedpres, + }) +} + +func (c *EmailClient) SendDeregistrationNotification(ctx context.Context, to []string, subject, name, reason, happeningTitle string) error { + return c.post(ctx, "deregistration-notification", map[string]any{ + "to": to, + "subject": subject, + "name": name, + "reason": reason, + "happeningTitle": happeningTitle, + }) +} + +func (c *EmailClient) SendGotSpotNotification(ctx context.Context, to []string, subject, name, happeningTitle string) error { + return c.post(ctx, "got-spot-notification", map[string]any{ + "to": to, + "subject": subject, + "name": name, + "happeningTitle": happeningTitle, + }) +} + +func (c *EmailClient) SendStrikeNotification(ctx context.Context, to []string, subject, name, reason string, amount int, isBanned bool) error { + return c.post(ctx, "strike-notification", map[string]any{ + "to": to, + "subject": subject, + "name": name, + "reason": reason, + "amount": amount, + "isBanned": isBanned, + }) +} + +func (c *EmailClient) SendAccessGranted(ctx context.Context, to []string, subject string) error { + return c.post(ctx, "access-granted", map[string]any{ + "to": to, + "subject": subject, + }) +} + +func (c *EmailClient) SendAccessDenied(ctx context.Context, to []string, subject, reason string) error { + return c.post(ctx, "access-denied", map[string]any{ + "to": to, + "subject": subject, + "reason": reason, + }) +} + +func (c *EmailClient) SendAccessRequestNotification(ctx context.Context, to []string, subject, email, reason string) error { + return c.post(ctx, "access-request-notification", map[string]any{ + "to": to, + "subject": subject, + "email": email, + "reason": reason, + }) +} + +func (c *EmailClient) SendEmailVerification(ctx context.Context, to []string, subject, verificationURL, firstName string) error { + return c.post(ctx, "email-verification", map[string]any{ + "to": to, + "subject": subject, + "verificationUrl": verificationURL, + "firstName": firstName, + }) +} + +func (c *EmailClient) SendMagicLink(ctx context.Context, to []string, subject, magicLinkURL, code, firstName string) error { + return c.post(ctx, "magic-link", map[string]any{ + "to": to, + "subject": subject, + "magicLinkUrl": magicLinkURL, + "code": code, + "firstName": firstName, + }) +} diff --git a/apps/uno/infrastructure/postgres/sanity_webhook_test.go b/apps/uno/infrastructure/postgres/sanity_webhook_test.go index 5bfe963ead..395e25cba1 100644 --- a/apps/uno/infrastructure/postgres/sanity_webhook_test.go +++ b/apps/uno/infrastructure/postgres/sanity_webhook_test.go @@ -61,7 +61,7 @@ func setupWebhookTest(t *testing.T) (*Database, http.Handler) { logger := testutil.NewTestLogger() happeningRepo := NewHappeningRepo(db, logger) groupRepo := NewGroupRepo(db, logger) - happeningService := service.NewHappeningService(happeningRepo, nil, nil, nil, groupRepo) + happeningService := service.NewHappeningService(happeningRepo, nil, nil, nil, groupRepo, nil, nil) mux := api.NewSanityMux(logger, happeningService, handler.NoMiddleware, nil) return db, mux From dc741ab10f5d0b17e740681295ee80edca4fa439 Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 16:14:05 +0200 Subject: [PATCH 3/8] refactor: migrate to external email service --- apps/web/next.config.ts | 2 +- apps/web/package.json | 1 - apps/web/src/actions/deregister.ts | 17 - apps/web/src/actions/update-registration.ts | 22 - apps/web/src/api/uno/client.ts | 12 + .../_actions/delete-access-request.ts | 20 +- .../admin/whitelist/_actions/grant-access.ts | 54 +- .../auth/logg-inn/_actions/magic-link.ts | 13 +- .../tilgang/[id]/_actions/request-access.ts | 11 - .../prikker/ny/_actions/add-strike.tsx | 15 - apps/web/src/lib/email-client.ts | 34 + apps/web/src/lib/email-verification.tsx | 8 +- package.json | 3 +- pnpm-lock.yaml | 1918 +++++++++++++++-- turbo.json | 5 +- 15 files changed, 1814 insertions(+), 321 deletions(-) create mode 100644 apps/web/src/lib/email-client.ts diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index 1a1887731c..611710b0de 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -10,7 +10,7 @@ const config = { reactCompiler: true, output: NEXT_OUTPUT, - transpilePackages: ["@echo-webkom/db", "@echo-webkom/lib", "@echo-webkom/email"], + transpilePackages: ["@echo-webkom/db", "@echo-webkom/lib"], experimental: { serverActions: { diff --git a/apps/web/package.json b/apps/web/package.json index b3ebadd23c..da74a002e8 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,7 +15,6 @@ }, "dependencies": { "@echo-webkom/db": "workspace:*", - "@echo-webkom/email": "workspace:*", "@echo-webkom/lib": "workspace:*", "@hookform/resolvers": "5.2.2", "@json2csv/plainjs": "7.0.6", diff --git a/apps/web/src/actions/deregister.ts b/apps/web/src/actions/deregister.ts index 2db98f61a4..78704c3a60 100644 --- a/apps/web/src/actions/deregister.ts +++ b/apps/web/src/actions/deregister.ts @@ -1,7 +1,5 @@ "use server"; -import { DeregistrationNotificationEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; import { z } from "zod"; import { unoWithAdmin } from "@/api/server"; @@ -22,7 +20,6 @@ export const deregister = async (id: string, payload: z.infer []); - - if (contacts.length > 0) { - await emailClient.sendEmail( - contacts.map((contact) => contact.email), - `${user.name ?? "Ukjent"} har meldt seg av ${happening.title}`, - DeregistrationNotificationEmail({ - happeningTitle: happening.title, - name: user.name ?? "Ukjent", - reason: data.reason, - }), - ); - } - return { success: true, message: "Du er nå avmeldt", diff --git a/apps/web/src/actions/update-registration.ts b/apps/web/src/actions/update-registration.ts index b51455c6f8..0965f48b6e 100644 --- a/apps/web/src/actions/update-registration.ts +++ b/apps/web/src/actions/update-registration.ts @@ -1,8 +1,6 @@ "use server"; import { registrationStatusEnum } from "@echo-webkom/db/schemas"; -import { GotSpotNotificationEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; import { z } from "zod"; import { unoWithAdmin } from "@/api/server"; @@ -58,26 +56,6 @@ export const updateRegistration = async ( changedBy: user.id, }); - if (data.status === "registered") { - const sendTo = exisitingRegistration.userEmail; - - if (!sendTo) { - return { - success: false, - message: "Kunne ikke finne e-post for brukeren", - }; - } - - await emailClient.sendEmail( - [sendTo], - "Du har fått plass!", - GotSpotNotificationEmail({ - happeningTitle: happening.title, - name: exisitingRegistration.userName ?? exisitingRegistration.userEmail ?? undefined, - }), - ); - } - return { success: true, message: "Påmeldingen er endret", diff --git a/apps/web/src/api/uno/client.ts b/apps/web/src/api/uno/client.ts index 7eeea4f9ba..05ce46000c 100644 --- a/apps/web/src/api/uno/client.ts +++ b/apps/web/src/api/uno/client.ts @@ -947,6 +947,18 @@ class AccessRequestApi { const response = await this.client.request("DELETE", `/access-requests/${id}`); return response.status === 200; } + + async approve(id: string) { + const response = await this.client.request("POST", `/access-requests/${id}/approve`); + return response.status === 200; + } + + async deny(id: string, reason: string) { + const response = await this.client.request("POST", `/access-requests/${id}/deny`, { + body: JSON.stringify({ reason }), + }); + return response.status === 200; + } } export interface Degree { diff --git a/apps/web/src/app/(default)/admin/whitelist/_actions/delete-access-request.ts b/apps/web/src/app/(default)/admin/whitelist/_actions/delete-access-request.ts index e2f2d74d51..c2cdc194da 100644 --- a/apps/web/src/app/(default)/admin/whitelist/_actions/delete-access-request.ts +++ b/apps/web/src/app/(default)/admin/whitelist/_actions/delete-access-request.ts @@ -1,8 +1,5 @@ "use server"; -import { AccessDeniedEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; - import { unoWithAdmin } from "@/api/server"; import { auth } from "@/auth/session"; import { isMemberOf } from "@/lib/memberships"; @@ -14,23 +11,10 @@ export const deleteAccessRequestAction = async (accessRequestId: string, reason: throw new Error("Du har ikke tilgang til å slette forespørsler"); } - const requests = await unoWithAdmin.accessRequests.all(); - const accessRequest = requests.find((row) => row.id === accessRequestId); - - if (!accessRequest) { - throw new Error("Forespørsel ikke funnet"); - } - - await unoWithAdmin.accessRequests.remove(accessRequestId); - - await emailClient.sendEmail( - [accessRequest.email], - "Tilgang til echo.uib.no avslått", - AccessDeniedEmail({ reason }), - ); + await unoWithAdmin.accessRequests.deny(accessRequestId, reason); return { success: true, - message: "Forespørsel slettet", + message: "Forespørsel avslått", }; }; diff --git a/apps/web/src/app/(default)/admin/whitelist/_actions/grant-access.ts b/apps/web/src/app/(default)/admin/whitelist/_actions/grant-access.ts index 2a3590c8ea..ab59cb5f49 100644 --- a/apps/web/src/app/(default)/admin/whitelist/_actions/grant-access.ts +++ b/apps/web/src/app/(default)/admin/whitelist/_actions/grant-access.ts @@ -1,23 +1,9 @@ "use server"; -import { isPostgresIshError } from "@echo-webkom/db/error"; -import { AccessGrantedEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; - import { unoWithAdmin } from "@/api/server"; import { auth } from "@/auth/session"; import { isMemberOf } from "@/lib/memberships"; -function getNextSemesterStart() { - const now = new Date(); - const year = now.getFullYear(); - const month = now.getMonth(); - if (month >= 7) { - return new Date(year + 1, 0, 1); // January 1st of next year - } - return new Date(year, 7, 1); // August 1st of current year -} - export const grantAccessAction = async (accessRequestId: string) => { const user = await auth(); @@ -28,49 +14,17 @@ export const grantAccessAction = async (accessRequestId: string) => { }; } - const requests = await unoWithAdmin.accessRequests.all(); - const accessRequest = requests.find((row) => row.id === accessRequestId); + const ok = await unoWithAdmin.accessRequests.approve(accessRequestId); - if (!accessRequest) { + if (!ok) { return { success: false, - message: "Forespørsel ikke funnet", + message: "Kunne ikke godkjenne forespørselen", }; } - const expiresAt = getNextSemesterStart(); - - try { - await unoWithAdmin.whitelist.upsert({ - email: accessRequest.email, - expiresAt, - reason: `Tilgang etter forespørsel: ${accessRequest.reason}`, - }); - - await unoWithAdmin.accessRequests.remove(accessRequestId); - } catch (e) { - if (isPostgresIshError(e)) { - if (e.code === "23505") { - return { - success: false, - message: "E-posten er allerede i whitelist", - }; - } - } - return { - success: false, - message: "Kunne ikke legge til i whitelist", - }; - } - - await emailClient.sendEmail( - [accessRequest.email], - "Tilgang til echo.uib.no", - AccessGrantedEmail(), - ); - return { success: true, - message: "Forespørsel slettet", + message: "Forespørsel godkjent", }; }; diff --git a/apps/web/src/app/(default)/auth/logg-inn/_actions/magic-link.ts b/apps/web/src/app/(default)/auth/logg-inn/_actions/magic-link.ts index e1a2d0a918..6ffe56c4a9 100644 --- a/apps/web/src/app/(default)/auth/logg-inn/_actions/magic-link.ts +++ b/apps/web/src/app/(default)/auth/logg-inn/_actions/magic-link.ts @@ -4,11 +4,10 @@ import crypto from "crypto"; import { verificationTokens } from "@echo-webkom/db/schemas"; import { db } from "@echo-webkom/db/serverless"; -import { MagicLinkEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; import { eq } from "drizzle-orm"; import { DEV, UNO_BASE_URL } from "@/config"; +import { emailClient } from "@/lib/email-client"; import { checkRateLimit } from "@/lib/rate-limit"; import { isValidEmail } from "@/utils/string"; @@ -106,14 +105,12 @@ export async function sendMagicLink(email: string): Promise { console.log("================================"); } - await emailClient.sendEmail( + await emailClient.sendMagicLink( [targetEmail], "Logg inn på echo", - MagicLinkEmail({ - magicLinkUrl, - code, - firstName: existingUser.name?.split(" ")[0] ?? "der", - }), + magicLinkUrl, + code, + existingUser.name?.split(" ")[0] ?? "der", ); return { diff --git a/apps/web/src/app/(default)/auth/tilgang/[id]/_actions/request-access.ts b/apps/web/src/app/(default)/auth/tilgang/[id]/_actions/request-access.ts index 5dcf4b1830..bffbe04aa1 100644 --- a/apps/web/src/app/(default)/auth/tilgang/[id]/_actions/request-access.ts +++ b/apps/web/src/app/(default)/auth/tilgang/[id]/_actions/request-access.ts @@ -1,8 +1,6 @@ "use server"; import { isPostgresIshError } from "@echo-webkom/db/error"; -import { AccessRequestNotificationEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; import { z } from "zod"; import { unoWithAdmin } from "@/api/server"; @@ -32,15 +30,6 @@ export const requestAccess = async (data: IRequestAccessForm): Promise) const shouldBeBanned = result.isBanned; - const sendToEmail = strikedUser.alternativeEmail ?? strikedUser.email; - - await emailClient.sendEmail( - [sendToEmail], - "VIKTIG: Du har fått prikk", - , - ); - const message = shouldBeBanned ? `Brukeren er bannet i ${data.banExpiresInMonths} måneder` : `Brukeren har fått ${data.count} prikk(er)`; diff --git a/apps/web/src/lib/email-client.ts b/apps/web/src/lib/email-client.ts new file mode 100644 index 0000000000..aa3ae7fce7 --- /dev/null +++ b/apps/web/src/lib/email-client.ts @@ -0,0 +1,34 @@ +import "server-only"; + +const EMAIL_BASE_URL = process.env.EMAIL_BASE_URL; + +async function post(path: string, body: unknown): Promise { + if (!EMAIL_BASE_URL) return; + + const res = await fetch(`${EMAIL_BASE_URL}/send/${path}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + throw new Error(`Email service error: ${res.status} ${res.statusText}`); + } +} + +export const emailClient = { + sendEmailVerification: ( + to: Array, + subject: string, + verificationUrl: string, + firstName?: string, + ) => post("email-verification", { to, subject, verificationUrl, firstName }), + + sendMagicLink: ( + to: Array, + subject: string, + magicLinkUrl: string, + code: string, + firstName?: string, + ) => post("magic-link", { to, subject, magicLinkUrl, code, firstName }), +}; diff --git a/apps/web/src/lib/email-verification.tsx b/apps/web/src/lib/email-verification.tsx index e4147a93ce..a571e5dadb 100644 --- a/apps/web/src/lib/email-verification.tsx +++ b/apps/web/src/lib/email-verification.tsx @@ -1,11 +1,10 @@ import { verificationTokens } from "@echo-webkom/db/schemas"; import { db } from "@echo-webkom/db/serverless"; -import { EmailVerificationEmail } from "@echo-webkom/email"; -import { emailClient } from "@echo-webkom/email/client"; import { addHours } from "date-fns"; import { nanoid } from "nanoid"; import { BASE_URL, DEV } from "@/config"; +import { emailClient } from "@/lib/email-client"; const TOKEN_EXPIRY_HOURS = 24; @@ -45,9 +44,10 @@ export async function sendVerificationEmail(email: string, firstName?: string): console.log("================================"); } - await emailClient.sendEmail( + await emailClient.sendEmailVerification( [email], "Bekreft e-postadressen din - echo", - EmailVerificationEmail({ verificationUrl, firstName }), + verificationUrl, + firstName, ); } diff --git a/package.json b/package.json index 606fe7d930..447e8cf61a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "build": "turbo run build", - "dev": "./check.sh && turbo run dev --filter=@echo-webkom/web --filter=@echo-webkom/cms --filter=@echo-webkom/uno --filter=@echo-webkom/db", + "dev": "./check.sh && turbo run dev --filter=@echo-webkom/web --filter=@echo-webkom/cms --filter=@echo-webkom/uno --filter=@echo-webkom/db --filter=@echo-webkom/email-service", "dev:all": "./check.sh && turbo run dev", "web:dev": "pnpm run --filter=web dev", "cms:dev": "pnpm run --filter=cms dev", @@ -23,7 +23,6 @@ "db:setup": "pnpm db:remove && pnpm db:up && pnpm sleep2s && pnpm db:migrate", "seed": "pnpm --filter=seeder seed:start", "sleep2s": "node -e \"setTimeout(() => process.exit(0), 2000)\"", - "email:preview": "pnpm --filter=email preview", "lint": "echo 'Use pnpm check or pnpm check:fix instead'", "lint:fix": "echo 'Use pnpm check or pnpm check:fix instead'", "format": "echo 'Use pnpm check or pnpm check:fix instead'", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index baeabbf82b..2cbf42ded4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -120,6 +120,52 @@ importers: specifier: ^4.80.0 version: 4.80.0 + apps/email: + dependencies: + '@hono/node-server': + specifier: ^1.13.7 + version: 1.19.13(hono@4.12.12) + '@react-email/components': + specifier: 1.0.6 + version: 1.0.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-email/render': + specifier: 2.0.4 + version: 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + hono: + specifier: ^4.7.10 + version: 4.12.12 + react: + specifier: 19.2.4 + version: 19.2.4 + react-dom: + specifier: 19.2.4 + version: 19.2.4(react@19.2.4) + resend: + specifier: 6.9.1 + version: 6.9.1(@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + devDependencies: + '@types/node': + specifier: 22.19.7 + version: 22.19.7 + '@types/react': + specifier: 19.2.10 + version: 19.2.10 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.10) + dotenv-cli: + specifier: 11.0.0 + version: 11.0.0 + tsdown: + specifier: ^0.21.7 + version: 0.21.7(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)(typescript@5.9.3) + tsx: + specifier: ^4.19.4 + version: 4.21.0 + typescript: + specifier: 5.9.3 + version: 5.9.3 + apps/uno: devDependencies: dotenv-cli: @@ -131,9 +177,6 @@ importers: '@echo-webkom/db': specifier: workspace:* version: link:../../packages/db - '@echo-webkom/email': - specifier: workspace:* - version: link:../../packages/email '@echo-webkom/lib': specifier: workspace:* version: link:../../packages/lib @@ -329,6 +372,7 @@ importers: specifier: 5.9.3 version: 5.9.3 +<<<<<<< HEAD packages/email: dependencies: '@react-email/components': @@ -369,6 +413,49 @@ importers: specifier: 5.9.3 version: 5.9.3 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + packages/email: + dependencies: + '@react-email/components': + specifier: 1.0.6 + version: 1.0.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-email/render': + specifier: 2.0.4 + version: 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: + specifier: 19.2.4 + version: 19.2.4 + react-dom: + specifier: 19.2.4 + version: 19.2.4(react@19.2.4) + resend: + specifier: 6.9.1 + version: 6.9.1(@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + server-only: + specifier: 0.0.1 + version: 0.0.1 + devDependencies: + '@react-email/preview-server': + specifier: ^5.2.5 + version: 5.2.8(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@types/node': + specifier: 22.19.7 + version: 22.19.7 + '@types/react': + specifier: 19.2.10 + version: 19.2.10 + dotenv-cli: + specifier: 11.0.0 + version: 11.0.0 + react-email: + specifier: 5.2.5 + version: 5.2.5 + typescript: + specifier: 5.9.3 + version: 5.9.3 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) packages/lib: dependencies: '@echo-webkom/db': @@ -622,6 +709,10 @@ packages: resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} + '@babel/generator@8.0.0-rc.3': + resolution: {integrity: sha512-em37/13/nR320G4jab/nIIHZgc2Wz2y/D39lxnTyxB4/D/omPQncl/lSdlnJY1OhQcRGugTSIF2l/69o31C9dA==} + engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -701,10 +792,18 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@8.0.0-rc.3': + resolution: {integrity: sha512-AmwWFx1m8G/a5cXkxLxTiWl+YEoWuoFLUCwqMlNuWO1tqAYITQAbCRPUkyBHv1VOFgfjVOqEj6L3u15J5ZCzTA==} + engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@8.0.0-rc.3': + resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} + engines: {node: ^20.19.0 || >=22.12.0} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -717,16 +816,30 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} +<<<<<<< HEAD '@babel/parser@7.27.0': resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@8.0.0-rc.3': + resolution: {integrity: sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -1182,10 +1295,18 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} +<<<<<<< HEAD '@babel/traverse@7.27.0': resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -1194,6 +1315,10 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.0-rc.3': + resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} @@ -1447,6 +1572,9 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -2145,8 +2273,17 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} +<<<<<<< HEAD '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) +======= + '@hono/node-server@1.19.13': + resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} @@ -2696,6 +2833,7 @@ packages: '@next/env@16.1.7': resolution: {integrity: sha512-rJJbIdJB/RQr2F1nylZr/PJzamvNNhfr3brdKP6s/GW850jbtR70QlSfFselvIBbcPUOlQwBakexjFzqLzF6pg==} +<<<<<<< HEAD '@next/env@16.2.2': resolution: {integrity: sha512-LqSGz5+xGk9EL/iBDr2yo/CgNQV6cFsNhRR2xhSXYh7B/hb4nePCxlmDvGEKG30NMHDFf0raqSyOZiQrO7BkHQ==} @@ -2707,10 +2845,24 @@ packages: '@next/swc-darwin-arm64@16.2.2': resolution: {integrity: sha512-B92G3ulrwmkDSEJEp9+XzGLex5wC1knrmCSIylyVeiAtCIfvEJYiN3v5kXPlYt5R4RFlsfO/v++aKV63Acrugg==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-darwin-arm64@16.1.6': + resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-arm64@16.2.0': + resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} +======= + '@next/swc-darwin-arm64@16.2.0': + resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [darwin] +<<<<<<< HEAD '@next/swc-darwin-x64@16.1.7': resolution: {integrity: sha512-zcnVaaZulS1WL0Ss38R5Q6D2gz7MtBu8GZLPfK+73D/hp4GFMrC2sudLky1QibfV7h6RJBJs/gOFvYP0X7UVlQ==} engines: {node: '>= 10'} @@ -2719,10 +2871,24 @@ packages: '@next/swc-darwin-x64@16.2.2': resolution: {integrity: sha512-7ZwSgNKJNQiwW0CKhNm9B1WS2L1Olc4B2XY0hPYCAL3epFnugMhuw5TMWzMilQ3QCZcCHoYm9NGWTHbr5REFxw==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-darwin-x64@16.1.6': + resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-darwin-x64@16.2.0': + resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} +======= + '@next/swc-darwin-x64@16.2.0': + resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [darwin] +<<<<<<< HEAD '@next/swc-linux-arm64-gnu@16.1.7': resolution: {integrity: sha512-2ant89Lux/Q3VyC8vNVg7uBaFVP9SwoK2jJOOR0L8TQnX8CAYnh4uctAScy2Hwj2dgjVHqHLORQZJ2wH6VxhSQ==} engines: {node: '>= 10'} @@ -2732,11 +2898,25 @@ packages: '@next/swc-linux-arm64-gnu@16.2.2': resolution: {integrity: sha512-c3m8kBHMziMgo2fICOP/cd/5YlrxDU5YYjAJeQLyFsCqVF8xjOTH/QYG4a2u48CvvZZSj1eHQfBCbyh7kBr30Q==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-arm64-gnu@16.1.6': + resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-gnu@16.2.0': + resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} +======= + '@next/swc-linux-arm64-gnu@16.2.0': + resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] +<<<<<<< HEAD '@next/swc-linux-arm64-musl@16.1.7': resolution: {integrity: sha512-uufcze7LYv0FQg9GnNeZ3/whYfo+1Q3HnQpm16o6Uyi0OVzLlk2ZWoY7j07KADZFY8qwDbsmFnMQP3p3+Ftprw==} engines: {node: '>= 10'} @@ -2746,11 +2926,25 @@ packages: '@next/swc-linux-arm64-musl@16.2.2': resolution: {integrity: sha512-VKLuscm0P/mIfzt+SDdn2+8TNNJ7f0qfEkA+az7OqQbjzKdBxAHs0UvuiVoCtbwX+dqMEL9U54b5wQ/aN3dHeg==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-arm64-musl@16.1.6': + resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@16.2.0': + resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} +======= + '@next/swc-linux-arm64-musl@16.2.0': + resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] +<<<<<<< HEAD '@next/swc-linux-x64-gnu@16.1.7': resolution: {integrity: sha512-KWVf2gxYvHtvuT+c4MBOGxuse5TD7DsMFYSxVxRBnOzok/xryNeQSjXgxSv9QpIVlaGzEn/pIuI6Koosx8CGWA==} engines: {node: '>= 10'} @@ -2760,11 +2954,25 @@ packages: '@next/swc-linux-x64-gnu@16.2.2': resolution: {integrity: sha512-kU3OPHJq6sBUjOk7wc5zJ7/lipn8yGldMoAv4z67j6ov6Xo/JvzA7L7LCsyzzsXmgLEhk3Qkpwqaq/1+XpNR3g==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-x64-gnu@16.1.6': + resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-gnu@16.2.0': + resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} +======= + '@next/swc-linux-x64-gnu@16.2.0': + resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] +<<<<<<< HEAD '@next/swc-linux-x64-musl@16.1.7': resolution: {integrity: sha512-HguhaGwsGr1YAGs68uRKc4aGWxLET+NevJskOcCAwXbwj0fYX0RgZW2gsOCzr9S11CSQPIkxmoSbuVaBp4Z3dA==} engines: {node: '>= 10'} @@ -2774,11 +2982,25 @@ packages: '@next/swc-linux-x64-musl@16.2.2': resolution: {integrity: sha512-CKXRILyErMtUftp+coGcZ38ZwE/Aqq45VMCcRLr2I4OXKrgxIBDXHnBgeX/UMil0S09i2JXaDL3Q+TN8D/cKmg==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-x64-musl@16.1.6': + resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@16.2.0': + resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} +======= + '@next/swc-linux-x64-musl@16.2.0': + resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] +<<<<<<< HEAD '@next/swc-win32-arm64-msvc@16.1.7': resolution: {integrity: sha512-S0n3KrDJokKTeFyM/vGGGR8+pCmXYrjNTk2ZozOL1C/JFdfUIL9O1ATaJOl5r2POe56iRChbsszrjMAdWSv7kQ==} engines: {node: '>= 10'} @@ -2787,10 +3009,24 @@ packages: '@next/swc-win32-arm64-msvc@16.2.2': resolution: {integrity: sha512-sS/jSk5VUoShUqINJFvNjVT7JfR5ORYj/+/ZpOYbbIohv/lQfduWnGAycq2wlknbOql2xOR0DoV0s6Xfcy49+g==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-win32-arm64-msvc@16.1.6': + resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-arm64-msvc@16.2.0': + resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} +======= + '@next/swc-win32-arm64-msvc@16.2.0': + resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [win32] +<<<<<<< HEAD '@next/swc-win32-x64-msvc@16.1.7': resolution: {integrity: sha512-mwgtg8CNZGYm06LeEd+bNnOUfwOyNem/rOiP14Lsz+AnUY92Zq/LXwtebtUiaeVkhbroRCQ0c8GlR4UT1U+0yg==} engines: {node: '>= 10'} @@ -2799,6 +3035,19 @@ packages: '@next/swc-win32-x64-msvc@16.2.2': resolution: {integrity: sha512-aHaKceJgdySReT7qeck5oShucxWRiiEuwCGK8HHALe6yZga8uyFpLkPgaRw3kkF04U7ROogL/suYCNt/+CuXGA==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-win32-x64-msvc@16.1.6': + resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/swc-win32-x64-msvc@16.2.0': + resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} +======= + '@next/swc-win32-x64-msvc@16.2.0': + resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2882,6 +3131,9 @@ packages: '@oxc-project/types@0.122.0': resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.122.0': + resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxfmt/binding-android-arm-eabi@0.43.0': resolution: {integrity: sha512-CgU2s+/9hHZgo0IxVxrbMPrMj+tJ6VM3mD7Mr/4oiz4FNTISLoCvRmB5nk4wAAle045RtRjd86m673jwPyb1OQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3275,6 +3527,9 @@ packages: resolution: {integrity: sha512-djfIGU9n6DRrunlvj2nIDAp17URo/nA4jSXGvf+Gupx8NLLy9fmJBZ3GL8yhqn9lSVc+cKCharjOa3aOBnWbRw==} engines: {node: '>=20.19 <22 || >=22.12'} + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -4055,9 +4310,16 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc +<<<<<<< HEAD '@react-email/preview-server@5.2.10': resolution: {integrity: sha512-cYi21KF+Z/HGXT8RpkQMNFFubBafxyoB9Hn/wrslfDNtdoews2MdsDo6XXKkZvDTRG9SxQN3HGk4v4aoQZc20g==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@react-email/preview-server@5.2.8': + resolution: {integrity: sha512-drQ0C7vi7P0uE7Ox1Cyiujsx0oqp2RbIscOdSBR5qvzw3EKjlGbW2pWjQ000cjxTq3Si7lqlRKhOIF8MzOnqHw==} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@react-email/preview@0.0.14': resolution: {integrity: sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw==} engines: {node: '>=20.0.0'} @@ -4188,6 +4450,7 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] +<<<<<<< HEAD libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': @@ -4250,6 +4513,70 @@ packages: '@rolldown/pluginutils@1.0.0-rc.12': resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} +======= + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.12': + resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -4756,6 +5083,7 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} +<<<<<<< HEAD '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -4765,6 +5093,16 @@ packages: '@speed-highlight/core@1.2.15': resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@speed-highlight/core@1.2.14': + resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} +======= + '@speed-highlight/core@1.2.14': + resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@stablelib/base64@1.0.1': resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} @@ -4917,9 +5255,58 @@ packages: '@tanstack/virtual-core@3.13.23': resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} +<<<<<<< HEAD + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} +======= + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -4938,9 +5325,6 @@ packages: '@types/codemirror@5.60.17': resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} - '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} - '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -5072,11 +5456,17 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} +<<<<<<< HEAD '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) +======= + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@types/marked@4.3.2': resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} @@ -5283,9 +5673,30 @@ packages: xstate: optional: true +<<<<<<< HEAD accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@zone-eu/mailsplit@5.4.8': + resolution: {integrity: sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + +======= + '@zone-eu/mailsplit@5.4.8': + resolution: {integrity: sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -5317,14 +5728,6 @@ packages: ajv: optional: true - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -5358,6 +5761,10 @@ packages: resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} engines: {node: '>=14'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -5397,6 +5804,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@3.0.0-beta.1: + resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} + engines: {node: '>=20.19.0'} + astring@1.9.0: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true @@ -5477,10 +5888,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} - bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -5522,15 +5929,45 @@ packages: bare-url@2.4.0: resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} +<<<<<<< HEAD base64id@2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} baseline-browser-mapping@2.10.14: resolution: {integrity: sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + baseline-browser-mapping@2.10.8: + resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} +======= + baseline-browser-mapping@2.10.8: + resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=6.0.0'} hasBin: true +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade + +======= + basic-ftp@5.1.0: + resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} + engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade + +>>>>>>> 67b9f0bf (refactor: migrate to external email service) bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -5547,6 +5984,19 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + +======= + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + +>>>>>>> 67b9f0bf (refactor: migrate to external email service) blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -5560,10 +6010,6 @@ packages: brace-expansion@2.0.3: resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} - engines: {node: 18 || 20 || >=22} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5592,6 +6038,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -5615,8 +6065,19 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} +<<<<<<< HEAD caniuse-lite@1.0.30001785: resolution: {integrity: sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + + caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} +======= + caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -5684,9 +6145,6 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -5768,10 +6226,6 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -5794,23 +6248,61 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} +<<<<<<< HEAD conf@15.1.0: resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} engines: {node: '>=20'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + conf@15.0.2: + resolution: {integrity: sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==} + engines: {node: '>=20'} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} +<<<<<<< HEAD confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} +<<<<<<< HEAD + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} +======= + configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + + configstore@7.1.0: + resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} + engines: {node: '>=18'} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + console-table-printer@2.15.0: resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} @@ -5823,10 +6315,6 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} @@ -5840,10 +6328,6 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -6090,17 +6574,9 @@ packages: dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} - debounce-fn@6.0.0: - resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} - engines: {node: '>=18'} - debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debounce@2.2.0: - resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} - engines: {node: '>=18'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -6215,9 +6691,32 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} +<<<<<<< HEAD dot-prop@10.1.0: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + +======= + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dotenv-cli@11.0.0: resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} @@ -6349,6 +6848,15 @@ packages: resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -6379,13 +6887,34 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} +<<<<<<< HEAD + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding-japanese@2.2.0: + resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} + engines: {node: '>=8.10.0'} +======= + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} + encoding-japanese@2.2.0: + resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} + engines: {node: '>=8.10.0'} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} +<<<<<<< HEAD engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} @@ -6396,6 +6925,21 @@ packages: enhanced-resolve@5.20.1: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.5: + resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} +======= + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=10.13.0'} entities@4.5.0: @@ -6406,10 +6950,6 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - env-paths@3.0.0: - resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -6552,9 +7092,6 @@ packages: expressive-code@0.41.7: resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -6775,10 +7312,20 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} +<<<<<<< HEAD globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -6914,9 +7461,24 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} +<<<<<<< HEAD hosted-git-info@9.0.2: resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} engines: {node: ^20.17.0 || >=22.9.0} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} +======= + hono@4.12.12: + resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} + engines: {node: '>=16.9.0'} + + hookable@6.1.0: + resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} @@ -7005,6 +7567,22 @@ packages: import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + +======= + import-without-cache@0.2.5: + resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + engines: {node: '>=20.19.0'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + +>>>>>>> 67b9f0bf (refactor: migrate to external email service) indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -7142,10 +7720,6 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -7179,19 +7753,28 @@ packages: resolution: {integrity: sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==} engines: {node: '>=18'} +<<<<<<< HEAD isomorphic-dompurify@2.36.0: resolution: {integrity: sha512-E8YkGyPY3a/U5s0WOoc8Ok+3SWL/33yn2IHCoxCFLBUUPVy9WGa++akJZFxQCcJIhI+UvYhbrbnTIFQkHKZbgA==} engines: {node: '>=20.19.5'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + +======= + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -7258,9 +7841,6 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} - json-stable-stringify@1.3.0: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} @@ -7451,10 +8031,6 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -7764,10 +8340,6 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} - minimatch@5.1.9: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} @@ -7841,10 +8413,6 @@ packages: engines: {node: ^18 || >=20} hasBin: true - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -7855,6 +8423,7 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc +<<<<<<< HEAD next@16.1.7: resolution: {integrity: sha512-WM0L7WrSvKwoLegLYr6V+mz+RIofqQgVAfHhMp9a88ms0cFX8iX9ew+snpWlSBwpkURJOUdvCEt3uLl3NNzvWg==} engines: {node: '>=20.9.0'} @@ -7878,6 +8447,34 @@ packages: next@16.2.2: resolution: {integrity: sha512-i6AJdyVa4oQjyvX/6GeER8dpY/xlIV+4NMv/svykcLtURJSy/WzDnnUk/TM4d0uewFHK7xSQz4TbIwPgjky+3A==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + next@16.1.6: + resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + next@16.2.0: + resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} +======= + next@16.2.0: + resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -7943,11 +8540,6 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - nypm@0.6.2: - resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -7996,10 +8588,6 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - ora@9.3.0: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} @@ -8132,9 +8720,17 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} +<<<<<<< HEAD path-strip-sep@1.0.21: resolution: {integrity: sha512-V5Lvyhx0fE6/wEk/YseTtoRQIaD32cepnzrQ1b3kOzOxxDoSglry8IZ1b6LPObIeIbpC0+i9ygUsBNhkOttQKw==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -8202,6 +8798,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -8221,9 +8821,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - player.style@0.1.10: resolution: {integrity: sha512-Jxv7tlaQ3SFCddsN35jzoGnCHB3/xMTbJOgn4zcsmF0lcZvRPq5UkRRAD5tZm8CvzKndUvtoDlG6GSPL/N/SrA==} @@ -8374,6 +8971,9 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8436,11 +9036,20 @@ packages: peerDependencies: react: '>= 16.8' +<<<<<<< HEAD react-email@5.2.10: resolution: {integrity: sha512-Ys8yR5/a0nXf5u2GlT2UV93PJHC3ZnuMnNebEn7I5UE9XfMFPtlpgDs02mPJOJn49fhJjDTWIUlZD1vmQPDgJg==} engines: {node: '>=20.0.0'} hasBin: true +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + react-email@5.2.5: + resolution: {integrity: sha512-YaCp5n/0czviN4lFndsYongiI0IJOMFtFoRVIPJc9+WPJejJEvzJO94r31p3Cz9swDuV0RhEhH1W0lJFAXntHA==} + engines: {node: '>=20.0.0'} + hasBin: true + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -8813,11 +9422,51 @@ packages: robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} +<<<<<<< HEAD + rolldown@1.0.0-rc.12: + resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + engines: {node: ^20.19.0 || >=22.12.0} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.56.0: + resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} +======= + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rolldown-plugin-dts@0.23.2: + resolution: {integrity: sha512-PbSqLawLgZBGcOGT3yqWBGn4cX+wh2nt5FuBGdcMHyOhoukmjbhYAl8NT9sE4U38Cm9tqLOIQeOrvzeayM0DLQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20260325.1' + rolldown: ^1.0.0-rc.12 + typescript: ^5.0.0 || ^6.0.0 + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + rolldown@1.0.0-rc.12: resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup@4.56.0: + resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + hasBin: true + rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -9008,6 +9657,7 @@ packages: resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} +<<<<<<< HEAD socket.io-adapter@2.5.6: resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} @@ -9019,6 +9669,20 @@ packages: resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + socket.io-adapter@2.5.6: + resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} + + socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.3: + resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} + engines: {node: '>=10.2.0'} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -9079,10 +9743,6 @@ packages: std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - stdin-discarder@0.3.1: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} engines: {node: '>=18'} @@ -9210,12 +9870,24 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} +<<<<<<< HEAD tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} +======= + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} @@ -9274,6 +9946,10 @@ packages: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + engines: {node: '>=18'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -9326,6 +10002,10 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -9361,6 +10041,34 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tsdown@0.21.7: + resolution: {integrity: sha512-ukKIxKQzngkWvOYJAyptudclkm4VQqbjq+9HF5K5qDO8GJsYtMh8gIRwicbnZEnvFPr6mquFwYAVZ8JKt3rY2g==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.21.7 + '@tsdown/exe': 0.21.7 + '@vitejs/devtools': '*' + publint: ^0.3.0 + typescript: ^5.0.0 || ^6.0.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -9425,12 +10133,24 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} +<<<<<<< HEAD type-fest@5.5.0: resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} typedarray-dts@1.0.0: resolution: {integrity: sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + type-fest@5.4.1: + resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} + engines: {node: '>=20'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} +======= + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) typeid-js@0.3.0: resolution: {integrity: sha512-A1EmvIWG6xwYRfHuYUjPltHqteZ1EiDG+HOmbIYXeHUVztmnGrPIfU9KIK1QC30x59ko0r4JsMlwzsALCyiB3Q==} @@ -9458,13 +10178,12 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - uint8array-extras@1.5.0: - resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} - engines: {node: '>=18'} - ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -9561,6 +10280,16 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + unrun@0.2.34: + resolution: {integrity: sha512-LyaghRBR++r7svhDK6tnDz2XaYHWdneBOA0jbS8wnRsHerI9MFljX4fIiTgbbNbEVzZ0C9P1OjWLLe1OqoaaEw==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + synckit: ^0.11.11 + peerDependenciesMeta: + synckit: + optional: true + unstorage@1.17.4: resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} peerDependencies: @@ -9710,10 +10439,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -10079,6 +10804,7 @@ packages: utf-8-validate: optional: true +<<<<<<< HEAD ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -10093,6 +10819,25 @@ packages: ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + 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 + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} +======= + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -10561,6 +11306,15 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@8.0.0-rc.3': + dependencies: + '@babel/parser': 8.0.0-rc.3 + '@babel/types': 8.0.0-rc.3 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.29.0 @@ -10671,8 +11425,12 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@8.0.0-rc.3': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@8.0.0-rc.3': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.28.6': @@ -10688,14 +11446,26 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 +<<<<<<< HEAD '@babel/parser@7.27.0': dependencies: '@babel/types': 7.29.0 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.29.0 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 + '@babel/parser@8.0.0-rc.3': + dependencies: + '@babel/types': 8.0.0-rc.3 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -11269,6 +12039,7 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 +<<<<<<< HEAD '@babel/traverse@7.27.0': dependencies: '@babel/code-frame': 7.29.0 @@ -11281,6 +12052,21 @@ snapshots: transitivePeerDependencies: - supports-color +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -11298,6 +12084,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@8.0.0-rc.3': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.3 + '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@braintree/sanitize-url@7.1.2': {} '@bramus/specificity@2.4.2': @@ -11569,6 +12360,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 @@ -11645,7 +12441,17 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 +<<<<<<< HEAD get-tsconfig: 4.13.7 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + get-tsconfig: 4.13.0 + + '@esbuild/aix-ppc64@0.25.10': + optional: true + +======= + get-tsconfig: 4.13.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@esbuild/aix-ppc64@0.25.12': optional: true @@ -12004,7 +12810,21 @@ snapshots: '@floating-ui/utils@0.2.10': {} +<<<<<<< HEAD '@floating-ui/utils@0.2.11': {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@hookform/resolvers@3.10.0(react-hook-form@7.71.1(react@19.2.4))': + dependencies: + react-hook-form: 7.71.1(react@19.2.4) +======= + '@hono/node-server@1.19.13(hono@4.12.12)': + dependencies: + hono: 4.12.12 + + '@hookform/resolvers@3.10.0(react-hook-form@7.71.1(react@19.2.4))': + dependencies: + react-hook-form: 7.71.1(react@19.2.4) +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@hookform/resolvers@3.10.0(react-hook-form@7.72.1(react@19.2.4))': dependencies: @@ -12510,6 +13330,7 @@ snapshots: hls.js: 1.6.15 mux-embed: 5.17.10 +<<<<<<< HEAD '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)': dependencies: '@emnapi/core': 1.9.2 @@ -12522,48 +13343,132 @@ snapshots: '@next/env@16.2.2': {} '@next/swc-darwin-arm64@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/env@16.1.6': {} + + '@next/env@16.2.0': {} + + '@next/swc-darwin-arm64@16.1.6': + optional: true + + '@next/swc-darwin-arm64@16.2.0': +======= + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)': + dependencies: + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@next/env@16.2.0': {} + + '@next/swc-darwin-arm64@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true +<<<<<<< HEAD '@next/swc-darwin-arm64@16.2.2': optional: true '@next/swc-darwin-x64@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-darwin-x64@16.1.6': optional: true + '@next/swc-darwin-x64@16.2.0': +======= + '@next/swc-darwin-x64@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + optional: true + +<<<<<<< HEAD '@next/swc-darwin-x64@16.2.2': optional: true '@next/swc-linux-arm64-gnu@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-arm64-gnu@16.1.6': + optional: true + + '@next/swc-linux-arm64-gnu@16.2.0': +======= + '@next/swc-linux-arm64-gnu@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true +<<<<<<< HEAD '@next/swc-linux-arm64-gnu@16.2.2': optional: true '@next/swc-linux-arm64-musl@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-arm64-musl@16.1.6': optional: true + '@next/swc-linux-arm64-musl@16.2.0': +======= + '@next/swc-linux-arm64-musl@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + optional: true + +<<<<<<< HEAD '@next/swc-linux-arm64-musl@16.2.2': optional: true '@next/swc-linux-x64-gnu@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-x64-gnu@16.1.6': + optional: true + + '@next/swc-linux-x64-gnu@16.2.0': +======= + '@next/swc-linux-x64-gnu@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true +<<<<<<< HEAD '@next/swc-linux-x64-gnu@16.2.2': optional: true '@next/swc-linux-x64-musl@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-linux-x64-musl@16.1.6': optional: true + '@next/swc-linux-x64-musl@16.2.0': +======= + '@next/swc-linux-x64-musl@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + optional: true + +<<<<<<< HEAD '@next/swc-linux-x64-musl@16.2.2': optional: true '@next/swc-win32-arm64-msvc@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-win32-arm64-msvc@16.1.6': + optional: true + + '@next/swc-win32-arm64-msvc@16.2.0': +======= + '@next/swc-win32-arm64-msvc@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true +<<<<<<< HEAD '@next/swc-win32-arm64-msvc@16.2.2': optional: true '@next/swc-win32-x64-msvc@16.1.7': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@next/swc-win32-x64-msvc@16.1.6': + optional: true + + '@next/swc-win32-x64-msvc@16.2.0': +======= + '@next/swc-win32-x64-msvc@16.2.0': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true '@next/swc-win32-x64-msvc@16.2.2': @@ -12675,6 +13580,8 @@ snapshots: '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.122.0': {} + '@oxfmt/binding-android-arm-eabi@0.43.0': optional: true @@ -12948,6 +13855,10 @@ snapshots: '@portabletext/types@4.0.2': {} + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -13779,6 +14690,7 @@ snapshots: marked: 15.0.12 react: 19.2.4 +<<<<<<< HEAD '@react-email/preview-server@5.2.10(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: esbuild: 0.27.3 @@ -13793,6 +14705,23 @@ snapshots: - react-dom - sass +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@react-email/preview-server@5.2.8(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + esbuild: 0.25.10 + next: 16.1.6(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + transitivePeerDependencies: + - '@babel/core' + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - babel-plugin-react-compiler + - react + - react-dom + - sass + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@react-email/preview@0.0.14(react@19.2.4)': dependencies: react: 19.2.4 @@ -13894,6 +14823,7 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': optional: true +<<<<<<< HEAD '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)': dependencies: '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1) @@ -13909,14 +14839,35 @@ snapshots: optional: true '@rolldown/pluginutils@1.0.0-rc.12': {} - - '@rolldown/pluginutils@1.0.0-rc.3': {} - - '@rolldown/pluginutils@1.0.0-rc.7': {} - - '@rollup/pluginutils@5.3.0(rollup@4.57.1)': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@rolldown/pluginutils@1.0.0-rc.2': {} +======= + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)': dependencies: - '@types/estree': 1.0.8 + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + optional: true + + '@rolldown/pluginutils@1.0.0-rc.12': {} + + '@rolldown/pluginutils@1.0.0-rc.2': {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + + '@rolldown/pluginutils@1.0.0-rc.3': {} + + '@rolldown/pluginutils@1.0.0-rc.7': {} + + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + dependencies: + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: @@ -14710,11 +15661,19 @@ snapshots: '@sindresorhus/is@7.2.0': {} +<<<<<<< HEAD '@sindresorhus/merge-streams@4.0.0': {} '@socket.io/component-emitter@3.1.2': {} '@speed-highlight/core@1.2.15': {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@socket.io/component-emitter@3.1.2': {} + + '@speed-highlight/core@1.2.14': {} +======= + '@speed-highlight/core@1.2.14': {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@stablelib/base64@1.0.1': {} @@ -14837,11 +15796,60 @@ snapshots: '@tanstack/virtual-core@3.13.23': {} + '@tybys/wasm-util@0.10.1': + dependencies: +<<<<<<< HEAD + tslib: 2.8.1 + optional: true +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@testing-library/dom': 10.4.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@types/aria-query@5.0.4': {} +======= + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.29.2 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@babel/runtime': 7.28.6 + '@testing-library/dom': 10.4.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@types/aria-query@5.0.4': {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.2 @@ -14872,10 +15880,6 @@ snapshots: dependencies: '@types/tern': 0.23.9 - '@types/cors@2.8.19': - dependencies: - '@types/node': 22.19.7 - '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -15023,19 +16027,36 @@ snapshots: dependencies: '@types/unist': 3.0.3 +<<<<<<< HEAD '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14)': +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.9)': +======= + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.10)': +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: +<<<<<<< HEAD '@types/react': 19.2.14 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@types/react': 19.2.9 +======= + '@types/react': 19.2.10 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) hoist-non-react-statics: 3.3.2 '@types/js-yaml@4.0.9': {} +<<<<<<< HEAD '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) +======= + '@types/jsesc@2.5.1': {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) '@types/marked@4.3.2': {} @@ -15096,8 +16117,16 @@ snapshots: '@types/styled-components@5.1.36': dependencies: +<<<<<<< HEAD '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14) '@types/react': 19.2.14 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.9) + '@types/react': 19.2.9 +======= + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.10) + '@types/react': 19.2.10 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) csstype: 3.2.3 '@types/stylis@4.2.7': {} @@ -15287,12 +16316,43 @@ snapshots: transitivePeerDependencies: - '@types/react' +<<<<<<< HEAD accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 acorn-jsx@5.3.2(acorn@8.16.0): +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@zone-eu/mailsplit@5.4.8': + dependencies: + libbase64: 1.3.0 + libmime: 5.3.7 + libqp: 2.1.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): +======= + '@zone-eu/mailsplit@5.4.8': + dependencies: + libbase64: 1.3.0 + libmime: 5.3.7 + libqp: 2.1.1 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.15.0): +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: acorn: 8.16.0 @@ -15310,10 +16370,6 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv-formats@3.0.1(ajv@8.18.0): - optionalDependencies: - ajv: 8.18.0 - ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -15343,10 +16399,75 @@ snapshots: ansis@3.17.0: {} + ansis@4.2.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + picomatch: 2.3.1 + + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.23 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + arctic@3.7.0: + dependencies: + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 + '@oslojs/jwt': 0.2.0 +======= + + archiver-utils@5.0.2: + dependencies: + glob: 10.5.0 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.23 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + arctic@3.7.0: + dependencies: + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 + '@oslojs/jwt': 0.2.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) arg@5.0.2: {} @@ -15372,6 +16493,12 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@3.0.0-beta.1: + dependencies: + '@babel/parser': 8.0.0-rc.3 + estree-walker: 3.0.3 + pathe: 2.0.3 + astring@1.9.0: {} astro-expressive-code@0.41.7(astro@6.1.5(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.32.0)(rollup@4.57.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.3)): @@ -15535,8 +16662,6 @@ snapshots: balanced-match@1.0.2: {} - balanced-match@4.0.4: {} - bare-events@2.8.2: {} bare-fs@4.6.0: @@ -15569,9 +16694,23 @@ snapshots: dependencies: bare-path: 3.0.0 +<<<<<<< HEAD base64id@2.0.0: {} baseline-browser-mapping@2.10.14: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + base64id@2.0.0: {} + + baseline-browser-mapping@2.10.8: {} + + baseline-browser-mapping@2.9.19: {} + + basic-ftp@5.1.0: {} +======= + baseline-browser-mapping@2.10.8: {} + + basic-ftp@5.1.0: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) bcp-47-match@2.0.3: {} @@ -15589,6 +16728,24 @@ snapshots: binary-extensions@2.3.0: {} +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + +======= + birpc@4.0.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + +>>>>>>> 67b9f0bf (refactor: migrate to external email service) blake3-wasm@2.1.5: {} boolbase@1.0.0: {} @@ -15608,10 +16765,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.5: - dependencies: - balanced-match: 4.0.4 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -15644,6 +16797,8 @@ snapshots: cac@6.7.14: {} + cac@7.0.0: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -15667,7 +16822,15 @@ snapshots: camelize@1.0.1: {} +<<<<<<< HEAD caniuse-lite@1.0.30001785: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + caniuse-lite@1.0.30001767: {} + + caniuse-lite@1.0.30001780: {} +======= + caniuse-lite@1.0.30001780: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) cardinal@2.1.1: dependencies: @@ -15736,10 +16899,6 @@ snapshots: ci-info@4.4.0: {} - citty@0.1.6: - dependencies: - consola: 3.4.2 - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -15814,8 +16973,6 @@ snapshots: commander@11.1.0: {} - commander@13.1.0: {} - commander@14.0.3: {} commander@7.2.0: {} @@ -15828,6 +16985,7 @@ snapshots: compute-scroll-into-view@3.1.1: {} +<<<<<<< HEAD conf@15.1.0: dependencies: ajv: 8.18.0 @@ -15840,17 +16998,75 @@ snapshots: semver: 7.7.4 uint8array-extras: 1.5.0 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + conf@15.0.2: + dependencies: + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + atomically: 2.1.0 + debounce-fn: 6.0.0 + dot-prop: 10.1.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.2 + semver: 7.7.4 + uint8array-extras: 1.5.0 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) confbox@0.1.8: {} +<<<<<<< HEAD confbox@0.2.4: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + confbox@0.2.2: {} + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 +<<<<<<< HEAD + consola@3.4.2: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + configstore@7.1.0: + dependencies: + atomically: 2.1.1 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 + consola@3.4.2: {} +======= + configstore@5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + configstore@7.1.0: + dependencies: + atomically: 2.1.1 + dot-prop: 9.0.0 + graceful-fs: 4.2.11 + xdg-basedir: 5.1.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) + console-table-printer@2.15.0: dependencies: simple-wcswidth: 1.1.2 @@ -15861,8 +17077,6 @@ snapshots: cookie-es@1.2.2: {} - cookie@0.7.2: {} - cookie@1.1.1: {} copy-to-clipboard@3.3.3: @@ -15875,11 +17089,6 @@ snapshots: core-util-is@1.0.3: {} - cors@2.8.6: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -16166,14 +17375,8 @@ snapshots: dayjs@1.11.20: {} - debounce-fn@6.0.0: - dependencies: - mimic-function: 5.0.1 - debounce@1.2.1: {} - debounce@2.2.0: {} - debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -16272,9 +17475,31 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 +<<<<<<< HEAD dot-prop@10.1.0: dependencies: type-fest: 5.5.0 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + dot-prop@10.1.0: + dependencies: + type-fest: 5.4.1 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 +======= + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dotenv-cli@11.0.0: dependencies: @@ -16319,6 +17544,8 @@ snapshots: dset@3.1.4: {} + dts-resolver@2.1.3: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -16357,12 +17584,25 @@ snapshots: emoji-regex@8.0.0: {} +<<<<<<< HEAD empathic@2.0.0: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + emoji-regex@9.2.2: {} + + encoding-japanese@2.2.0: {} +======= + emoji-regex@9.2.2: {} + + empathic@2.0.0: {} + + encoding-japanese@2.2.0: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) end-of-stream@1.4.5: dependencies: once: 1.4.0 +<<<<<<< HEAD engine.io-parser@5.2.3: {} engine.io@6.6.6: @@ -16383,6 +17623,29 @@ snapshots: - utf-8-validate enhanced-resolve@5.20.1: +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + engine.io-parser@5.2.3: {} + + engine.io@6.6.5: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 22.19.7 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.6 + debug: 4.4.3(supports-color@8.1.1) + engine.io-parser: 5.2.3 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + enhanced-resolve@5.18.4: +======= + enhanced-resolve@5.18.4: +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: graceful-fs: 4.2.11 tapable: 2.3.2 @@ -16391,8 +17654,6 @@ snapshots: entities@6.0.1: {} - env-paths@3.0.0: {} - error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -16639,8 +17900,6 @@ snapshots: '@expressive-code/plugin-shiki': 0.41.7 '@expressive-code/plugin-text-markers': 0.41.7 - exsolve@1.0.8: {} - extend@3.0.2: {} fast-content-type-parse@3.0.0: {} @@ -16701,6 +17960,10 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + file-selector@0.4.0: dependencies: tslib: 2.8.1 @@ -16856,6 +18119,7 @@ snapshots: glob@13.0.6: dependencies: +<<<<<<< HEAD minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -16865,6 +18129,31 @@ snapshots: ini: 4.1.1 globals@11.12.0: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.2.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.1 + +======= + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) globby@11.1.0: dependencies: @@ -17135,9 +18424,19 @@ snapshots: dependencies: react-is: 16.13.1 +<<<<<<< HEAD hosted-git-info@9.0.2: dependencies: lru-cache: 11.2.7 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + hosted-git-info@2.8.9: {} +======= + hono@4.12.12: {} + + hookable@6.1.0: {} + + hosted-git-info@2.8.9: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) hotscript@1.0.13: {} @@ -17233,6 +18532,16 @@ snapshots: import-meta-resolve@4.2.0: {} +<<<<<<< HEAD +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + imurmurhash@0.1.4: {} + +======= + import-without-cache@0.2.5: {} + + imurmurhash@0.1.4: {} + +>>>>>>> 67b9f0bf (refactor: migrate to external email service) indent-string@4.0.0: {} index-to-position@1.2.0: {} @@ -17323,8 +18632,6 @@ snapshots: is-stream@4.0.1: {} - is-unicode-supported@1.3.0: {} - is-unicode-supported@2.1.0: {} is-wsl@2.2.0: @@ -17357,12 +18664,27 @@ snapshots: isomorphic-dompurify@2.36.0(@noble/hashes@2.0.1): dependencies: +<<<<<<< HEAD dompurify: 3.3.3 jsdom: 28.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' - canvas - supports-color +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + +======= + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) jake@10.9.4: dependencies: @@ -17370,8 +18692,6 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 - jiti@2.4.2: {} - jiti@2.6.1: {} jose@6.2.2: {} @@ -17482,8 +18802,6 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema-typed@8.0.2: {} - json-stable-stringify@1.3.0: dependencies: call-bind: 1.0.8 @@ -17624,11 +18942,6 @@ snapshots: lodash@4.18.1: {} - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -18253,10 +19566,6 @@ snapshots: - bufferutil - utf-8-validate - minimatch@10.2.5: - dependencies: - brace-expansion: 5.0.5 - minimatch@5.1.9: dependencies: brace-expansion: 2.0.3 @@ -18309,8 +19618,6 @@ snapshots: nanoid@5.1.7: {} - negotiator@0.6.3: {} - neotraverse@0.6.18: {} next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -18318,6 +19625,7 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) +<<<<<<< HEAD next@16.1.7(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 16.1.7 @@ -18345,6 +19653,37 @@ snapshots: - babel-plugin-macros next@16.2.2(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + next@16.1.6(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@next/env': 16.1.6 + '@swc/helpers': 0.5.15 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + postcss: 8.4.31 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@playwright/test': 1.58.1 + babel-plugin-react-compiler: 1.0.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): +======= + next@16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 @@ -18416,6 +19755,7 @@ snapshots: nwsapi@2.2.23: {} +<<<<<<< HEAD nypm@0.6.2: dependencies: citty: 0.1.6 @@ -18424,6 +19764,17 @@ snapshots: pkg-types: 2.3.0 tinyexec: 1.0.4 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.2 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -18471,6 +19822,7 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 +<<<<<<< HEAD ora@8.2.0: dependencies: chalk: 5.6.2 @@ -18483,6 +19835,21 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) ora@9.3.0: dependencies: chalk: 5.6.2 @@ -18657,6 +20024,7 @@ snapshots: path-parse@1.0.7: {} +<<<<<<< HEAD path-scurry@2.0.2: dependencies: lru-cache: 11.2.7 @@ -18665,6 +20033,23 @@ snapshots: path-strip-sep@1.0.21: dependencies: tslib: 2.8.1 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.7 + minipass: 7.1.2 + +======= + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) path-to-regexp@6.3.0: {} @@ -18725,6 +20110,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.4: {} + pify@4.0.1: {} pirates@4.0.7: {} @@ -18743,12 +20130,22 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 +<<<<<<< HEAD pkg-types@2.3.0: dependencies: confbox: 0.2.4 exsolve: 1.0.8 pathe: 2.0.3 +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) player.style@0.1.10(react@19.2.4): dependencies: media-chrome: 4.11.1(react@19.2.4) @@ -18896,6 +20293,8 @@ snapshots: pure-rand@6.1.0: {} + quansync@1.0.0: {} + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -19008,6 +20407,7 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 +<<<<<<< HEAD react-email@5.2.10: dependencies: '@babel/parser': 7.27.0 @@ -19032,6 +20432,33 @@ snapshots: - supports-color - utf-8-validate +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + react-email@5.2.5: + dependencies: + '@babel/parser': 7.28.6 + '@babel/traverse': 7.28.6 + chokidar: 4.0.3 + commander: 13.1.0 + conf: 15.0.2 + debounce: 2.2.0 + esbuild: 0.25.12 + glob: 11.1.0 + jiti: 2.4.2 + log-symbols: 7.0.1 + mime-types: 3.0.2 + normalize-path: 3.0.0 + nypm: 0.6.2 + ora: 8.2.0 + prompts: 2.4.2 + socket.io: 4.8.3 + tsconfig-paths: 4.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) react-fast-compare@3.2.2: {} react-fast-marquee@1.6.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -19510,7 +20937,59 @@ snapshots: robust-predicates@3.0.3: {} +<<<<<<< HEAD rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1): +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + robust-predicates@3.0.2: {} + + rollup@4.56.0: +======= + robust-predicates@3.0.2: {} + + rolldown-plugin-dts@0.23.2(rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1))(typescript@5.9.3): + dependencies: + '@babel/generator': 8.0.0-rc.3 + '@babel/helper-validator-identifier': 8.0.0-rc.3 + '@babel/parser': 8.0.0-rc.3 + '@babel/types': 8.0.0-rc.3 + ast-kit: 3.0.0-beta.1 + birpc: 4.0.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.7 + obug: 2.1.1 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1): + dependencies: + '@oxc-project/types': 0.122.0 + '@rolldown/pluginutils': 1.0.0-rc.12 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 + '@rolldown/binding-darwin-x64': 1.0.0-rc.12 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + rollup@4.56.0: +>>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: '@oxc-project/types': 0.122.0 '@rolldown/pluginutils': 1.0.0-rc.12 @@ -19924,6 +21403,7 @@ snapshots: smol-toml@1.6.1: {} +<<<<<<< HEAD socket.io-adapter@2.5.6: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -19954,6 +21434,39 @@ snapshots: - supports-color - utf-8-validate +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + socket.io-adapter@2.5.6: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.5: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + socket.io@4.8.3: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.6 + debug: 4.4.3(supports-color@8.1.1) + engine.io: 6.6.5 + socket.io-adapter: 2.5.6 + socket.io-parser: 4.2.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + +======= +>>>>>>> 67b9f0bf (refactor: migrate to external email service) sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -20003,8 +21516,6 @@ snapshots: std-env@4.0.0: {} - stdin-discarder@0.2.2: {} - stdin-discarder@0.3.1: {} stream-replace-string@2.0.0: {} @@ -20137,9 +21648,17 @@ snapshots: symbol-tree@3.2.4: {} +<<<<<<< HEAD tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + tagged-tag@1.0.0: {} + + tailwind-merge@3.4.0: {} +======= + tailwind-merge@3.4.0: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) tailwindcss-animate@1.0.7(tailwindcss@4.2.2): dependencies: @@ -20216,6 +21735,8 @@ snapshots: tinyexec@1.0.4: {} + tinyexec@1.1.1: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -20261,6 +21782,8 @@ snapshots: dependencies: punycode: 2.3.1 + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -20288,12 +21811,41 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tsdown@0.21.7(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)(typescript@5.9.3): + dependencies: + ansis: 4.2.0 + cac: 7.0.0 + defu: 6.1.4 + empathic: 2.0.0 + hookable: 6.1.0 + import-without-cache: 0.2.5 + obug: 2.1.1 + picomatch: 4.0.4 + rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + rolldown-plugin-dts: 0.23.2(rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1))(typescript@5.9.3) + semver: 7.7.4 + tinyexec: 1.1.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + unrun: 0.2.34(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - synckit + - vue-tsc + tslib@2.8.1: {} tsx@4.21.0: dependencies: - esbuild: 0.27.2 - get-tsconfig: 4.13.0 + esbuild: 0.27.3 + get-tsconfig: 4.13.7 optionalDependencies: fsevents: 2.3.3 @@ -20338,11 +21890,25 @@ snapshots: type-fest@4.41.0: {} +<<<<<<< HEAD type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 typedarray-dts@1.0.0: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + type-fest@5.4.1: + dependencies: + tagged-tag: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 +======= + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 +>>>>>>> 67b9f0bf (refactor: migrate to external email service) typeid-js@0.3.0: dependencies: @@ -20366,10 +21932,13 @@ snapshots: ufo@1.6.3: {} - uint8array-extras@1.5.0: {} - ultrahtml@1.6.0: {} + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + uncrypto@0.1.3: {} undici-types@6.21.0: {} @@ -20480,6 +22049,13 @@ snapshots: universal-user-agent@7.0.3: {} + unrun@0.2.34(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1): + dependencies: + rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + unstorage@1.17.4: dependencies: anymatch: 3.1.3 @@ -20569,8 +22145,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vary@1.1.2: {} - vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -20936,9 +22510,17 @@ snapshots: ws@8.18.0: {} +<<<<<<< HEAD ws@8.18.3: {} ws@8.20.0: {} +||||||| parent of 67b9f0bf (refactor: migrate to external email service) + ws@8.18.3: {} + + ws@8.19.0: {} +======= + ws@8.19.0: {} +>>>>>>> 67b9f0bf (refactor: migrate to external email service) wsl-utils@0.3.1: dependencies: diff --git a/turbo.json b/turbo.json index 4dae14da58..02e6204e58 100644 --- a/turbo.json +++ b/turbo.json @@ -34,10 +34,6 @@ "persistent": true, "cache": false }, - "email:preview": { - "persistent": true, - "cache": false - }, "test:unit": {}, "check": {}, "check:fix": { @@ -72,6 +68,7 @@ "PORT", "SANITY_TOKEN", "RESEND_API_KEY", + "EMAIL_BASE_URL", "ECHOGRAM_API_KEY", "NEXT_PUBLIC_SANITY_PROJECT_ID", "NEXT_PUBLIC_ECHOGRAM_URL", From a96c849dbafad1c844baa298776ca9962d4571ad Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 16:15:04 +0200 Subject: [PATCH 4/8] docs: add EMAIL_BASE_URL configuration entry --- cenv.schema.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cenv.schema.toml b/cenv.schema.toml index be6d96c3bc..15555f9b18 100644 --- a/cenv.schema.toml +++ b/cenv.schema.toml @@ -186,3 +186,13 @@ required = false [[entries]] key = "AOC_SESSION_COOKIE" required = false + +# Email microservice configuration +# --------------------------------- +# The URL of the email microservice used for sending transactional emails. +# Used by: web, uno +[[entries]] +key = "EMAIL_BASE_URL" +required = false +default = "http://localhost:3001" +kind = "Url" From da625ffbbbba0be2c3708f6075cf57ae4d5990ab Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 16:16:04 +0200 Subject: [PATCH 5/8] chore: remove email package --- packages/email/.gitignore | 1 - packages/email/client.ts | 40 --------- packages/email/emails/access-denied.tsx | 64 -------------- packages/email/emails/access-granted.tsx | 45 ---------- .../emails/access-request-notification.tsx | 62 ------------- .../emails/deregistration-notification.tsx | 58 ------------- packages/email/emails/email-verification.tsx | 75 ---------------- .../email/emails/got-spot-notification.tsx | 52 ----------- packages/email/emails/magic-link.tsx | 87 ------------------- .../emails/registration-confirmation.tsx | 52 ----------- packages/email/emails/strike-notification.tsx | 73 ---------------- packages/email/index.ts | 11 --- packages/email/tsconfig.json | 27 ------ 13 files changed, 647 deletions(-) delete mode 100644 packages/email/.gitignore delete mode 100644 packages/email/client.ts delete mode 100644 packages/email/emails/access-denied.tsx delete mode 100644 packages/email/emails/access-granted.tsx delete mode 100644 packages/email/emails/access-request-notification.tsx delete mode 100644 packages/email/emails/deregistration-notification.tsx delete mode 100644 packages/email/emails/email-verification.tsx delete mode 100644 packages/email/emails/got-spot-notification.tsx delete mode 100644 packages/email/emails/magic-link.tsx delete mode 100644 packages/email/emails/registration-confirmation.tsx delete mode 100644 packages/email/emails/strike-notification.tsx delete mode 100644 packages/email/index.ts delete mode 100644 packages/email/tsconfig.json diff --git a/packages/email/.gitignore b/packages/email/.gitignore deleted file mode 100644 index 89f9ac04aa..0000000000 --- a/packages/email/.gitignore +++ /dev/null @@ -1 +0,0 @@ -out/ diff --git a/packages/email/client.ts b/packages/email/client.ts deleted file mode 100644 index 48a8d5fbcb..0000000000 --- a/packages/email/client.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable no-console */ -import "server-only"; -import { Resend } from "resend"; - -const API_KEY = process.env.RESEND_API_KEY; -const FROM_EMAIL = "echo "; - -export const emailClient = { - /** - * Only sends an email if the NODE_ENV is production and if the RESEND_API_KEY is set - * else - * It logs the email to the console - * - * @param to the people that should recieve the email - * @param subject the subject of the email - * @param Email the email component to render - */ - sendEmail: async (to: Array, subject: string, component: React.ReactElement) => { - if (process.env.NODE_ENV !== "production" || !API_KEY) { - try { - console.log("\n========== EMAIL SENT (DEV MODE) =========="); - console.log("TO:", to.join(", ")); - console.log("SUBJECT:", subject); - console.log("==========================================\n"); - return { success: true }; - } catch (error) { - console.error("Error rendering email in dev mode:", error); - throw error; - } - } - - const resend = new Resend(API_KEY); - return await resend.emails.send({ - from: FROM_EMAIL, - to, - subject, - react: component, - }); - }, -}; diff --git a/packages/email/emails/access-denied.tsx b/packages/email/emails/access-denied.tsx deleted file mode 100644 index 5524149cdc..0000000000 --- a/packages/email/emails/access-denied.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, -} from "@react-email/components"; -import * as React from "react"; - -type AccessDeniedProps = { - reason?: string; -}; - -export default function AccessDenied({ reason }: AccessDeniedProps) { - return ( - - - Din forespørsel om tilgang til echo.uib.no har blitt avslått - - - -
- echo - Tilgang ikke godkjent - -
- Din forespørsel om tilgang til{" "} - - echo.uib.no - {" "} - har dessverre blitt avslått. -
- - {reason && ( -
-
Begrunnelse:
-
{reason}
-
- )} - -
- Hvis du mener dette er en feil, kan du kontakte oss på{" "} - - webkom@echo.uib.no - - . -
-
-
- -
- - ); -} diff --git a/packages/email/emails/access-granted.tsx b/packages/email/emails/access-granted.tsx deleted file mode 100644 index 1f2ebf18ea..0000000000 --- a/packages/email/emails/access-granted.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, -} from "@react-email/components"; -import * as React from "react"; - -export default function AccessGranted() { - return ( - - - Du har fått tilgang til echo.uib.no - - - -
- echo - Du har fått tilgang! - -
- Velkommen! Prøv å logge inn på{" "} - - echo.uib.no - - . -
-
-
- -
- - ); -} diff --git a/packages/email/emails/access-request-notification.tsx b/packages/email/emails/access-request-notification.tsx deleted file mode 100644 index e213702261..0000000000 --- a/packages/email/emails/access-request-notification.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type DeregistrationNotificationEmailProps = { - email?: string; - reason?: string; -}; - -export default function AcccessRequestNotificationEmail({ - email = "bo.salhus@echo.uib.no", - reason = "Jeg har blitt syk", -}: DeregistrationNotificationEmailProps) { - return ( - - - {email} ønsker tilgang til echo.uib.no - - - -
- echo - - {email} ønsker tilgang til echo.uib.no - - -
- - {email} ønsker tilgang til echo.uib.no med følgende grunn: - - - {reason} -
- -
- - Du kan godkjenne eller avvise forespørselen på whitelist-dashbordet. - -
-
-
- -
- - ); -} diff --git a/packages/email/emails/deregistration-notification.tsx b/packages/email/emails/deregistration-notification.tsx deleted file mode 100644 index 12fac597b1..0000000000 --- a/packages/email/emails/deregistration-notification.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type DeregistrationNotificationEmailProps = { - name?: string; - reason?: string; - happeningTitle?: string; -}; - -export default function DeregistrationNotificationEmail({ - name = "Bo Salhus", - reason = "Jeg har blitt syk", - happeningTitle = "Workshop med Webkom", -}: DeregistrationNotificationEmailProps) { - return ( - - - - {name} har meldt seg av {happeningTitle} - - - - -
- echo - - {name} har meldt seg av {happeningTitle} - - -
- {name} har meldt seg av med følgende grunn: - - {reason} -
-
-
- -
- - ); -} diff --git a/packages/email/emails/email-verification.tsx b/packages/email/emails/email-verification.tsx deleted file mode 100644 index a50b6528aa..0000000000 --- a/packages/email/emails/email-verification.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type EmailVerificationProps = { - verificationUrl: string; - firstName?: string; -}; - -export default function EmailVerificationEmail({ - verificationUrl, - firstName = "der", -}: EmailVerificationProps) { - return ( - - - Bekreft e-postadressen din for echo - - - -
- echo - Velkommen til echo! - - Hei {firstName}!. - - - Vi trenger at du bekrefter den alternative e-postaddressen din for at vi skal kunne - bruke den. - - -
- -
- - - Hvis du ikke kan klikke på knappen, kan du kopiere og lime inn denne lenken i - nettleseren din: - - - {verificationUrl} - - - Hvis du ikke vet hva echo er, eller ikke har lagt til denne e-postadressen selv, kan - du trygt ignorere denne e-posten. - -
-
- -
- - ); -} diff --git a/packages/email/emails/got-spot-notification.tsx b/packages/email/emails/got-spot-notification.tsx deleted file mode 100644 index 8ea61875b3..0000000000 --- a/packages/email/emails/got-spot-notification.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type GotSpotNotificationProps = { - name?: string; - happeningTitle?: string; -}; - -export default function GotSpotNotification({ - name = "Bo Salhus", - happeningTitle = "Workshop med Webkom", -}: GotSpotNotificationProps) { - return ( - - - Du har fått plass på {happeningTitle} - - - -
- echo - Du har fått plass! - -
- - Gratulerer, {name}! Du har fått plass på {happeningTitle}. - -
-
-
- -
- - ); -} diff --git a/packages/email/emails/magic-link.tsx b/packages/email/emails/magic-link.tsx deleted file mode 100644 index cc99cbcee6..0000000000 --- a/packages/email/emails/magic-link.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type MagicLinkProps = { - magicLinkUrl: string; - code: string; - firstName?: string; -}; - -export default function MagicLinkEmail({ magicLinkUrl, code, firstName = "der" }: MagicLinkProps) { - return ( - - - Din magic link til å logge inn på echo - - - -
- echo - Logg inn på echo - - Hei {firstName}! - - - Klikk på knappen under for å logge inn på echo, eller bruk koden nedenfor. Denne - lenken er gyldig i 5 minutter. - - -
- -
- - Eller bruk denne koden: - -
- - {code} - -
- - - Hvis du ikke kan klikke på knappen, kan du kopiere og lime inn denne lenken i - nettleseren din: - - - {magicLinkUrl} - - - Hvis du ikke har bedt om en innloggingslenke, kan du trygt ignorere denne e-posten. - - - - Denne lenken og koden utløper automatisk etter 5 minutter av sikkerhetshensyn. - -
-
- -
- - ); -} diff --git a/packages/email/emails/registration-confirmation.tsx b/packages/email/emails/registration-confirmation.tsx deleted file mode 100644 index 46c4eca8c5..0000000000 --- a/packages/email/emails/registration-confirmation.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type RegistrationConfirmationEmailProps = { - title?: string; - isBedpres?: boolean; -}; - -export default function RegistrationConfirmationEmail({ - title = "Workshop med Webkom", - isBedpres = false, -}: RegistrationConfirmationEmailProps) { - const typeText = isBedpres ? "bedriftspresentasjonen" : "arrangmentet"; - - return ( - - - Du har fått plass på {title}. - - - -
- echo - Du har fått plass! - - - Du har fått plass på {typeText}, {title}. - -
-
- -
- - ); -} diff --git a/packages/email/emails/strike-notification.tsx b/packages/email/emails/strike-notification.tsx deleted file mode 100644 index 84c402a938..0000000000 --- a/packages/email/emails/strike-notification.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { - Body, - Container, - Head, - Heading, - Html, - Img, - Preview, - Section, - Tailwind, - Text, -} from "@react-email/components"; -import * as React from "react"; - -type StrikeNotificationEmailProps = { - name?: string; - reason?: string; - amount?: number; - isBanned?: boolean; -}; - -export default function StrikeNotificationEmail({ - name = "Bo Salhus", - reason = "Kom for sent", - amount = 3, - isBanned = false, -}: StrikeNotificationEmailProps) { - return ( - - - VIKITG: Du har fått prikk - - - -
- echo - - Du har mottatt {amount > 1 ? `${amount} prikker` : "en prikk"} - - -
- Hei, {name}. - - - Du har motatt {amount} prikk{amount > 1 ? "er" : ""} grunnet: - - - - {'"'} - {reason} - {'"'} - - - {isBanned && ( - - Siden dette har ført til at du har 5 prikker, vil du bli utestengt fra å melde - deg på arrangementer i en periode. Besøk profil-siden din for mer informasjon. - - )} -
-
-
- -
- - ); -} diff --git a/packages/email/index.ts b/packages/email/index.ts deleted file mode 100644 index 68cbd3b281..0000000000 --- a/packages/email/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { render } from "@react-email/render"; - -export { default as RegistrationConfirmationEmail } from "./emails/registration-confirmation"; -export { default as DeregistrationNotificationEmail } from "./emails/deregistration-notification"; -export { default as GotSpotNotificationEmail } from "./emails/got-spot-notification"; -export { default as StrikeNotificationEmail } from "./emails/strike-notification"; -export { default as AccessGrantedEmail } from "./emails/access-granted"; -export { default as AccessDeniedEmail } from "./emails/access-denied"; -export { default as AccessRequestNotificationEmail } from "./emails/access-request-notification"; -export { default as EmailVerificationEmail } from "./emails/email-verification"; -export { default as MagicLinkEmail } from "./emails/magic-link"; diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json deleted file mode 100644 index ca9977a35a..0000000000 --- a/packages/email/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "target": "es2022", - "skipLibCheck": true, - "esModuleInterop": true, - "allowJs": true, - "resolveJsonModule": true, - "isolatedModules": true, - - "strict": true, - "noUncheckedIndexedAccess": true, - "strictNullChecks": true, - "forceConsistentCasingInFileNames": true, - - "composite": true, - - "module": "es2022", - "moduleResolution": "bundler", - "noEmit": true, - - "lib": ["es2022", "dom", "dom.iterable"], - "jsx": "preserve" - }, - "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} From cd40bfd5d39894bfd7cff1d241040ec8ae1780c0 Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Tue, 7 Apr 2026 20:34:49 +0200 Subject: [PATCH 6/8] chore(email): add email:dev script for react-email development --- apps/email/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/email/package.json b/apps/email/package.json index e6533a989e..ac2f708607 100644 --- a/apps/email/package.json +++ b/apps/email/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "dev": "dotenv -e ../../.env -- tsx watch src/index.ts", + "email:dev": "react-email dev --port 3001", "build": "tsdown src/index.ts --format cjs --out-dir dist", "start": "node dist/index.js", "check": "oxlint . && oxfmt --check . && tsc --noEmit", From 1f5f8085495335f03f04d261aea0dd5f08c540aa Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Mon, 4 May 2026 14:12:48 +0200 Subject: [PATCH 7/8] chore: fix lock file --- pnpm-lock.yaml | 2394 +++++++++++++----------------------------------- 1 file changed, 634 insertions(+), 1760 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2cbf42ded4..dfa142f2d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -124,7 +124,7 @@ importers: dependencies: '@hono/node-server': specifier: ^1.13.7 - version: 1.19.13(hono@4.12.12) + version: 1.19.14(hono@4.12.15) '@react-email/components': specifier: 1.0.6 version: 1.0.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -133,7 +133,7 @@ importers: version: 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) hono: specifier: ^4.7.10 - version: 4.12.12 + version: 4.12.15 react: specifier: 19.2.4 version: 19.2.4 @@ -158,7 +158,7 @@ importers: version: 11.0.0 tsdown: specifier: ^0.21.7 - version: 0.21.7(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)(typescript@5.9.3) + version: 0.21.10(typescript@5.9.3) tsx: specifier: ^4.19.4 version: 4.21.0 @@ -297,7 +297,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 6.0.1 - version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) dotenv-cli: specifier: 11.0.0 version: 11.0.0 @@ -321,13 +321,13 @@ importers: version: 5.9.3 vite: specifier: 8.0.3 - version: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.1.1(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 4.1.2 - version: 4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) packages/db: dependencies: @@ -372,7 +372,6 @@ importers: specifier: 5.9.3 version: 5.9.3 -<<<<<<< HEAD packages/email: dependencies: '@react-email/components': @@ -413,49 +412,6 @@ importers: specifier: 5.9.3 version: 5.9.3 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - packages/email: - dependencies: - '@react-email/components': - specifier: 1.0.6 - version: 1.0.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-email/render': - specifier: 2.0.4 - version: 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: - specifier: 19.2.4 - version: 19.2.4 - react-dom: - specifier: 19.2.4 - version: 19.2.4(react@19.2.4) - resend: - specifier: 6.9.1 - version: 6.9.1(@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) - server-only: - specifier: 0.0.1 - version: 0.0.1 - devDependencies: - '@react-email/preview-server': - specifier: ^5.2.5 - version: 5.2.8(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@types/node': - specifier: 22.19.7 - version: 22.19.7 - '@types/react': - specifier: 19.2.10 - version: 19.2.10 - dotenv-cli: - specifier: 11.0.0 - version: 11.0.0 - react-email: - specifier: 5.2.5 - version: 5.2.5 - typescript: - specifier: 5.9.3 - version: 5.9.3 - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) packages/lib: dependencies: '@echo-webkom/db': @@ -470,7 +426,7 @@ importers: version: 5.9.3 vitest: specifier: 4.1.2 - version: 4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) packages/seeder: dependencies: @@ -816,20 +772,11 @@ packages: resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} -<<<<<<< HEAD '@babel/parser@7.27.0': resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} - hasBin: true - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/parser@7.29.2': resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} @@ -1295,18 +1242,10 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} -<<<<<<< HEAD '@babel/traverse@7.27.0': resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} - engines: {node: '>=6.9.0'} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} @@ -1563,8 +1502,11 @@ packages: '@emmetio/stream-reader@2.2.0': resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -1572,9 +1514,6 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -1633,12 +1572,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -1657,12 +1590,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.27.3': resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} @@ -1681,12 +1608,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.27.3': resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} @@ -1705,12 +1626,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.27.3': resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} @@ -1729,12 +1644,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.27.3': resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} @@ -1753,12 +1662,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.27.3': resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} @@ -1777,12 +1680,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.27.3': resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} @@ -1801,12 +1698,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} @@ -1825,12 +1716,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.27.3': resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} @@ -1849,12 +1734,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.27.3': resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} @@ -1873,12 +1752,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.27.3': resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} @@ -1897,12 +1770,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.27.3': resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} @@ -1921,12 +1788,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.27.3': resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} @@ -1945,12 +1806,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.27.3': resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} @@ -1969,12 +1824,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.27.3': resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} @@ -1993,12 +1842,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.27.3': resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} @@ -2017,12 +1860,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.27.3': resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} @@ -2035,12 +1872,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.27.3': resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} @@ -2059,12 +1890,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} @@ -2077,12 +1902,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.27.3': resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} @@ -2101,12 +1920,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} @@ -2119,12 +1932,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.27.3': resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} @@ -2143,12 +1950,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.27.3': resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} @@ -2167,12 +1968,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.27.3': resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} @@ -2191,12 +1986,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.27.3': resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} @@ -2215,12 +2004,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.27.3': resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} @@ -2273,17 +2056,14 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} -<<<<<<< HEAD '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) -======= - '@hono/node-server@1.19.13': - resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} + + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@hookform/resolvers@3.10.0': resolution: {integrity: sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==} @@ -2830,10 +2610,15 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@next/env@16.1.7': resolution: {integrity: sha512-rJJbIdJB/RQr2F1nylZr/PJzamvNNhfr3brdKP6s/GW850jbtR70QlSfFselvIBbcPUOlQwBakexjFzqLzF6pg==} -<<<<<<< HEAD '@next/env@16.2.2': resolution: {integrity: sha512-LqSGz5+xGk9EL/iBDr2yo/CgNQV6cFsNhRR2xhSXYh7B/hb4nePCxlmDvGEKG30NMHDFf0raqSyOZiQrO7BkHQ==} @@ -2845,24 +2630,10 @@ packages: '@next/swc-darwin-arm64@16.2.2': resolution: {integrity: sha512-B92G3ulrwmkDSEJEp9+XzGLex5wC1knrmCSIylyVeiAtCIfvEJYiN3v5kXPlYt5R4RFlsfO/v++aKV63Acrugg==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-darwin-arm64@16.1.6': - resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.2.0': - resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} -======= - '@next/swc-darwin-arm64@16.2.0': - resolution: {integrity: sha512-/JZsqKzKt01IFoiLLAzlNqys7qk2F3JkcUhj50zuRhKDQkZNOz9E5N6wAQWprXdsvjRP4lTFj+/+36NSv5AwhQ==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - -<<<<<<< HEAD '@next/swc-darwin-x64@16.1.7': resolution: {integrity: sha512-zcnVaaZulS1WL0Ss38R5Q6D2gz7MtBu8GZLPfK+73D/hp4GFMrC2sudLky1QibfV7h6RJBJs/gOFvYP0X7UVlQ==} engines: {node: '>= 10'} @@ -2871,24 +2642,10 @@ packages: '@next/swc-darwin-x64@16.2.2': resolution: {integrity: sha512-7ZwSgNKJNQiwW0CKhNm9B1WS2L1Olc4B2XY0hPYCAL3epFnugMhuw5TMWzMilQ3QCZcCHoYm9NGWTHbr5REFxw==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-darwin-x64@16.1.6': - resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-darwin-x64@16.2.0': - resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} -======= - '@next/swc-darwin-x64@16.2.0': - resolution: {integrity: sha512-/hV8erWq4SNlVgglUiW5UmQ5Hwy5EW/AbbXlJCn6zkfKxTy/E/U3V8U1Ocm2YCTUoFgQdoMxRyRMOW5jYy4ygg==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [darwin] -<<<<<<< HEAD '@next/swc-linux-arm64-gnu@16.1.7': resolution: {integrity: sha512-2ant89Lux/Q3VyC8vNVg7uBaFVP9SwoK2jJOOR0L8TQnX8CAYnh4uctAScy2Hwj2dgjVHqHLORQZJ2wH6VxhSQ==} engines: {node: '>= 10'} @@ -2898,25 +2655,11 @@ packages: '@next/swc-linux-arm64-gnu@16.2.2': resolution: {integrity: sha512-c3m8kBHMziMgo2fICOP/cd/5YlrxDU5YYjAJeQLyFsCqVF8xjOTH/QYG4a2u48CvvZZSj1eHQfBCbyh7kBr30Q==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-arm64-gnu@16.1.6': - resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-gnu@16.2.0': - resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} -======= - '@next/swc-linux-arm64-gnu@16.2.0': - resolution: {integrity: sha512-GkjL/Q7MWOwqWR9zoxu1TIHzkOI2l2BHCf7FzeQG87zPgs+6WDh+oC9Sw9ARuuL/FUk6JNCgKRkA6rEQYadUaw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] -<<<<<<< HEAD '@next/swc-linux-arm64-musl@16.1.7': resolution: {integrity: sha512-uufcze7LYv0FQg9GnNeZ3/whYfo+1Q3HnQpm16o6Uyi0OVzLlk2ZWoY7j07KADZFY8qwDbsmFnMQP3p3+Ftprw==} engines: {node: '>= 10'} @@ -2926,25 +2669,11 @@ packages: '@next/swc-linux-arm64-musl@16.2.2': resolution: {integrity: sha512-VKLuscm0P/mIfzt+SDdn2+8TNNJ7f0qfEkA+az7OqQbjzKdBxAHs0UvuiVoCtbwX+dqMEL9U54b5wQ/aN3dHeg==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-arm64-musl@16.1.6': - resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@16.2.0': - resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} -======= - '@next/swc-linux-arm64-musl@16.2.0': - resolution: {integrity: sha512-1ffhC6KY5qWLg5miMlKJp3dZbXelEfjuXt1qcp5WzSCQy36CV3y+JT7OC1WSFKizGQCDOcQbfkH/IjZP3cdRNA==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] -<<<<<<< HEAD '@next/swc-linux-x64-gnu@16.1.7': resolution: {integrity: sha512-KWVf2gxYvHtvuT+c4MBOGxuse5TD7DsMFYSxVxRBnOzok/xryNeQSjXgxSv9QpIVlaGzEn/pIuI6Koosx8CGWA==} engines: {node: '>= 10'} @@ -2954,25 +2683,11 @@ packages: '@next/swc-linux-x64-gnu@16.2.2': resolution: {integrity: sha512-kU3OPHJq6sBUjOk7wc5zJ7/lipn8yGldMoAv4z67j6ov6Xo/JvzA7L7LCsyzzsXmgLEhk3Qkpwqaq/1+XpNR3g==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-x64-gnu@16.1.6': - resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-gnu@16.2.0': - resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} -======= - '@next/swc-linux-x64-gnu@16.2.0': - resolution: {integrity: sha512-FmbDcZQ8yJRq93EJSL6xaE0KK/Rslraf8fj1uViGxg7K4CKBCRYSubILJPEhjSgZurpcPQq12QNOJQ0DRJl6Hg==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] -<<<<<<< HEAD '@next/swc-linux-x64-musl@16.1.7': resolution: {integrity: sha512-HguhaGwsGr1YAGs68uRKc4aGWxLET+NevJskOcCAwXbwj0fYX0RgZW2gsOCzr9S11CSQPIkxmoSbuVaBp4Z3dA==} engines: {node: '>= 10'} @@ -2982,25 +2697,11 @@ packages: '@next/swc-linux-x64-musl@16.2.2': resolution: {integrity: sha512-CKXRILyErMtUftp+coGcZ38ZwE/Aqq45VMCcRLr2I4OXKrgxIBDXHnBgeX/UMil0S09i2JXaDL3Q+TN8D/cKmg==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-x64-musl@16.1.6': - resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@16.2.0': - resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} -======= - '@next/swc-linux-x64-musl@16.2.0': - resolution: {integrity: sha512-HzjIHVkmGAwRbh/vzvoBWWEbb8BBZPxBvVbDQDvzHSf3D8RP/4vjw7MNLDXFF9Q1WEzeQyEj2zdxBtVAHu5Oyw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] -<<<<<<< HEAD '@next/swc-win32-arm64-msvc@16.1.7': resolution: {integrity: sha512-S0n3KrDJokKTeFyM/vGGGR8+pCmXYrjNTk2ZozOL1C/JFdfUIL9O1ATaJOl5r2POe56iRChbsszrjMAdWSv7kQ==} engines: {node: '>= 10'} @@ -3009,24 +2710,10 @@ packages: '@next/swc-win32-arm64-msvc@16.2.2': resolution: {integrity: sha512-sS/jSk5VUoShUqINJFvNjVT7JfR5ORYj/+/ZpOYbbIohv/lQfduWnGAycq2wlknbOql2xOR0DoV0s6Xfcy49+g==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-win32-arm64-msvc@16.1.6': - resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-arm64-msvc@16.2.0': - resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} -======= - '@next/swc-win32-arm64-msvc@16.2.0': - resolution: {integrity: sha512-UMiFNQf5H7+1ZsZPxEsA064WEuFbRNq/kEXyepbCnSErp4f5iut75dBA8UeerFIG3vDaQNOfCpevnERPp2V+nA==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [arm64] os: [win32] -<<<<<<< HEAD '@next/swc-win32-x64-msvc@16.1.7': resolution: {integrity: sha512-mwgtg8CNZGYm06LeEd+bNnOUfwOyNem/rOiP14Lsz+AnUY92Zq/LXwtebtUiaeVkhbroRCQ0c8GlR4UT1U+0yg==} engines: {node: '>= 10'} @@ -3035,19 +2722,6 @@ packages: '@next/swc-win32-x64-msvc@16.2.2': resolution: {integrity: sha512-aHaKceJgdySReT7qeck5oShucxWRiiEuwCGK8HHALe6yZga8uyFpLkPgaRw3kkF04U7ROogL/suYCNt/+CuXGA==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-win32-x64-msvc@16.1.6': - resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@16.2.0': - resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} -======= - '@next/swc-win32-x64-msvc@16.2.0': - resolution: {integrity: sha512-DRrNJKW+/eimrZgdhVN1uvkN1OI4j6Lpefwr44jKQ0YQzztlmOBUUzHuV5GxOMPK3nmodAYElUVCY8ZXo/IWeA==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3131,8 +2805,8 @@ packages: '@oxc-project/types@0.122.0': resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.127.0': + resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} '@oxfmt/binding-android-arm-eabi@0.43.0': resolution: {integrity: sha512-CgU2s+/9hHZgo0IxVxrbMPrMj+tJ6VM3mD7Mr/4oiz4FNTISLoCvRmB5nk4wAAle045RtRjd86m673jwPyb1OQ==} @@ -4220,6 +3894,13 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@react-email/body@0.2.1': + resolution: {integrity: sha512-ljDiQiJDu/Fq//vSIIP0z5Nuvt4+DX1RqGasstChDGJB/14ogd4VdNS9aacoede/ZjGy3o3Qb+cxyS+XgM6SwQ==} + engines: {node: '>=20.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/body@0.3.0': resolution: {integrity: sha512-uGo0BOOzjbMUo3lu+BIDWayvn5o6Xyfmnlla5VGf05n8gHMvO1ll7U4FtzWe3hxMLwt53pmc4iE0M+B5slG+Ug==} engines: {node: '>=20.0.0'} @@ -4256,6 +3937,13 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/components@1.0.6': + resolution: {integrity: sha512-3GwOeq+5yyiAcwSf7TnHi/HWKn22lXbwxQmkkAviSwZLlhsRVxvmWqRxvUVfQk/HclDUG+62+sGz9qjfb2Uxjw==} + engines: {node: '>=20.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/container@0.0.16': resolution: {integrity: sha512-QWBB56RkkU0AJ9h+qy33gfT5iuZknPC7Un/IjZv9B0QmMIK+WWacc0cH6y2SV5Cv/b99hU94fjEMOOO4enpkbQ==} engines: {node: '>=20.0.0'} @@ -4289,6 +3977,7 @@ packages: '@react-email/html@0.0.12': resolution: {integrity: sha512-KTShZesan+UsreU7PDUV90afrZwU5TLwYlALuCSU0OT+/U8lULNNbAUekg+tGwCnOfIKYtpDPKkAMRdYlqUznw==} engines: {node: '>=20.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -4310,22 +3999,22 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc -<<<<<<< HEAD '@react-email/preview-server@5.2.10': resolution: {integrity: sha512-cYi21KF+Z/HGXT8RpkQMNFFubBafxyoB9Hn/wrslfDNtdoews2MdsDo6XXKkZvDTRG9SxQN3HGk4v4aoQZc20g==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@react-email/preview-server@5.2.8': - resolution: {integrity: sha512-drQ0C7vi7P0uE7Ox1Cyiujsx0oqp2RbIscOdSBR5qvzw3EKjlGbW2pWjQ000cjxTq3Si7lqlRKhOIF8MzOnqHw==} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@react-email/preview@0.0.14': resolution: {integrity: sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw==} engines: {node: '>=20.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/render@2.0.4': + resolution: {integrity: sha512-kht2oTFQ1SwrLpd882ahTvUtNa9s53CERHstiTbzhm6aR2Hbykp/mQ4tpPvsBGkKAEvKRlDEoooh60Uk6nHK1g==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/render@2.0.5': resolution: {integrity: sha512-oAsSpY/vYt9ReDcRQDBLxENwCNAklkE6bvP5Kl9ZlmVr/RZpfhloJp8xc/OZki/YF2nisRRX50aEy8P9v3R5GA==} engines: {node: '>=20.0.0'} @@ -4345,6 +4034,45 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-email/tailwind@2.0.3': + resolution: {integrity: sha512-URXb/T2WS4RlNGM5QwekYnivuiVUcU87H0y5sqLl6/Oi3bMmgL0Bmw/W9GeJylC+876Vw+E6NkE0uRiUFIQwGg==} + engines: {node: '>=20.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@react-email/body': 0.2.1 + '@react-email/button': 0.2.1 + '@react-email/code-block': 0.2.1 + '@react-email/code-inline': 0.0.6 + '@react-email/container': 0.0.16 + '@react-email/heading': 0.0.16 + '@react-email/hr': 0.0.12 + '@react-email/img': 0.0.12 + '@react-email/link': 0.0.13 + '@react-email/preview': 0.0.14 + '@react-email/text': 0.1.6 + react: ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@react-email/body': + optional: true + '@react-email/button': + optional: true + '@react-email/code-block': + optional: true + '@react-email/code-inline': + optional: true + '@react-email/container': + optional: true + '@react-email/heading': + optional: true + '@react-email/hr': + optional: true + '@react-email/img': + optional: true + '@react-email/link': + optional: true + '@react-email/preview': + optional: true + '@react-email/tailwind@2.0.7': resolution: {integrity: sha512-kGw80weVFXikcnCXbigTGXGWQ0MRCSYNCudcdkWxebkWYd0FG6/NPoN3V1p/u68/4+NxZwYPVi2fhnp0x23HdA==} engines: {node: '>=20.0.0'} @@ -4421,36 +4149,72 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.12': resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + resolution: {integrity: sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + resolution: {integrity: sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + resolution: {integrity: sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] -<<<<<<< HEAD + libc: [glibc] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': @@ -4460,6 +4224,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4467,6 +4238,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4474,79 +4252,40 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] + cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] + libc: [glibc] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': + resolution: {integrity: sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} -======= - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': + resolution: {integrity: sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} @@ -4554,29 +4293,51 @@ packages: cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': + resolution: {integrity: sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + resolution: {integrity: sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + resolution: {integrity: sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.12': resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + '@rolldown/pluginutils@1.0.0-rc.17': + resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} @@ -5083,7 +4844,6 @@ packages: resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} -<<<<<<< HEAD '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -5093,16 +4853,6 @@ packages: '@speed-highlight/core@1.2.15': resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@speed-highlight/core@1.2.14': - resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} -======= - '@speed-highlight/core@1.2.14': - resolution: {integrity: sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@stablelib/base64@1.0.1': resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} @@ -5255,57 +5005,8 @@ packages: '@tanstack/virtual-core@3.13.23': resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} -<<<<<<< HEAD '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} -======= - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/react@16.3.2': - resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -5325,6 +5026,9 @@ packages: '@types/codemirror@5.60.17': resolution: {integrity: sha512-AZq2FIsUHVMlp7VSe2hTfl5w4pcUkoFkM3zVsRKsn1ca8CXRDYvnin04+HP2REkwsxemuHqvDofdlhUWNpbwfw==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -5456,17 +5160,14 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} -<<<<<<< HEAD + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} '@types/markdown-it@14.1.2': resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) -======= - '@types/jsesc@2.5.1': - resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@types/marked@4.3.2': resolution: {integrity: sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==} @@ -5517,6 +5218,9 @@ packages: peerDependencies: '@types/react': '*' + '@types/react@19.2.10': + resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + '@types/react@19.2.14': resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} @@ -5673,31 +5377,13 @@ packages: xstate: optional: true -<<<<<<< HEAD - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) '@zone-eu/mailsplit@5.4.8': resolution: {integrity: sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} -======= - '@zone-eu/mailsplit@5.4.8': - resolution: {integrity: sha512-eEyACj4JZ7sjzRvy26QhLgKEMWwQbsw1+QZnlLX+/gihcNH07lVPOcnwf5U6UAL7gkc//J3jVd76o/WS+taUiA==} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -5728,6 +5414,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -5888,6 +5582,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -5929,45 +5627,15 @@ packages: bare-url@2.4.0: resolution: {integrity: sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==} -<<<<<<< HEAD - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - baseline-browser-mapping@2.10.14: - resolution: {integrity: sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) base64id@2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.10.8: - resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} -======= - baseline-browser-mapping@2.10.8: - resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + baseline-browser-mapping@2.10.14: + resolution: {integrity: sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==} engines: {node: '>=6.0.0'} hasBin: true -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} - hasBin: true - - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} - engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade - -======= - basic-ftp@5.1.0: - resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} - engines: {node: '>=10.0.0'} - deprecated: Security vulnerability fixed in 5.2.0, please upgrade - ->>>>>>> 67b9f0bf (refactor: migrate to external email service) bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} @@ -5984,19 +5652,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - -======= birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - ->>>>>>> 67b9f0bf (refactor: migrate to external email service) blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -6010,6 +5668,10 @@ packages: brace-expansion@2.0.3: resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} + brace-expansion@5.0.5: + resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -6065,19 +5727,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} -<<<<<<< HEAD caniuse-lite@1.0.30001785: resolution: {integrity: sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - caniuse-lite@1.0.30001767: - resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} - - caniuse-lite@1.0.30001780: - resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} -======= - caniuse-lite@1.0.30001780: - resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -6145,6 +5796,9 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -6226,6 +5880,10 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -6248,61 +5906,23 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} -<<<<<<< HEAD conf@15.1.0: resolution: {integrity: sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og==} engines: {node: '>=20'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - conf@15.0.2: - resolution: {integrity: sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==} - engines: {node: '>=20'} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} -<<<<<<< HEAD confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - confbox@0.2.2: - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} -<<<<<<< HEAD - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} - - configstore@7.1.0: - resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} - engines: {node: '>=18'} - consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} -======= - configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} - - configstore@7.1.0: - resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} - engines: {node: '>=18'} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - console-table-printer@2.15.0: resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} @@ -6315,6 +5935,10 @@ packages: cookie-es@1.2.2: resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} @@ -6328,6 +5952,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -6574,9 +6202,17 @@ packages: dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + debounce@2.2.0: + resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} + engines: {node: '>=18'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -6626,6 +6262,9 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} @@ -6691,33 +6330,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} -<<<<<<< HEAD - dot-prop@10.1.0: - resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} - engines: {node: '>=20'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) dot-prop@10.1.0: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - - dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} - -======= - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - - dot-prop@9.0.0: - resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} - engines: {node: '>=18'} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - dotenv-cli@11.0.0: resolution: {integrity: sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==} hasBin: true @@ -6887,21 +6503,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} -<<<<<<< HEAD - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} - engines: {node: '>=14'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encoding-japanese@2.2.0: - resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} - engines: {node: '>=8.10.0'} -======= - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} @@ -6909,12 +6510,10 @@ packages: encoding-japanese@2.2.0: resolution: {integrity: sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A==} engines: {node: '>=8.10.0'} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} -<<<<<<< HEAD engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} @@ -6925,21 +6524,6 @@ packages: enhanced-resolve@5.20.1: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@6.6.5: - resolution: {integrity: sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==} - engines: {node: '>=10.2.0'} - - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} -======= - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=10.13.0'} entities@4.5.0: @@ -6950,6 +6534,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -6991,11 +6579,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.27.3: resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} @@ -7092,6 +6675,9 @@ packages: expressive-code@0.41.7: resolution: {integrity: sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -7291,9 +6877,6 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - get-tsconfig@4.13.7: resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} @@ -7312,20 +6895,10 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} -<<<<<<< HEAD globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - glob@11.1.0: - resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} - engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -7461,24 +7034,16 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} -<<<<<<< HEAD - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} - engines: {node: ^20.17.0 || >=22.9.0} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} -======= - hono@4.12.12: - resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} + hono@4.12.15: + resolution: {integrity: sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==} engines: {node: '>=16.9.0'} - hookable@6.1.0: - resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} hotscript@1.0.13: resolution: {integrity: sha512-C++tTF1GqkGYecL+2S1wJTfoH6APGAsbb7PAWQ3iVIwgG/EFseAfEVOKFgAFq4yK3+6j1EjUD4UQ9dRJHX/sSQ==} @@ -7546,6 +7111,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} @@ -7567,22 +7136,10 @@ packages: import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - -======= - import-without-cache@0.2.5: - resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + import-without-cache@0.3.3: + resolution: {integrity: sha512-bDxwDdF04gm550DfZHgffvlX+9kUlcz32UD0AeBTmVPFiWkrexF2XVmiuFFbDhiFuP8fQkrkvI2KdSNPYWAXkQ==} engines: {node: '>=20.19.0'} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - ->>>>>>> 67b9f0bf (refactor: migrate to external email service) indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} @@ -7720,6 +7277,10 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} @@ -7753,28 +7314,19 @@ packages: resolution: {integrity: sha512-nZmoK4wKdzPs5USq4JHBiimjdKSVAOm2T1KyDoadtMPNXYHxiENd19ou4iU/V4juFM6LVgYQnpxCYmxqNP4Obw==} engines: {node: '>=18'} -<<<<<<< HEAD isomorphic-dompurify@2.36.0: resolution: {integrity: sha512-E8YkGyPY3a/U5s0WOoc8Ok+3SWL/33yn2IHCoxCFLBUUPVy9WGa++akJZFxQCcJIhI+UvYhbrbnTIFQkHKZbgA==} engines: {node: '>=20.19.5'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - -======= - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} hasBin: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -7841,6 +7393,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify@1.3.0: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} @@ -7914,6 +7469,15 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + libbase64@1.3.0: + resolution: {integrity: sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==} + + libmime@5.3.7: + resolution: {integrity: sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw==} + + libqp@2.1.1: + resolution: {integrity: sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -8031,6 +7595,10 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-symbols@7.0.1: resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} @@ -8063,6 +7631,9 @@ packages: magicast@0.5.2: resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + mailparser@3.9.1: + resolution: {integrity: sha512-6vHZcco3fWsDMkf4Vz9iAfxvwrKNGbHx0dV1RKVphQ/zaNY34Buc7D37LSa09jeSeybWzYcTPjhiZFxzVRJedA==} + make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -8340,6 +7911,10 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@5.1.9: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} @@ -8413,6 +7988,10 @@ packages: engines: {node: ^18 || >=20} hasBin: true + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + neotraverse@0.6.18: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} @@ -8423,7 +8002,6 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc -<<<<<<< HEAD next@16.1.7: resolution: {integrity: sha512-WM0L7WrSvKwoLegLYr6V+mz+RIofqQgVAfHhMp9a88ms0cFX8iX9ew+snpWlSBwpkURJOUdvCEt3uLl3NNzvWg==} engines: {node: '>=20.9.0'} @@ -8447,34 +8025,6 @@ packages: next@16.2.2: resolution: {integrity: sha512-i6AJdyVa4oQjyvX/6GeER8dpY/xlIV+4NMv/svykcLtURJSy/WzDnnUk/TM4d0uewFHK7xSQz4TbIwPgjky+3A==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - next@16.1.6: - resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} - engines: {node: '>=20.9.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - next@16.2.0: - resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} -======= - next@16.2.0: - resolution: {integrity: sha512-NLBVrJy1pbV1Yn00L5sU4vFyAHt5XuSjzrNyFnxo6Com0M0KrL6hHM5B99dbqXb2bE9pm4Ow3Zl1xp6HVY9edQ==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=20.9.0'} hasBin: true peerDependencies: @@ -8519,6 +8069,10 @@ packages: node-releases@2.0.37: resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} + nodemailer@7.0.11: + resolution: {integrity: sha512-gnXhNRE0FNhD7wPSCGhdNh46Hs6nm+uTyg+Kq0cZukNQiYdnCsoQjodNP9BQVG9XrcK/v6/MgpAPBUFyzh9pvw==} + engines: {node: '>=6.0.0'} + normalize-package-data@8.0.0: resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -8540,6 +8094,11 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -8588,6 +8147,10 @@ packages: resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} engines: {node: '>=20'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + ora@9.3.0: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} @@ -8720,17 +8283,9 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} -<<<<<<< HEAD path-strip-sep@1.0.21: resolution: {integrity: sha512-V5Lvyhx0fE6/wEk/YseTtoRQIaD32cepnzrQ1b3kOzOxxDoSglry8IZ1b6LPObIeIbpC0+i9ygUsBNhkOttQKw==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -8798,10 +8353,6 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} - pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -8821,6 +8372,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + player.style@0.1.10: resolution: {integrity: sha512-Jxv7tlaQ3SFCddsN35jzoGnCHB3/xMTbJOgn4zcsmF0lcZvRPq5UkRRAD5tZm8CvzKndUvtoDlG6GSPL/N/SrA==} @@ -9036,20 +8590,11 @@ packages: peerDependencies: react: '>= 16.8' -<<<<<<< HEAD react-email@5.2.10: resolution: {integrity: sha512-Ys8yR5/a0nXf5u2GlT2UV93PJHC3ZnuMnNebEn7I5UE9XfMFPtlpgDs02mPJOJn49fhJjDTWIUlZD1vmQPDgJg==} engines: {node: '>=20.0.0'} hasBin: true -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - react-email@5.2.5: - resolution: {integrity: sha512-YaCp5n/0czviN4lFndsYongiI0IJOMFtFoRVIPJc9+WPJejJEvzJO94r31p3Cz9swDuV0RhEhH1W0lJFAXntHA==} - engines: {node: '>=20.0.0'} - hasBin: true - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) react-fast-compare@3.2.2: resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} @@ -9387,6 +8932,15 @@ packages: '@react-email/render': optional: true + resend@6.9.1: + resolution: {integrity: sha512-jFY3qPP2cith1npRXvS7PVdnhbR1CcuzHg65ty5Elv55GKiXhe+nItXuzzoOlKeYJez1iJAo2+8f6ae8sCj0iA==} + engines: {node: '>=20'} + peerDependencies: + '@react-email/render': '*' + peerDependenciesMeta: + '@react-email/render': + optional: true + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -9422,21 +8976,6 @@ packages: robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} -<<<<<<< HEAD - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} - engines: {node: ^20.19.0 || >=22.12.0} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - rollup@4.56.0: - resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} -======= - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rolldown-plugin-dts@0.23.2: resolution: {integrity: sha512-PbSqLawLgZBGcOGT3yqWBGn4cX+wh2nt5FuBGdcMHyOhoukmjbhYAl8NT9sE4U38Cm9tqLOIQeOrvzeayM0DLQ==} engines: {node: '>=20.19.0'} @@ -9461,10 +9000,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.56.0: - resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + rolldown@1.0.0-rc.17: + resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true rollup@4.57.1: @@ -9657,7 +9195,6 @@ packages: resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} -<<<<<<< HEAD socket.io-adapter@2.5.6: resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} @@ -9669,20 +9206,6 @@ packages: resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} engines: {node: '>=10.2.0'} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - socket.io-adapter@2.5.6: - resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} - - socket.io-parser@4.2.5: - resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} - engines: {node: '>=10.0.0'} - - socket.io@4.8.3: - resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} - engines: {node: '>=10.2.0'} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) sonner@2.0.7: resolution: {integrity: sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==} peerDependencies: @@ -9743,6 +9266,10 @@ packages: std-env@4.0.0: resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stdin-discarder@0.3.1: resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} engines: {node: '>=18'} @@ -9864,30 +9391,21 @@ packages: engines: {node: '>=16'} hasBin: true + svix@1.84.1: + resolution: {integrity: sha512-K8DPPSZaW/XqXiz1kEyzSHYgmGLnhB43nQCMeKjWGCUpLIpAMMM8kx3rVVOSm6Bo6EHyK1RQLPT4R06skM/MlQ==} + svix@1.88.0: resolution: {integrity: sha512-vm/JrrUd3bVyBE+3L33TIyVSs8gS5fYx7lrISvKlDJXTYX1ACH4REX8P1tHxsSKoZi/rvifM1t0XRc5Vc45THw==} symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} -<<<<<<< HEAD tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} tailwind-merge@3.5.0: resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - tagged-tag@1.0.0: - resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} - engines: {node: '>=20'} - - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} -======= - tailwind-merge@3.4.0: - resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} @@ -9954,6 +9472,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} @@ -9962,6 +9484,10 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + tlds@1.261.0: + resolution: {integrity: sha512-QXqwfEl9ddlGBaRFXIvNKK6OhipSiLXuRuLJX5DErz0o0Q0rYxulWLdFryTkV5PkdZct5iMInwYEGe/eR++1AA==} + hasBin: true + tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} @@ -10041,14 +9567,14 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tsdown@0.21.7: - resolution: {integrity: sha512-ukKIxKQzngkWvOYJAyptudclkm4VQqbjq+9HF5K5qDO8GJsYtMh8gIRwicbnZEnvFPr6mquFwYAVZ8JKt3rY2g==} + tsdown@0.21.10: + resolution: {integrity: sha512-3wk73yBhZe/wX7REqSdivNQ84TDs1mJ+IlnzrrEREP70xlJ/AEIzqaI04l/TzMKVIdkTdC3CPaADn2Lk/0SkdA==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.21.7 - '@tsdown/exe': 0.21.7 + '@tsdown/css': 0.21.10 + '@tsdown/exe': 0.21.10 '@vitejs/devtools': '*' publint: ^0.3.0 typescript: ^5.0.0 || ^6.0.0 @@ -10133,24 +9659,12 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} -<<<<<<< HEAD type-fest@5.5.0: resolution: {integrity: sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==} engines: {node: '>=20'} typedarray-dts@1.0.0: resolution: {integrity: sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - type-fest@5.4.1: - resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} - engines: {node: '>=20'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} -======= - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) typeid-js@0.3.0: resolution: {integrity: sha512-A1EmvIWG6xwYRfHuYUjPltHqteZ1EiDG+HOmbIYXeHUVztmnGrPIfU9KIK1QC30x59ko0r4JsMlwzsALCyiB3Q==} @@ -10178,6 +9692,10 @@ packages: ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -10280,8 +9798,8 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} - unrun@0.2.34: - resolution: {integrity: sha512-LyaghRBR++r7svhDK6tnDz2XaYHWdneBOA0jbS8wnRsHerI9MFljX4fIiTgbbNbEVzZ0C9P1OjWLLe1OqoaaEw==} + unrun@0.2.37: + resolution: {integrity: sha512-AA7vDuYsgeSYVzJMm16UKA+aXFKhy7nFqW9z5l7q44K4ppFWZAMqYS58ePRZbugMLPH0fwwMzD5A8nP0avxwZQ==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -10430,6 +9948,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true uuidv7@0.4.4: @@ -10439,6 +9958,10 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -10804,7 +10327,6 @@ packages: utf-8-validate: optional: true -<<<<<<< HEAD ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -10819,25 +10341,6 @@ packages: ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - 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 - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} -======= - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -11446,18 +10949,10 @@ snapshots: '@babel/template': 7.28.6 '@babel/types': 7.29.0 -<<<<<<< HEAD '@babel/parser@7.27.0': dependencies: '@babel/types': 7.29.0 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@babel/parser@7.28.6': - dependencies: - '@babel/types': 7.29.0 - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 @@ -12039,12 +11534,11 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 -<<<<<<< HEAD '@babel/traverse@7.27.0': dependencies: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 - '@babel/parser': 7.27.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3(supports-color@8.1.1) @@ -12052,21 +11546,6 @@ snapshots: transitivePeerDependencies: - supports-color -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@babel/traverse@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 @@ -12344,18 +11823,18 @@ snapshots: '@emmetio/stream-reader@2.2.0': {} - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.1': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -12441,24 +11920,11 @@ snapshots: '@esbuild-kit/esm-loader@2.6.5': dependencies: '@esbuild-kit/core-utils': 3.3.2 -<<<<<<< HEAD get-tsconfig: 4.13.7 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - get-tsconfig: 4.13.0 - - '@esbuild/aix-ppc64@0.25.10': - optional: true - -======= - get-tsconfig: 4.13.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/aix-ppc64@0.27.2': - optional: true - '@esbuild/aix-ppc64@0.27.3': optional: true @@ -12468,9 +11934,6 @@ snapshots: '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm64@0.27.2': - optional: true - '@esbuild/android-arm64@0.27.3': optional: true @@ -12480,9 +11943,6 @@ snapshots: '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-arm@0.27.2': - optional: true - '@esbuild/android-arm@0.27.3': optional: true @@ -12492,9 +11952,6 @@ snapshots: '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/android-x64@0.27.2': - optional: true - '@esbuild/android-x64@0.27.3': optional: true @@ -12504,9 +11961,6 @@ snapshots: '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.27.2': - optional: true - '@esbuild/darwin-arm64@0.27.3': optional: true @@ -12516,9 +11970,6 @@ snapshots: '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/darwin-x64@0.27.2': - optional: true - '@esbuild/darwin-x64@0.27.3': optional: true @@ -12528,9 +11979,6 @@ snapshots: '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.27.2': - optional: true - '@esbuild/freebsd-arm64@0.27.3': optional: true @@ -12540,9 +11988,6 @@ snapshots: '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.27.2': - optional: true - '@esbuild/freebsd-x64@0.27.3': optional: true @@ -12552,9 +11997,6 @@ snapshots: '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm64@0.27.2': - optional: true - '@esbuild/linux-arm64@0.27.3': optional: true @@ -12564,9 +12006,6 @@ snapshots: '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-arm@0.27.2': - optional: true - '@esbuild/linux-arm@0.27.3': optional: true @@ -12576,9 +12015,6 @@ snapshots: '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-ia32@0.27.2': - optional: true - '@esbuild/linux-ia32@0.27.3': optional: true @@ -12588,9 +12024,6 @@ snapshots: '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-loong64@0.27.2': - optional: true - '@esbuild/linux-loong64@0.27.3': optional: true @@ -12600,9 +12033,6 @@ snapshots: '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-mips64el@0.27.2': - optional: true - '@esbuild/linux-mips64el@0.27.3': optional: true @@ -12612,9 +12042,6 @@ snapshots: '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-ppc64@0.27.2': - optional: true - '@esbuild/linux-ppc64@0.27.3': optional: true @@ -12624,9 +12051,6 @@ snapshots: '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.27.2': - optional: true - '@esbuild/linux-riscv64@0.27.3': optional: true @@ -12636,9 +12060,6 @@ snapshots: '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-s390x@0.27.2': - optional: true - '@esbuild/linux-s390x@0.27.3': optional: true @@ -12648,18 +12069,12 @@ snapshots: '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/linux-x64@0.27.2': - optional: true - '@esbuild/linux-x64@0.27.3': optional: true '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.27.2': - optional: true - '@esbuild/netbsd-arm64@0.27.3': optional: true @@ -12669,18 +12084,12 @@ snapshots: '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.27.2': - optional: true - '@esbuild/netbsd-x64@0.27.3': optional: true '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.27.2': - optional: true - '@esbuild/openbsd-arm64@0.27.3': optional: true @@ -12690,18 +12099,12 @@ snapshots: '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.27.2': - optional: true - '@esbuild/openbsd-x64@0.27.3': optional: true '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.27.2': - optional: true - '@esbuild/openharmony-arm64@0.27.3': optional: true @@ -12711,9 +12114,6 @@ snapshots: '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/sunos-x64@0.27.2': - optional: true - '@esbuild/sunos-x64@0.27.3': optional: true @@ -12723,9 +12123,6 @@ snapshots: '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-arm64@0.27.2': - optional: true - '@esbuild/win32-arm64@0.27.3': optional: true @@ -12735,9 +12132,6 @@ snapshots: '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-ia32@0.27.2': - optional: true - '@esbuild/win32-ia32@0.27.3': optional: true @@ -12747,9 +12141,6 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@esbuild/win32-x64@0.27.2': - optional: true - '@esbuild/win32-x64@0.27.3': optional: true @@ -12810,21 +12201,11 @@ snapshots: '@floating-ui/utils@0.2.10': {} -<<<<<<< HEAD '@floating-ui/utils@0.2.11': {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@hookform/resolvers@3.10.0(react-hook-form@7.71.1(react@19.2.4))': - dependencies: - react-hook-form: 7.71.1(react@19.2.4) -======= - '@hono/node-server@1.19.13(hono@4.12.12)': - dependencies: - hono: 4.12.12 - '@hookform/resolvers@3.10.0(react-hook-form@7.71.1(react@19.2.4))': + '@hono/node-server@1.19.14(hono@4.12.15)': dependencies: - react-hook-form: 7.71.1(react@19.2.4) ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + hono: 4.12.15 '@hookform/resolvers@3.10.0(react-hook-form@7.72.1(react@19.2.4))': dependencies: @@ -13330,145 +12711,67 @@ snapshots: hls.js: 1.6.15 mux-embed: 5.17.10 -<<<<<<< HEAD - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.1.7': {} - - '@next/env@16.2.2': {} - - '@next/swc-darwin-arm64@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/env@16.1.6': {} - - '@next/env@16.2.0': {} - - '@next/swc-darwin-arm64@16.1.6': - optional: true - - '@next/swc-darwin-arm64@16.2.0': -======= - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@16.2.0': {} + '@next/env@16.1.7': {} + + '@next/env@16.2.2': {} - '@next/swc-darwin-arm64@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + '@next/swc-darwin-arm64@16.1.7': optional: true -<<<<<<< HEAD '@next/swc-darwin-arm64@16.2.2': optional: true '@next/swc-darwin-x64@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-darwin-x64@16.1.6': optional: true - '@next/swc-darwin-x64@16.2.0': -======= - '@next/swc-darwin-x64@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - optional: true - -<<<<<<< HEAD '@next/swc-darwin-x64@16.2.2': optional: true '@next/swc-linux-arm64-gnu@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-arm64-gnu@16.1.6': - optional: true - - '@next/swc-linux-arm64-gnu@16.2.0': -======= - '@next/swc-linux-arm64-gnu@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true -<<<<<<< HEAD '@next/swc-linux-arm64-gnu@16.2.2': optional: true '@next/swc-linux-arm64-musl@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-arm64-musl@16.1.6': optional: true - '@next/swc-linux-arm64-musl@16.2.0': -======= - '@next/swc-linux-arm64-musl@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - optional: true - -<<<<<<< HEAD '@next/swc-linux-arm64-musl@16.2.2': optional: true '@next/swc-linux-x64-gnu@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-x64-gnu@16.1.6': - optional: true - - '@next/swc-linux-x64-gnu@16.2.0': -======= - '@next/swc-linux-x64-gnu@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true -<<<<<<< HEAD '@next/swc-linux-x64-gnu@16.2.2': optional: true '@next/swc-linux-x64-musl@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-linux-x64-musl@16.1.6': optional: true - '@next/swc-linux-x64-musl@16.2.0': -======= - '@next/swc-linux-x64-musl@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - optional: true - -<<<<<<< HEAD '@next/swc-linux-x64-musl@16.2.2': optional: true '@next/swc-win32-arm64-msvc@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-win32-arm64-msvc@16.1.6': - optional: true - - '@next/swc-win32-arm64-msvc@16.2.0': -======= - '@next/swc-win32-arm64-msvc@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true -<<<<<<< HEAD '@next/swc-win32-arm64-msvc@16.2.2': optional: true '@next/swc-win32-x64-msvc@16.1.7': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@next/swc-win32-x64-msvc@16.1.6': - optional: true - - '@next/swc-win32-x64-msvc@16.2.0': -======= - '@next/swc-win32-x64-msvc@16.2.0': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) optional: true '@next/swc-win32-x64-msvc@16.2.2': @@ -13580,7 +12883,7 @@ snapshots: '@oxc-project/types@0.122.0': {} - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.127.0': {} '@oxfmt/binding-android-arm-eabi@0.43.0': optional: true @@ -14606,6 +13909,10 @@ snapshots: '@radix-ui/rect@1.1.1': {} + '@react-email/body@0.2.1(react@19.2.4)': + dependencies: + react: 19.2.4 + '@react-email/body@0.3.0(react@19.2.4)': dependencies: react: 19.2.4 @@ -14653,6 +13960,32 @@ snapshots: transitivePeerDependencies: - react-dom + '@react-email/components@1.0.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-email/body': 0.2.1(react@19.2.4) + '@react-email/button': 0.2.1(react@19.2.4) + '@react-email/code-block': 0.2.1(react@19.2.4) + '@react-email/code-inline': 0.0.6(react@19.2.4) + '@react-email/column': 0.0.14(react@19.2.4) + '@react-email/container': 0.0.16(react@19.2.4) + '@react-email/font': 0.0.10(react@19.2.4) + '@react-email/head': 0.0.13(react@19.2.4) + '@react-email/heading': 0.0.16(react@19.2.4) + '@react-email/hr': 0.0.12(react@19.2.4) + '@react-email/html': 0.0.12(react@19.2.4) + '@react-email/img': 0.0.12(react@19.2.4) + '@react-email/link': 0.0.13(react@19.2.4) + '@react-email/markdown': 0.0.18(react@19.2.4) + '@react-email/preview': 0.0.14(react@19.2.4) + '@react-email/render': 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@react-email/row': 0.0.13(react@19.2.4) + '@react-email/section': 0.0.17(react@19.2.4) + '@react-email/tailwind': 2.0.3(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4) + '@react-email/text': 0.1.6(react@19.2.4) + react: 19.2.4 + transitivePeerDependencies: + - react-dom + '@react-email/container@0.0.16(react@19.2.4)': dependencies: react: 19.2.4 @@ -14690,7 +14023,6 @@ snapshots: marked: 15.0.12 react: 19.2.4 -<<<<<<< HEAD '@react-email/preview-server@5.2.10(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: esbuild: 0.27.3 @@ -14705,26 +14037,16 @@ snapshots: - react-dom - sass -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@react-email/preview-server@5.2.8(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@react-email/preview@0.0.14(react@19.2.4)': dependencies: - esbuild: 0.25.10 - next: 16.1.6(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - transitivePeerDependencies: - - '@babel/core' - - '@opentelemetry/api' - - '@playwright/test' - - babel-plugin-macros - - babel-plugin-react-compiler - - react - - react-dom - - sass + react: 19.2.4 -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - '@react-email/preview@0.0.14(react@19.2.4)': + '@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: + html-to-text: 9.0.5 + prettier: 3.8.1 react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) '@react-email/render@2.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: @@ -14741,6 +14063,23 @@ snapshots: dependencies: react: 19.2.4 + '@react-email/tailwind@2.0.3(@react-email/body@0.2.1(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)': + dependencies: + '@react-email/text': 0.1.6(react@19.2.4) + react: 19.2.4 + tailwindcss: 4.2.2 + optionalDependencies: + '@react-email/body': 0.2.1(react@19.2.4) + '@react-email/button': 0.2.1(react@19.2.4) + '@react-email/code-block': 0.2.1(react@19.2.4) + '@react-email/code-inline': 0.0.6(react@19.2.4) + '@react-email/container': 0.0.16(react@19.2.4) + '@react-email/heading': 0.0.16(react@19.2.4) + '@react-email/hr': 0.0.12(react@19.2.4) + '@react-email/img': 0.0.12(react@19.2.4) + '@react-email/link': 0.0.13(react@19.2.4) + '@react-email/preview': 0.0.14(react@19.2.4) + '@react-email/tailwind@2.0.7(@react-email/body@0.3.0(react@19.2.4))(@react-email/button@0.2.1(react@19.2.4))(@react-email/code-block@0.2.1(react@19.2.4))(@react-email/code-inline@0.0.6(react@19.2.4))(@react-email/container@0.0.16(react@19.2.4))(@react-email/heading@0.0.16(react@19.2.4))(@react-email/hr@0.0.12(react@19.2.4))(@react-email/img@0.0.12(react@19.2.4))(@react-email/link@0.0.13(react@19.2.4))(@react-email/preview@0.0.14(react@19.2.4))(@react-email/text@0.1.6(react@19.2.4))(react@19.2.4)': dependencies: '@react-email/text': 0.1.6(react@19.2.4) @@ -14790,76 +14129,105 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-rc.12': optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.17': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.12': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.17': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.12': optional: true + '@rolldown/binding-darwin-x64@1.0.0-rc.17': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.12': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': optional: true + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': optional: true + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': optional: true -<<<<<<< HEAD - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/pluginutils@1.0.0-rc.12': {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@rolldown/pluginutils@1.0.0-rc.2': {} -======= - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-rc.17': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': + optional: true + '@rolldown/pluginutils@1.0.0-rc.12': {} - '@rolldown/pluginutils@1.0.0-rc.2': {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + '@rolldown/pluginutils@1.0.0-rc.17': {} '@rolldown/pluginutils@1.0.0-rc.3': {} @@ -15661,19 +15029,11 @@ snapshots: '@sindresorhus/is@7.2.0': {} -<<<<<<< HEAD '@sindresorhus/merge-streams@4.0.0': {} '@socket.io/component-emitter@3.1.2': {} '@speed-highlight/core@1.2.15': {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@socket.io/component-emitter@3.1.2': {} - - '@speed-highlight/core@1.2.14': {} -======= - '@speed-highlight/core@1.2.14': {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@stablelib/base64@1.0.1': {} @@ -15796,60 +15156,11 @@ snapshots: '@tanstack/virtual-core@3.13.23': {} - '@tybys/wasm-util@0.10.1': - dependencies: -<<<<<<< HEAD - tslib: 2.8.1 - optional: true -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@babel/runtime': 7.28.6 - '@testing-library/dom': 10.4.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - - '@types/aria-query@5.0.4': {} -======= - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@babel/runtime': 7.28.6 - '@testing-library/dom': 10.4.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.10 - '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true - '@types/aria-query@5.0.4': {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.2 @@ -15880,6 +15191,10 @@ snapshots: dependencies: '@types/tern': 0.23.9 + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.19.7 + '@types/d3-array@3.2.2': {} '@types/d3-axis@3.0.6': @@ -16027,36 +15342,21 @@ snapshots: dependencies: '@types/unist': 3.0.3 -<<<<<<< HEAD '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.14)': -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.9)': -======= - '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.10)': ->>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: -<<<<<<< HEAD '@types/react': 19.2.14 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@types/react': 19.2.9 -======= - '@types/react': 19.2.10 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) hoist-non-react-statics: 3.3.2 '@types/js-yaml@4.0.9': {} -<<<<<<< HEAD + '@types/jsesc@2.5.1': {} + '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': dependencies: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) -======= - '@types/jsesc@2.5.1': {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) '@types/marked@4.3.2': {} @@ -16099,6 +15399,10 @@ snapshots: '@types/prismjs@1.26.6': {} + '@types/react-dom@19.2.3(@types/react@19.2.10)': + dependencies: + '@types/react': 19.2.10 + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: '@types/react': 19.2.14 @@ -16107,6 +15411,10 @@ snapshots: dependencies: '@types/react': 19.2.14 + '@types/react@19.2.10': + dependencies: + csstype: 3.2.3 + '@types/react@19.2.14': dependencies: csstype: 3.2.3 @@ -16117,16 +15425,8 @@ snapshots: '@types/styled-components@5.1.36': dependencies: -<<<<<<< HEAD '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.14) '@types/react': 19.2.14 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.9) - '@types/react': 19.2.9 -======= - '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.10) - '@types/react': 19.2.10 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) csstype: 3.2.3 '@types/stylis@4.2.7': {} @@ -16208,10 +15508,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(babel-plugin-react-compiler@1.0.0)(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) optionalDependencies: babel-plugin-react-compiler: 1.0.0 @@ -16224,13 +15524,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@4.1.2': dependencies: @@ -16316,43 +15616,18 @@ snapshots: transitivePeerDependencies: - '@types/react' -<<<<<<< HEAD - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@8.16.0): -||||||| parent of 67b9f0bf (refactor: migrate to external email service) '@zone-eu/mailsplit@5.4.8': dependencies: libbase64: 1.3.0 libmime: 5.3.7 libqp: 2.1.1 - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - accepts@1.3.8: dependencies: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.15.0): -======= - '@zone-eu/mailsplit@5.4.8': - dependencies: - libbase64: 1.3.0 - libmime: 5.3.7 - libqp: 2.1.1 - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - acorn-jsx@5.3.2(acorn@8.15.0): ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -16370,6 +15645,10 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 @@ -16405,69 +15684,6 @@ snapshots: dependencies: normalize-path: 3.0.0 picomatch: 2.3.2 -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - picomatch: 2.3.1 - - archiver-utils@5.0.2: - dependencies: - glob: 10.5.0 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.17.23 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.7.0 - readdir-glob: 1.1.3 - tar-stream: 3.1.7 - zip-stream: 6.0.1 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - arctic@3.7.0: - dependencies: - '@oslojs/crypto': 1.0.1 - '@oslojs/encoding': 1.1.0 - '@oslojs/jwt': 0.2.0 -======= - - archiver-utils@5.0.2: - dependencies: - glob: 10.5.0 - graceful-fs: 4.2.11 - is-stream: 2.0.1 - lazystream: 1.0.1 - lodash: 4.17.23 - normalize-path: 3.0.0 - readable-stream: 4.7.0 - - archiver@7.0.1: - dependencies: - archiver-utils: 5.0.2 - async: 3.2.6 - buffer-crc32: 1.0.0 - readable-stream: 4.7.0 - readdir-glob: 1.1.3 - tar-stream: 3.1.7 - zip-stream: 6.0.1 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - arctic@3.7.0: - dependencies: - '@oslojs/crypto': 1.0.1 - '@oslojs/encoding': 1.1.0 - '@oslojs/jwt': 0.2.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) arg@5.0.2: {} @@ -16662,6 +15878,8 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + bare-events@2.8.2: {} bare-fs@4.6.0: @@ -16694,23 +15912,9 @@ snapshots: dependencies: bare-path: 3.0.0 -<<<<<<< HEAD base64id@2.0.0: {} baseline-browser-mapping@2.10.14: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - base64id@2.0.0: {} - - baseline-browser-mapping@2.10.8: {} - - baseline-browser-mapping@2.9.19: {} - - basic-ftp@5.1.0: {} -======= - baseline-browser-mapping@2.10.8: {} - - basic-ftp@5.1.0: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) bcp-47-match@2.0.3: {} @@ -16728,24 +15932,8 @@ snapshots: binary-extensions@2.3.0: {} -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - -======= birpc@4.0.0: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - ->>>>>>> 67b9f0bf (refactor: migrate to external email service) blake3-wasm@2.1.5: {} boolbase@1.0.0: {} @@ -16765,6 +15953,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.5: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -16822,15 +16014,7 @@ snapshots: camelize@1.0.1: {} -<<<<<<< HEAD caniuse-lite@1.0.30001785: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - caniuse-lite@1.0.30001767: {} - - caniuse-lite@1.0.30001780: {} -======= - caniuse-lite@1.0.30001780: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) cardinal@2.1.1: dependencies: @@ -16899,6 +16083,10 @@ snapshots: ci-info@4.4.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -16973,6 +16161,8 @@ snapshots: commander@11.1.0: {} + commander@13.1.0: {} + commander@14.0.3: {} commander@7.2.0: {} @@ -16983,27 +16173,13 @@ snapshots: commondir@1.0.1: {} - compute-scroll-into-view@3.1.1: {} - -<<<<<<< HEAD - conf@15.1.0: - dependencies: - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) - atomically: 2.1.1 - debounce-fn: 6.0.0 - dot-prop: 10.1.0 - env-paths: 3.0.0 - json-schema-typed: 8.0.2 - semver: 7.7.4 - uint8array-extras: 1.5.0 - -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - conf@15.0.2: + compute-scroll-into-view@3.1.1: {} + + conf@15.1.0: dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) - atomically: 2.1.0 + atomically: 2.1.1 debounce-fn: 6.0.0 dot-prop: 10.1.0 env-paths: 3.0.0 @@ -17011,62 +16187,17 @@ snapshots: semver: 7.7.4 uint8array-extras: 1.5.0 -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) confbox@0.1.8: {} -<<<<<<< HEAD confbox@0.2.4: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - confbox@0.2.2: {} - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) config-chain@1.1.13: dependencies: ini: 1.3.8 proto-list: 1.2.4 -<<<<<<< HEAD - consola@3.4.2: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - configstore@5.0.1: - dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - - configstore@7.1.0: - dependencies: - atomically: 2.1.1 - dot-prop: 9.0.0 - graceful-fs: 4.2.11 - xdg-basedir: 5.1.0 - consola@3.4.2: {} -======= - configstore@5.0.1: - dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - - configstore@7.1.0: - dependencies: - atomically: 2.1.1 - dot-prop: 9.0.0 - graceful-fs: 4.2.11 - xdg-basedir: 5.1.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) - console-table-printer@2.15.0: dependencies: simple-wcswidth: 1.1.2 @@ -17077,6 +16208,8 @@ snapshots: cookie-es@1.2.2: {} + cookie@0.7.2: {} + cookie@1.1.1: {} copy-to-clipboard@3.3.3: @@ -17089,6 +16222,11 @@ snapshots: core-util-is@1.0.3: {} + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -17375,8 +16513,14 @@ snapshots: dayjs@1.11.20: {} + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + debounce@1.2.1: {} + debounce@2.2.0: {} + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -17416,6 +16560,8 @@ snapshots: defu@6.1.4: {} + defu@6.1.7: {} + delaunator@5.1.0: dependencies: robust-predicates: 3.0.3 @@ -17475,31 +16621,9 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 -<<<<<<< HEAD dot-prop@10.1.0: dependencies: type-fest: 5.5.0 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - dot-prop@10.1.0: - dependencies: - type-fest: 5.4.1 - - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - - dot-prop@9.0.0: - dependencies: - type-fest: 4.41.0 -======= - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - - dot-prop@9.0.0: - dependencies: - type-fest: 4.41.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) dotenv-cli@11.0.0: dependencies: @@ -17584,25 +16708,14 @@ snapshots: emoji-regex@8.0.0: {} -<<<<<<< HEAD - empathic@2.0.0: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - emoji-regex@9.2.2: {} - - encoding-japanese@2.2.0: {} -======= - emoji-regex@9.2.2: {} - empathic@2.0.0: {} encoding-japanese@2.2.0: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) end-of-stream@1.4.5: dependencies: once: 1.4.0 -<<<<<<< HEAD engine.io-parser@5.2.3: {} engine.io@6.6.6: @@ -17623,29 +16736,6 @@ snapshots: - utf-8-validate enhanced-resolve@5.20.1: -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - engine.io-parser@5.2.3: {} - - engine.io@6.6.5: - dependencies: - '@types/cors': 2.8.19 - '@types/node': 22.19.7 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.6 - debug: 4.4.3(supports-color@8.1.1) - engine.io-parser: 5.2.3 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - enhanced-resolve@5.18.4: -======= - enhanced-resolve@5.18.4: ->>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: graceful-fs: 4.2.11 tapable: 2.3.2 @@ -17654,6 +16744,8 @@ snapshots: entities@6.0.1: {} + env-paths@3.0.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -17745,35 +16837,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 - esbuild@0.27.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 - esbuild@0.27.3: optionalDependencies: '@esbuild/aix-ppc64': 0.27.3 @@ -17900,6 +16963,8 @@ snapshots: '@expressive-code/plugin-shiki': 0.41.7 '@expressive-code/plugin-text-markers': 0.41.7 + exsolve@1.0.8: {} + extend@3.0.2: {} fast-content-type-parse@3.0.0: {} @@ -17960,10 +17025,6 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - fdir@6.5.0(picomatch@4.0.4): - optionalDependencies: - picomatch: 4.0.4 - file-selector@0.4.0: dependencies: tslib: 2.8.1 @@ -18103,10 +17164,6 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.13.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.13.7: dependencies: resolve-pkg-maps: 1.0.0 @@ -18119,7 +17176,6 @@ snapshots: glob@13.0.6: dependencies: -<<<<<<< HEAD minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -18129,31 +17185,6 @@ snapshots: ini: 4.1.1 globals@11.12.0: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.1.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.2.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 - -======= - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) globby@11.1.0: dependencies: @@ -18424,19 +17455,13 @@ snapshots: dependencies: react-is: 16.13.1 -<<<<<<< HEAD + hono@4.12.15: {} + + hookable@6.1.1: {} + hosted-git-info@9.0.2: dependencies: lru-cache: 11.2.7 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - hosted-git-info@2.8.9: {} -======= - hono@4.12.12: {} - - hookable@6.1.0: {} - - hosted-git-info@2.8.9: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) hotscript@1.0.13: {} @@ -18511,6 +17536,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -18532,16 +17561,8 @@ snapshots: import-meta-resolve@4.2.0: {} -<<<<<<< HEAD -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - imurmurhash@0.1.4: {} - -======= - import-without-cache@0.2.5: {} - - imurmurhash@0.1.4: {} + import-without-cache@0.3.3: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) indent-string@4.0.0: {} index-to-position@1.2.0: {} @@ -18632,6 +17653,8 @@ snapshots: is-stream@4.0.1: {} + is-unicode-supported@1.3.0: {} + is-unicode-supported@2.1.0: {} is-wsl@2.2.0: @@ -18664,27 +17687,12 @@ snapshots: isomorphic-dompurify@2.36.0(@noble/hashes@2.0.1): dependencies: -<<<<<<< HEAD dompurify: 3.3.3 jsdom: 28.1.0(@noble/hashes@2.0.1) transitivePeerDependencies: - '@noble/hashes' - canvas - supports-color -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - -======= - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) jake@10.9.4: dependencies: @@ -18692,6 +17700,8 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 + jiti@2.4.2: {} + jiti@2.6.1: {} jose@6.2.2: {} @@ -18802,6 +17812,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stable-stringify@1.3.0: dependencies: call-bind: 1.0.8 @@ -18856,6 +17868,17 @@ snapshots: leven@3.1.0: {} + libbase64@1.3.0: {} + + libmime@5.3.7: + dependencies: + encoding-japanese: 2.2.0 + iconv-lite: 0.6.3 + libbase64: 1.3.0 + libqp: 2.1.1 + + libqp@2.1.1: {} + lightningcss-android-arm64@1.32.0: optional: true @@ -18942,6 +17965,11 @@ snapshots: lodash@4.18.1: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-symbols@7.0.1: dependencies: is-unicode-supported: 2.1.0 @@ -18975,6 +18003,19 @@ snapshots: '@babel/types': 7.29.0 source-map-js: 1.2.1 + mailparser@3.9.1: + dependencies: + '@zone-eu/mailsplit': 5.4.8 + encoding-japanese: 2.2.0 + he: 1.2.0 + html-to-text: 9.0.5 + iconv-lite: 0.7.0 + libmime: 5.3.7 + linkify-it: 5.0.0 + nodemailer: 7.0.11 + punycode.js: 2.3.1 + tlds: 1.261.0 + make-dir@2.1.0: dependencies: pify: 4.0.1 @@ -19566,6 +18607,10 @@ snapshots: - bufferutil - utf-8-validate + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.5 + minimatch@5.1.9: dependencies: brace-expansion: 2.0.3 @@ -19618,6 +18663,8 @@ snapshots: nanoid@5.1.7: {} + negotiator@0.6.3: {} + neotraverse@0.6.18: {} next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -19625,7 +18672,6 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) -<<<<<<< HEAD next@16.1.7(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 16.1.7 @@ -19653,37 +18699,6 @@ snapshots: - babel-plugin-macros next@16.2.2(@playwright/test@1.59.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - next@16.1.6(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@next/env': 16.1.6 - '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001767 - postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) - optionalDependencies: - '@next/swc-darwin-arm64': 16.1.6 - '@next/swc-darwin-x64': 16.1.6 - '@next/swc-linux-arm64-gnu': 16.1.6 - '@next/swc-linux-arm64-musl': 16.1.6 - '@next/swc-linux-x64-gnu': 16.1.6 - '@next/swc-linux-x64-musl': 16.1.6 - '@next/swc-win32-arm64-msvc': 16.1.6 - '@next/swc-win32-x64-msvc': 16.1.6 - '@playwright/test': 1.58.1 - babel-plugin-react-compiler: 1.0.0 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): -======= - next@16.2.0(@babel/core@7.29.0)(@playwright/test@1.58.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): ->>>>>>> 67b9f0bf (refactor: migrate to external email service) dependencies: '@next/env': 16.2.2 '@swc/helpers': 0.5.15 @@ -19734,6 +18749,8 @@ snapshots: node-releases@2.0.37: {} + nodemailer@7.0.11: {} + normalize-package-data@8.0.0: dependencies: hosted-git-info: 9.0.2 @@ -19755,7 +18772,6 @@ snapshots: nwsapi@2.2.23: {} -<<<<<<< HEAD nypm@0.6.2: dependencies: citty: 0.1.6 @@ -19764,17 +18780,6 @@ snapshots: pkg-types: 2.3.0 tinyexec: 1.0.4 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - nypm@0.6.2: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - pathe: 2.0.3 - pkg-types: 2.3.0 - tinyexec: 1.0.2 - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -19822,7 +18827,6 @@ snapshots: powershell-utils: 0.1.0 wsl-utils: 0.3.1 -<<<<<<< HEAD ora@8.2.0: dependencies: chalk: 5.6.2 @@ -19835,21 +18839,6 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.2 - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) ora@9.3.0: dependencies: chalk: 5.6.2 @@ -20024,7 +19013,6 @@ snapshots: path-parse@1.0.7: {} -<<<<<<< HEAD path-scurry@2.0.2: dependencies: lru-cache: 11.2.7 @@ -20033,23 +19021,6 @@ snapshots: path-strip-sep@1.0.21: dependencies: tslib: 2.8.1 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.1: - dependencies: - lru-cache: 11.2.7 - minipass: 7.1.2 - -======= - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) path-to-regexp@6.3.0: {} @@ -20110,8 +19081,6 @@ snapshots: picomatch@4.0.4: {} - picomatch@4.0.4: {} - pify@4.0.1: {} pirates@4.0.7: {} @@ -20130,22 +19099,12 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 -<<<<<<< HEAD pkg-types@2.3.0: dependencies: confbox: 0.2.4 exsolve: 1.0.8 pathe: 2.0.3 -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - pkg-types@2.3.0: - dependencies: - confbox: 0.2.2 - exsolve: 1.0.8 - pathe: 2.0.3 - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) player.style@0.1.10(react@19.2.4): dependencies: media-chrome: 4.11.1(react@19.2.4) @@ -20407,7 +19366,6 @@ snapshots: prop-types: 15.8.1 react: 19.2.4 -<<<<<<< HEAD react-email@5.2.10: dependencies: '@babel/parser': 7.27.0 @@ -20432,33 +19390,6 @@ snapshots: - supports-color - utf-8-validate -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - react-email@5.2.5: - dependencies: - '@babel/parser': 7.28.6 - '@babel/traverse': 7.28.6 - chokidar: 4.0.3 - commander: 13.1.0 - conf: 15.0.2 - debounce: 2.2.0 - esbuild: 0.25.12 - glob: 11.1.0 - jiti: 2.4.2 - log-symbols: 7.0.1 - mime-types: 3.0.2 - normalize-path: 3.0.0 - nypm: 0.6.2 - ora: 8.2.0 - prompts: 2.4.2 - socket.io: 4.8.3 - tsconfig-paths: 4.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) react-fast-compare@3.2.2: {} react-fast-marquee@1.6.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): @@ -20893,6 +19824,13 @@ snapshots: optionalDependencies: '@react-email/render': 2.0.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + resend@6.9.1(@react-email/render@2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + dependencies: + mailparser: 3.9.1 + svix: 1.84.1 + optionalDependencies: + '@react-email/render': 2.0.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -20937,16 +19875,7 @@ snapshots: robust-predicates@3.0.3: {} -<<<<<<< HEAD - rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1): -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - robust-predicates@3.0.2: {} - - rollup@4.56.0: -======= - robust-predicates@3.0.2: {} - - rolldown-plugin-dts@0.23.2(rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1))(typescript@5.9.3): + rolldown-plugin-dts@0.23.2(rolldown@1.0.0-rc.17)(typescript@5.9.3): dependencies: '@babel/generator': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 @@ -20958,13 +19887,13 @@ snapshots: get-tsconfig: 4.13.7 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + rolldown: 1.0.0-rc.17 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1): + rolldown@1.0.0-rc.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: '@oxc-project/types': 0.122.0 '@rolldown/pluginutils': 1.0.0-rc.12 @@ -20981,37 +19910,33 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - rollup@4.56.0: ->>>>>>> 67b9f0bf (refactor: migrate to external email service) + rolldown@1.0.0-rc.17: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 + '@oxc-project/types': 0.127.0 + '@rolldown/pluginutils': 1.0.0-rc.17 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@rolldown/binding-android-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.17 + '@rolldown/binding-darwin-x64': 1.0.0-rc.17 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.17 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.17 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.17 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.17 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.17 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.17 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.17 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 rollup@4.57.1: dependencies: @@ -21403,7 +20328,6 @@ snapshots: smol-toml@1.6.1: {} -<<<<<<< HEAD socket.io-adapter@2.5.6: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -21434,39 +20358,6 @@ snapshots: - supports-color - utf-8-validate -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - socket.io-adapter@2.5.6: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@4.2.5: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - socket.io@4.8.3: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.6 - debug: 4.4.3(supports-color@8.1.1) - engine.io: 6.6.5 - socket.io-adapter: 2.5.6 - socket.io-parser: 4.2.5 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - -======= ->>>>>>> 67b9f0bf (refactor: migrate to external email service) sonner@2.0.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: react: 19.2.4 @@ -21516,6 +20407,8 @@ snapshots: std-env@4.0.0: {} + stdin-discarder@0.2.2: {} + stdin-discarder@0.3.1: {} stream-replace-string@2.0.0: {} @@ -21641,6 +20534,11 @@ snapshots: picocolors: 1.1.1 sax: 1.6.0 + svix@1.84.1: + dependencies: + standardwebhooks: 1.0.0 + uuid: 10.0.0 + svix@1.88.0: dependencies: standardwebhooks: 1.0.0 @@ -21648,17 +20546,9 @@ snapshots: symbol-tree@3.2.4: {} -<<<<<<< HEAD tagged-tag@1.0.0: {} tailwind-merge@3.5.0: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - tagged-tag@1.0.0: {} - - tailwind-merge@3.4.0: {} -======= - tailwind-merge@3.4.0: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) tailwindcss-animate@1.0.7(tailwindcss@4.2.2): dependencies: @@ -21742,10 +20632,17 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@2.1.0: {} tinyrainbow@3.1.0: {} + tlds@1.261.0: {} + tldts-core@6.1.86: {} tldts-core@7.0.27: {} @@ -21811,29 +20708,27 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.21.7(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1)(typescript@5.9.3): + tsdown@0.21.10(typescript@5.9.3): dependencies: ansis: 4.2.0 cac: 7.0.0 - defu: 6.1.4 + defu: 6.1.7 empathic: 2.0.0 - hookable: 6.1.0 - import-without-cache: 0.2.5 + hookable: 6.1.1 + import-without-cache: 0.3.3 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) - rolldown-plugin-dts: 0.23.2(rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1))(typescript@5.9.3) + rolldown: 1.0.0-rc.17 + rolldown-plugin-dts: 0.23.2(rolldown@1.0.0-rc.17)(typescript@5.9.3) semver: 7.7.4 tinyexec: 1.1.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.34(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) + unrun: 0.2.37 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - '@ts-macro/tsc' - '@typescript/native-preview' - oxc-resolver @@ -21890,25 +20785,11 @@ snapshots: type-fest@4.41.0: {} -<<<<<<< HEAD type-fest@5.5.0: dependencies: tagged-tag: 1.0.0 typedarray-dts@1.0.0: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - type-fest@5.4.1: - dependencies: - tagged-tag: 1.0.0 - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 -======= - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 ->>>>>>> 67b9f0bf (refactor: migrate to external email service) typeid-js@0.3.0: dependencies: @@ -21932,6 +20813,8 @@ snapshots: ufo@1.6.3: {} + uint8array-extras@1.5.0: {} + ultrahtml@1.6.0: {} unconfig-core@7.5.0: @@ -22049,12 +20932,9 @@ snapshots: universal-user-agent@7.0.3: {} - unrun@0.2.34(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1): + unrun@0.2.37: dependencies: - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.8.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + rolldown: 1.0.0-rc.17 unstorage@1.17.4: dependencies: @@ -22145,6 +21025,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vary@1.1.2: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -22207,12 +21089,12 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript @@ -22249,12 +21131,12 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3): + vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.8 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1) + rolldown: 1.0.0-rc.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.7 @@ -22271,10 +21153,10 @@ snapshots: optionalDependencies: vite: 7.3.1(@types/node@22.19.7)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) - vitest@4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.2(@types/node@22.19.7)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -22291,7 +21173,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.7.1)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@22.19.7)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.7 @@ -22510,17 +21392,9 @@ snapshots: ws@8.18.0: {} -<<<<<<< HEAD ws@8.18.3: {} ws@8.20.0: {} -||||||| parent of 67b9f0bf (refactor: migrate to external email service) - ws@8.18.3: {} - - ws@8.19.0: {} -======= - ws@8.19.0: {} ->>>>>>> 67b9f0bf (refactor: migrate to external email service) wsl-utils@0.3.1: dependencies: From 59853e39814a063bcebe2d87e2f239469d398b3b Mon Sep 17 00:00:00 2001 From: Ole Magnus Fon Johnsen Date: Mon, 4 May 2026 14:20:18 +0200 Subject: [PATCH 8/8] chore: add missing param and remove email package --- apps/uno/domain/service/happening_test.go | 26 +++++++++-------- packages/email/package.json | 34 ----------------------- 2 files changed, 14 insertions(+), 46 deletions(-) delete mode 100644 packages/email/package.json diff --git a/apps/uno/domain/service/happening_test.go b/apps/uno/domain/service/happening_test.go index 31fa39221e..406a888861 100644 --- a/apps/uno/domain/service/happening_test.go +++ b/apps/uno/domain/service/happening_test.go @@ -32,8 +32,8 @@ func TestHappeningService_GetAllHappenings(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) happenings, err := happeningService.GetAllHappenings(t.Context()) @@ -272,8 +272,8 @@ func TestHappeningService_Register_ErrorCases(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -363,8 +363,8 @@ func TestHappeningService_Register_RegistrationWindow(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -487,8 +487,8 @@ func TestHappeningService_Register_QuestionValidation(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -657,8 +657,8 @@ func TestHappeningService_Register_Success(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) questions := []model.QuestionAnswer{} @@ -1120,6 +1120,8 @@ func TestHappeningService_SyncHappening_QuestionsField(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, + nil, + nil, ) data := baseData @@ -1226,8 +1228,8 @@ func TestHappeningService_Register_HostCanSkipSpotRangeCheck(t *testing.T) { mockRegistrationRepo, mockBanInfoRepo, mockGroupRepo, - nil, - nil, + nil, + nil, ) questions := []model.QuestionAnswer{} diff --git a/packages/email/package.json b/packages/email/package.json deleted file mode 100644 index e458dc2188..0000000000 --- a/packages/email/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "@echo-webkom/email", - "version": "0.0.0", - "private": true, - "main": "./index.ts", - "exports": { - ".": "./index.ts", - "./client": "./client.ts" - }, - "scripts": { - "clean": "rm -rf .turbo node_modules", - "dev": "pnpm with-env email dev --port 9000", - "export": "pnpm with-env email export", - "with-env": "dotenv -e ../../.env --", - "check": "oxlint . && oxfmt --check . && tsc --noEmit", - "check:fix": "oxlint . --fix && oxfmt . && tsc --noEmit" - }, - "dependencies": { - "@react-email/components": "1.0.11", - "@react-email/render": "2.0.5", - "react": "19.2.4", - "react-dom": "19.2.4", - "resend": "6.10.0", - "server-only": "0.0.1" - }, - "devDependencies": { - "@react-email/preview-server": "^5.2.10", - "@types/node": "22.19.7", - "@types/react": "19.2.14", - "dotenv-cli": "11.0.0", - "react-email": "5.2.10", - "typescript": "5.9.3" - } -}