From 5ed1194752a89d6d44a93fc44a9191c5c342d671 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 15:55:19 -0500 Subject: [PATCH 01/30] test --- apps/web/src/actions/settings/edit.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/actions/settings/edit.ts b/apps/web/src/actions/settings/edit.ts index 8e02e9e4..e59949a7 100644 --- a/apps/web/src/actions/settings/edit.ts +++ b/apps/web/src/actions/settings/edit.ts @@ -39,7 +39,7 @@ export const editAccountSettings = userAction }; } - // revalidatePath("/settings"); + revalidatePath("/settings"); return { success: true }; }, ); @@ -74,7 +74,7 @@ export const editAcademicSettings = userAction }; } - // revalidatePath("/settings"); + revalidatePath("/settings"); return { success: true }; }, ); @@ -90,7 +90,7 @@ export const editResumeUrl = userAction if (oldResume) await del(oldResume); - // revalidatePath("/settings"); + revalidatePath("/settings"); return { success: true }; } catch (error) { // Failed to update user data to new resume. Delete the new resume from the blob and make the user try again. @@ -120,7 +120,7 @@ export const editClubSettings = userAction }; } - // revalidatePath("/settings"); + revalidatePath("/settings"); return { success: true }; }, ); From 56fc86601cbade3ecd79cc0be4983dc9a7769ad8 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:45:00 -0500 Subject: [PATCH 02/30] updates gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5a6f8656..ba6fe6d9 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ yarn-error.log* # vscode .vscode .env*.local + +# infisical +.infisical.json \ No newline at end of file From 06f5e0b928d7ace35c8cf4bbab7fb90f741acfd8 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:45:18 -0500 Subject: [PATCH 03/30] updates config for emails --- packages/config/clubkit.config.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/config/clubkit.config.ts b/packages/config/clubkit.config.ts index e0de93a9..8cc6396c 100644 --- a/packages/config/clubkit.config.ts +++ b/packages/config/clubkit.config.ts @@ -1,6 +1,7 @@ const c = { clubName: "ClubKit", universityName: "UTSA", + sourceCodeLink: "https://github.com/acmutsa", universityID: { name: "ABC123", maxLength: 6, @@ -101,6 +102,27 @@ const c = { memberRoles: ["member", "admin", "super_admin"] as const, } as const; +const emailsConfig = { + useEmailService: true, + rightsReservedString: `© Association of Computing Machinery at UTSA 2015 - + ${new Date().getFullYear()}. All Rights Reserved.`, + footerLinks: [ + { + name: "Discord", + href: "https://go.acmutsa.org/discord", + }, + { + name: "Help", + href: `mailto:${c.contactEmail}`, + }, + { + name: "About ACM", + href: "https://acmutsa.org", + }, + ], + publicLogoLink: "https://static.acmutsa.org/acm-logo.png", +}; + export const defaultTheme = "light"; const bucketBaseUrl = `${c.clubName}-${c.universityName}`; @@ -228,4 +250,4 @@ const staticUploads = { } as const; export default c; -export { majors, staticUploads, bucketEventThumbnailBaseUrl, bucketBaseUrl }; +export { majors, staticUploads, bucketEventThumbnailBaseUrl, bucketBaseUrl, emailsConfig }; From 1a4ef28e1ea82f0c2e70e3d0bd7395b400489edc Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:45:27 -0500 Subject: [PATCH 04/30] adds plunk and react email --- apps/web/package.json | 6 +- pnpm-lock.yaml | 1240 +++++++++++++++++++++++++++++++++++------ 2 files changed, 1079 insertions(+), 167 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index ec3c416a..83f45a77 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -10,7 +10,8 @@ "with-env": "dotenv -e ../../.env --", "pages:build": "pnpm dlx @cloudflare/next-on-pages", "preview": "pnpm run pages:build && wrangler pages dev", - "deploy": "pnpm run pages:build && wrangler pages deploy" + "deploy": "pnpm run pages:build && wrangler pages deploy", + "email-dev": "email dev --dir ./src/components/emails --port 3001" }, "dependencies": { "@aws-sdk/client-s3": "^3.758.0", @@ -19,6 +20,7 @@ "@clerk/nextjs": "^6.12.9", "@hookform/resolvers": "^3.3.4", "@internationalized/date": "^3.5.4", + "@plunk/node": "^3.0.3", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-avatar": "^1.0.4", @@ -35,6 +37,7 @@ "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.1.0", + "@react-email/components": "0.0.36", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/match-sorter-utils": "^8.15.1", "@tanstack/react-table": "^8.17.3", @@ -78,6 +81,7 @@ "@types/react-dom": "^18", "autoprefixer": "^10.0.1", "postcss": "^8", + "react-email": "4.0.4", "tailwindcss": "^3.3.0", "typescript": "^5" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 429e26db..69892a8e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,9 @@ importers: '@internationalized/date': specifier: ^3.5.4 version: 3.5.4 + '@plunk/node': + specifier: ^3.0.3 + version: 3.0.3 '@radix-ui/react-accordion': specifier: ^1.2.0 version: 1.2.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.2.0)(react@18.2.0) @@ -142,6 +145,9 @@ importers: '@radix-ui/react-tabs': specifier: ^1.1.0 version: 1.1.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.2.0)(react@18.2.0) + '@react-email/components': + specifier: 0.0.36 + version: 0.0.36(react-dom@18.2.0)(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.10.1 version: 0.10.1(typescript@5.3.3)(zod@3.23.8) @@ -266,6 +272,9 @@ importers: postcss: specifier: ^8 version: 8.4.31 + react-email: + specifier: 4.0.4 + version: 4.0.4(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.3.0 version: 3.3.0(postcss@8.4.31) @@ -309,7 +318,7 @@ packages: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.734.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/crc32c@5.2.0: @@ -317,7 +326,7 @@ packages: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.734.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/sha1-browser@5.2.0: @@ -328,7 +337,7 @@ packages: '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/sha256-browser@5.2.0: @@ -340,7 +349,7 @@ packages: '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/sha256-js@5.2.0: @@ -349,13 +358,13 @@ packages: dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.734.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/supports-web-crypto@5.2.0: resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-crypto/util@5.2.0: @@ -363,7 +372,7 @@ packages: dependencies: '@aws-sdk/types': 3.734.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/client-s3@3.758.0: @@ -471,7 +480,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -490,7 +499,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-env@3.758.0: @@ -501,7 +510,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-http@3.758.0: @@ -517,7 +526,7 @@ packages: '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-stream': 4.1.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-ini@3.758.0: @@ -536,7 +545,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -556,7 +565,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -570,7 +579,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-sso@3.758.0: @@ -584,7 +593,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -598,7 +607,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -613,7 +622,7 @@ packages: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-expect-continue@3.734.0: @@ -623,7 +632,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-flexible-checksums@3.758.0: @@ -642,7 +651,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-host-header@3.734.0: @@ -652,7 +661,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-location-constraint@3.734.0: @@ -661,7 +670,7 @@ packages: dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-logger@3.734.0: @@ -670,7 +679,7 @@ packages: dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-recursion-detection@3.734.0: @@ -680,7 +689,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-sdk-s3@3.758.0: @@ -700,7 +709,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-ssec@3.734.0: @@ -709,7 +718,7 @@ packages: dependencies: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-user-agent@3.758.0: @@ -722,7 +731,7 @@ packages: '@smithy/core': 3.1.5 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/nested-clients@3.758.0: @@ -766,7 +775,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -780,7 +789,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/s3-request-presigner@3.758.0: @@ -806,7 +815,7 @@ packages: '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/token-providers@3.758.0: @@ -818,7 +827,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -828,14 +837,14 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-arn-parser@3.723.0: resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-endpoints@3.743.0: @@ -845,7 +854,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 '@smithy/util-endpoints': 3.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-format-url@3.734.0: @@ -855,14 +864,14 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/querystring-builder': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-locate-window@3.723.0: resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-browser@3.734.0: @@ -871,7 +880,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-node@3.758.0: @@ -887,7 +896,7 @@ packages: '@aws-sdk/types': 3.734.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/xml-builder@3.734.0: @@ -895,9 +904,55 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + + /@babel/generator@7.27.0: + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + dev: true + + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.24.5: + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.27.0 + dev: true + + /@babel/parser@7.27.0: + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.27.0 + dev: true + /@babel/runtime@7.24.5: resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} engines: {node: '>=6.9.0'} @@ -905,6 +960,38 @@ packages: regenerator-runtime: 0.14.1 dev: false + /@babel/template@7.27.0: + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + dev: true + + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.27.0: + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: true + /@clerk/backend@1.25.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-nnBpr7oSq5iATWRExuljEfp7xa90KE1OUgaGCSmtZYF0T9TWHGkZHYqkQhD4XjiqlR2XsrsQ/UzPfmHM1Km7+Q==} engines: {node: '>=18.17.0'} @@ -1217,7 +1304,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: false optional: true /@esbuild/android-arm64@0.18.20: @@ -1251,7 +1337,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-arm@0.15.18: @@ -1294,7 +1379,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/android-x64@0.18.20: @@ -1328,7 +1412,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false optional: true /@esbuild/darwin-arm64@0.18.20: @@ -1362,7 +1445,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/darwin-x64@0.18.20: @@ -1396,7 +1478,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-arm64@0.18.20: @@ -1430,7 +1511,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/freebsd-x64@0.18.20: @@ -1464,7 +1544,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm64@0.18.20: @@ -1498,7 +1577,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-arm@0.18.20: @@ -1532,7 +1610,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ia32@0.18.20: @@ -1566,7 +1643,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-loong64@0.15.18: @@ -1609,7 +1685,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-mips64el@0.18.20: @@ -1643,7 +1718,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-ppc64@0.18.20: @@ -1677,7 +1751,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-riscv64@0.18.20: @@ -1711,7 +1784,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-s390x@0.18.20: @@ -1745,7 +1817,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-x64@0.18.20: @@ -1779,7 +1850,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/netbsd-arm64@0.24.2: @@ -1797,7 +1867,6 @@ packages: cpu: [arm64] os: [netbsd] requiresBuild: true - dev: false optional: true /@esbuild/netbsd-x64@0.18.20: @@ -1831,7 +1900,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false optional: true /@esbuild/openbsd-arm64@0.24.2: @@ -1849,7 +1917,6 @@ packages: cpu: [arm64] os: [openbsd] requiresBuild: true - dev: false optional: true /@esbuild/openbsd-x64@0.18.20: @@ -1883,7 +1950,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false optional: true /@esbuild/sunos-x64@0.18.20: @@ -1917,7 +1983,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false optional: true /@esbuild/win32-arm64@0.18.20: @@ -1951,7 +2016,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-ia32@0.18.20: @@ -1985,7 +2049,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false optional: true /@esbuild/win32-x64@0.18.20: @@ -2019,7 +2082,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false optional: true /@fastify/busboy@2.1.1: @@ -2059,13 +2121,13 @@ packages: resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} dependencies: '@formatjs/intl-localematcher': 0.5.4 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/fast-memoize@2.2.0: resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/icu-messageformat-parser@2.7.8: @@ -2073,20 +2135,20 @@ packages: dependencies: '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/icu-skeleton-parser': 1.8.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/icu-skeleton-parser@1.8.2: resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} dependencies: '@formatjs/ecma402-abstract': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@formatjs/intl-localematcher@0.5.4: resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): @@ -2328,6 +2390,15 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 + /@jridgewell/gen-mapping@0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -2336,6 +2407,11 @@ packages: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -2345,6 +2421,13 @@ packages: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -2485,6 +2568,10 @@ packages: resolution: {integrity: sha512-JnzQ2cExDeG7FxJwqAksZ3aqVJrHjFwZQAEJ9gQZSoEhIow7SNoKZzju/AwQ+PLIR4NY8V0rhcVozx/2izDO0w==} dev: false + /@next/env@15.2.3: + resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==} + dev: true + /@next/swc-darwin-arm64@14.2.25: resolution: {integrity: sha512-09clWInF1YRd6le00vt750s3m7SEYNehz9C4PUcSu3bAdCTpjIV4aTYQZ25Ehrr83VR1rZeqtKUPWSI7GfuKZQ==} engines: {node: '>= 10'} @@ -2494,6 +2581,15 @@ packages: dev: false optional: true + /@next/swc-darwin-arm64@15.2.3: + resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@next/swc-darwin-x64@14.2.25: resolution: {integrity: sha512-V+iYM/QR+aYeJl3/FWWU/7Ix4b07ovsQ5IbkwgUK29pTHmq+5UxeDr7/dphvtXEq5pLB/PucfcBNh9KZ8vWbug==} engines: {node: '>= 10'} @@ -2503,6 +2599,15 @@ packages: dev: false optional: true + /@next/swc-darwin-x64@15.2.3: + resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@next/swc-linux-arm64-gnu@14.2.25: resolution: {integrity: sha512-LFnV2899PJZAIEHQ4IMmZIgL0FBieh5keMnriMY1cK7ompR+JUd24xeTtKkcaw8QmxmEdhoE5Mu9dPSuDBgtTg==} engines: {node: '>= 10'} @@ -2512,6 +2617,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-gnu@15.2.3: + resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@next/swc-linux-arm64-musl@14.2.25: resolution: {integrity: sha512-QC5y5PPTmtqFExcKWKYgUNkHeHE/z3lUsu83di488nyP0ZzQ3Yse2G6TCxz6nNsQwgAx1BehAJTZez+UQxzLfw==} engines: {node: '>= 10'} @@ -2521,6 +2635,15 @@ packages: dev: false optional: true + /@next/swc-linux-arm64-musl@15.2.3: + resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@next/swc-linux-x64-gnu@14.2.25: resolution: {integrity: sha512-y6/ML4b9eQ2D/56wqatTJN5/JR8/xdObU2Fb1RBidnrr450HLCKr6IJZbPqbv7NXmje61UyxjF5kvSajvjye5w==} engines: {node: '>= 10'} @@ -2530,6 +2653,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-gnu@15.2.3: + resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@next/swc-linux-x64-musl@14.2.25: resolution: {integrity: sha512-sPX0TSXHGUOZFvv96GoBXpB3w4emMqKeMgemrSxI7A6l55VBJp/RKYLwZIB9JxSqYPApqiREaIIap+wWq0RU8w==} engines: {node: '>= 10'} @@ -2539,6 +2671,15 @@ packages: dev: false optional: true + /@next/swc-linux-x64-musl@15.2.3: + resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@next/swc-win32-arm64-msvc@14.2.25: resolution: {integrity: sha512-ReO9S5hkA1DU2cFCsGoOEp7WJkhFzNbU/3VUF6XxNGUCQChyug6hZdYL/istQgfT/GWE6PNIg9cm784OI4ddxQ==} engines: {node: '>= 10'} @@ -2548,6 +2689,15 @@ packages: dev: false optional: true + /@next/swc-win32-arm64-msvc@15.2.3: + resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@next/swc-win32-ia32-msvc@14.2.25: resolution: {integrity: sha512-DZ/gc0o9neuCDyD5IumyTGHVun2dCox5TfPQI/BJTYwpSNYM3CZDI4i6TOdjeq1JMo+Ug4kPSMuZdwsycwFbAw==} engines: {node: '>= 10'} @@ -2566,6 +2716,15 @@ packages: dev: false optional: true + /@next/swc-win32-x64-msvc@15.2.3: + resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2593,6 +2752,12 @@ packages: requiresBuild: true optional: true + /@plunk/node@3.0.3: + resolution: {integrity: sha512-f3NT418/EdLjebQ4arAwR64cnz7d5H7i1CeKh8+B0cVBrwzHvF+Q+QkhutF+FAp49yuI/BYc71qQH+RFc2fxxQ==} + dependencies: + tslib: 2.8.1 + dev: false + /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: @@ -4644,49 +4809,265 @@ packages: react: 18.2.0 dev: false - /@react-stately/calendar@3.5.1(react@18.2.0): - resolution: {integrity: sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA==} + /@react-email/body@0.0.11(react@18.2.0): + resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^18.0 || ^19.0 || ^19.0.0-rc dependencies: - '@internationalized/date': 3.5.4 - '@react-stately/utils': 3.10.1(react@18.2.0) - '@react-types/calendar': 3.4.6(react@18.2.0) - '@react-types/shared': 3.23.1(react@18.2.0) - '@swc/helpers': 0.5.2 react: 18.2.0 dev: false - /@react-stately/checkbox@3.6.5(react@18.2.0): - resolution: {integrity: sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==} + /@react-email/button@0.0.19(react@18.2.0): + resolution: {integrity: sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^18.0 || ^19.0 || ^19.0.0-rc dependencies: - '@react-stately/form': 3.0.3(react@18.2.0) - '@react-stately/utils': 3.10.1(react@18.2.0) - '@react-types/checkbox': 3.8.1(react@18.2.0) - '@react-types/shared': 3.23.1(react@18.2.0) - '@swc/helpers': 0.5.2 react: 18.2.0 dev: false - /@react-stately/collections@3.10.7(react@18.2.0): - resolution: {integrity: sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==} + /@react-email/code-block@0.0.12(react@18.2.0): + resolution: {integrity: sha512-Faw3Ij9+/Qwq6moWaeHnV8Hn7ekc/EqyAzPi6yUar21dhcqYugCC4Da1x4d9nA9zC0H9KU3lYVJczh8D3cA+Eg==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^18.0 || ^19.0 || ^19.0.0-rc dependencies: - '@react-types/shared': 3.23.1(react@18.2.0) - '@swc/helpers': 0.5.2 + prismjs: 1.30.0 react: 18.2.0 dev: false - /@react-stately/combobox@3.8.4(react@18.2.0): - resolution: {integrity: sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==} + /@react-email/code-inline@0.0.5(react@18.2.0): + resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} + engines: {node: '>=18.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + react: ^18.0 || ^19.0 || ^19.0.0-rc dependencies: - '@react-stately/collections': 3.10.7(react@18.2.0) - '@react-stately/form': 3.0.3(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-email/column@0.0.13(react@18.2.0): + resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/components@0.0.36(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-VMh+OQplAnG8JMLlJjdnjt+ThJZ+JVkp0q2YMS2NEz+T88N22bLD2p7DZO0QgtNaKgumOhJI/0a2Q7VzCrwu5g==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + '@react-email/body': 0.0.11(react@18.2.0) + '@react-email/button': 0.0.19(react@18.2.0) + '@react-email/code-block': 0.0.12(react@18.2.0) + '@react-email/code-inline': 0.0.5(react@18.2.0) + '@react-email/column': 0.0.13(react@18.2.0) + '@react-email/container': 0.0.15(react@18.2.0) + '@react-email/font': 0.0.9(react@18.2.0) + '@react-email/head': 0.0.12(react@18.2.0) + '@react-email/heading': 0.0.15(react@18.2.0) + '@react-email/hr': 0.0.11(react@18.2.0) + '@react-email/html': 0.0.11(react@18.2.0) + '@react-email/img': 0.0.11(react@18.2.0) + '@react-email/link': 0.0.12(react@18.2.0) + '@react-email/markdown': 0.0.14(react@18.2.0) + '@react-email/preview': 0.0.12(react@18.2.0) + '@react-email/render': 1.0.6(react-dom@18.2.0)(react@18.2.0) + '@react-email/row': 0.0.12(react@18.2.0) + '@react-email/section': 0.0.16(react@18.2.0) + '@react-email/tailwind': 1.0.4(react@18.2.0) + '@react-email/text': 0.1.1(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + dev: false + + /@react-email/container@0.0.15(react@18.2.0): + resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/font@0.0.9(react@18.2.0): + resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/head@0.0.12(react@18.2.0): + resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/heading@0.0.15(react@18.2.0): + resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/hr@0.0.11(react@18.2.0): + resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/html@0.0.11(react@18.2.0): + resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/img@0.0.11(react@18.2.0): + resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/link@0.0.12(react@18.2.0): + resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/markdown@0.0.14(react@18.2.0): + resolution: {integrity: sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + md-to-react-email: 5.0.5(react@18.2.0) + react: 18.2.0 + dev: false + + /@react-email/preview@0.0.12(react@18.2.0): + resolution: {integrity: sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/render@1.0.6(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zNueW5Wn/4jNC1c5LFgXzbUdv5Lhms+FWjOvWAhal7gx5YVf0q6dPJ0dnR70+ifo59gcMLwCZEaTS9EEuUhKvQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + html-to-text: 9.0.5 + prettier: 3.5.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-promise-suspense: 0.3.4 + dev: false + + /@react-email/row@0.0.12(react@18.2.0): + resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/section@0.0.16(react@18.2.0): + resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/tailwind@1.0.4(react@18.2.0): + resolution: {integrity: sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-email/text@0.1.1(react@18.2.0): + resolution: {integrity: sha512-Zo9tSEzkO3fODLVH1yVhzVCiwETfeEL5wU93jXKWo2DHoMuiZ9Iabaso3T0D0UjhrCB1PBMeq2YiejqeToTyIQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + dependencies: + react: 18.2.0 + dev: false + + /@react-stately/calendar@3.5.1(react@18.2.0): + resolution: {integrity: sha512-7l7QhqGUJ5AzWHfvZzbTe3J4t72Ht5BmhW4hlVI7flQXtfrmYkVtl3ZdytEZkkHmWGYZRW9b4IQTQGZxhtlElA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@internationalized/date': 3.5.4 + '@react-stately/utils': 3.10.1(react@18.2.0) + '@react-types/calendar': 3.4.6(react@18.2.0) + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.2 + react: 18.2.0 + dev: false + + /@react-stately/checkbox@3.6.5(react@18.2.0): + resolution: {integrity: sha512-IXV3f9k+LtmfQLE+DKIN41Q5QB/YBLDCB1YVx5PEdRp52S9+EACD5683rjVm8NVRDwjMi2SP6RnFRk7fVb5Azg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/form': 3.0.3(react@18.2.0) + '@react-stately/utils': 3.10.1(react@18.2.0) + '@react-types/checkbox': 3.8.1(react@18.2.0) + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.2 + react: 18.2.0 + dev: false + + /@react-stately/collections@3.10.7(react@18.2.0): + resolution: {integrity: sha512-KRo5O2MWVL8n3aiqb+XR3vP6akmHLhLWYZEmPKjIv0ghQaEebBTrN3wiEjtd6dzllv0QqcWvDLM1LntNfJ2TsA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.2 + react: 18.2.0 + dev: false + + /@react-stately/combobox@3.8.4(react@18.2.0): + resolution: {integrity: sha512-iLVGvKRRz0TeJXZhZyK783hveHpYA6xovOSdzSD+WGYpiPXo1QrcrNoH3AE0Z2sHtorU+8nc0j58vh5PB+m2AA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 + dependencies: + '@react-stately/collections': 3.10.7(react@18.2.0) + '@react-stately/form': 3.0.3(react@18.2.0) '@react-stately/list': 3.10.5(react@18.2.0) '@react-stately/overlays': 3.6.7(react@18.2.0) '@react-stately/select': 3.6.4(react@18.2.0) @@ -5206,6 +5587,13 @@ packages: picomatch: 4.0.2 dev: true + /@selderee/plugin-htmlparser2@0.11.0: + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + dev: false + /@sinclair/typebox@0.25.24: resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} dev: true @@ -5215,7 +5603,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/chunked-blob-reader-native@4.0.0: @@ -5223,14 +5611,14 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/util-base64': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/chunked-blob-reader@5.0.0: resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/config-resolver@4.0.1: @@ -5241,7 +5629,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/core@3.1.5: @@ -5255,7 +5643,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/credential-provider-imds@4.0.1: @@ -5266,7 +5654,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-codec@4.0.1: @@ -5276,7 +5664,7 @@ packages: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 4.1.0 '@smithy/util-hex-encoding': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-serde-browser@4.0.1: @@ -5285,7 +5673,7 @@ packages: dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-serde-config-resolver@4.0.1: @@ -5293,7 +5681,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-serde-node@4.0.1: @@ -5302,7 +5690,7 @@ packages: dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/eventstream-serde-universal@4.0.1: @@ -5311,7 +5699,7 @@ packages: dependencies: '@smithy/eventstream-codec': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/fetch-http-handler@5.0.1: @@ -5322,7 +5710,7 @@ packages: '@smithy/querystring-builder': 4.0.1 '@smithy/types': 4.1.0 '@smithy/util-base64': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/hash-blob-browser@4.0.1: @@ -5332,7 +5720,7 @@ packages: '@smithy/chunked-blob-reader': 5.0.0 '@smithy/chunked-blob-reader-native': 4.0.0 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/hash-node@4.0.1: @@ -5342,7 +5730,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/hash-stream-node@4.0.1: @@ -5351,7 +5739,7 @@ packages: dependencies: '@smithy/types': 4.1.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/invalid-dependency@4.0.1: @@ -5359,21 +5747,21 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/is-array-buffer@2.2.0: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/is-array-buffer@4.0.0: resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/md5-js@4.0.1: @@ -5382,7 +5770,7 @@ packages: dependencies: '@smithy/types': 4.1.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-content-length@4.0.1: @@ -5391,7 +5779,7 @@ packages: dependencies: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-endpoint@4.0.6: @@ -5405,7 +5793,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-retry@4.0.7: @@ -5419,7 +5807,7 @@ packages: '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 - tslib: 2.6.2 + tslib: 2.8.1 uuid: 9.0.1 dev: false @@ -5428,7 +5816,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-stack@4.0.1: @@ -5436,7 +5824,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-config-provider@4.0.1: @@ -5446,7 +5834,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-http-handler@4.0.3: @@ -5457,7 +5845,7 @@ packages: '@smithy/protocol-http': 5.0.1 '@smithy/querystring-builder': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/property-provider@4.0.1: @@ -5465,7 +5853,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/protocol-http@5.0.1: @@ -5473,7 +5861,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/querystring-builder@4.0.1: @@ -5482,7 +5870,7 @@ packages: dependencies: '@smithy/types': 4.1.0 '@smithy/util-uri-escape': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/querystring-parser@4.0.1: @@ -5490,7 +5878,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/service-error-classification@4.0.1: @@ -5505,7 +5893,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/signature-v4@5.0.1: @@ -5519,7 +5907,7 @@ packages: '@smithy/util-middleware': 4.0.1 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/smithy-client@4.1.6: @@ -5532,14 +5920,14 @@ packages: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-stream': 4.1.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/types@4.1.0: resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/url-parser@4.0.1: @@ -5548,7 +5936,7 @@ packages: dependencies: '@smithy/querystring-parser': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-base64@4.0.0: @@ -5557,21 +5945,21 @@ packages: dependencies: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-browser@4.0.0: resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-node@4.0.0: resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-buffer-from@2.2.0: @@ -5579,7 +5967,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/is-array-buffer': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-buffer-from@4.0.0: @@ -5587,14 +5975,14 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/is-array-buffer': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-config-provider@4.0.0: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-browser@4.0.7: @@ -5605,7 +5993,7 @@ packages: '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-node@4.0.7: @@ -5618,7 +6006,7 @@ packages: '@smithy/property-provider': 4.0.1 '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-endpoints@3.0.1: @@ -5627,14 +6015,14 @@ packages: dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-hex-encoding@4.0.0: resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-middleware@4.0.1: @@ -5642,7 +6030,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-retry@4.0.1: @@ -5651,7 +6039,7 @@ packages: dependencies: '@smithy/service-error-classification': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-stream@4.1.2: @@ -5665,14 +6053,14 @@ packages: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-uri-escape@4.0.0: resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} engines: {node: '>=18.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-utf8@2.3.0: @@ -5680,7 +6068,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/util-buffer-from': 2.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-utf8@4.0.0: @@ -5688,7 +6076,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/util-buffer-from': 4.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-waiter@4.0.2: @@ -5697,9 +6085,13 @@ packages: dependencies: '@smithy/abort-controller': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: true + /@statelyai/inspect@0.1.0(ws@8.18.1): resolution: {integrity: sha512-wM9Zlll52GC6klt5PWAGqwj1zznbFciJkwHx8GZLrGiAstlnMTDBSrsiDfrvX2ejAsI5O1ysQrXFup0E2nYS8A==} dependencies: @@ -5712,19 +6104,24 @@ packages: /@swc/counter@0.1.3: resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - dev: false + + /@swc/helpers@0.5.15: + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + dependencies: + tslib: 2.8.1 + dev: true /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@swc/helpers@0.5.5: resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@t3-oss/env-core@0.10.1(typescript@5.3.3)(zod@3.23.8): @@ -5816,6 +6213,12 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + dependencies: + '@types/node': 20.11.24 + dev: true + /@types/d3-array@3.2.1: resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} dev: false @@ -6121,6 +6524,14 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} dev: true + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + /acorn-import-attributes@1.9.5(acorn@8.14.0): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -6208,7 +6619,7 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /as-table@1.0.55: @@ -6261,6 +6672,15 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -6271,6 +6691,14 @@ packages: file-uri-to-path: 1.0.0 dev: true + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} dev: true @@ -6315,6 +6743,13 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /bufferutil@4.0.9: resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} engines: {node: '>=6.14.2'} @@ -6332,7 +6767,6 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - dev: false /bytes@3.1.0: resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} @@ -6353,6 +6787,14 @@ packages: /caniuse-lite@1.0.30001593: resolution: {integrity: sha512-UWM1zlo3cZfkpBysd7AS+z+v007q9G1+fLTUU42rQnY6t2axoogPW/xol6T7juU5EUoOhML4WgBIdG+9yYqAjQ==} + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + /chalk@5.4.1: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -6379,6 +6821,13 @@ packages: readdirp: 4.1.2 dev: true + /chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + dependencies: + readdirp: 4.1.2 + dev: true + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -6399,9 +6848,25 @@ packages: clsx: 2.0.0 dev: false + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true /clsx@2.0.0: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} @@ -6497,11 +6962,24 @@ packages: engines: {node: '>= 0.6'} dev: true + /cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + dev: true + /cookie@1.0.2: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} dev: false + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -6622,6 +7100,11 @@ packages: resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} dev: false + /debounce@2.0.0: + resolution: {integrity: sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==} + engines: {node: '>=18'} + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -6654,6 +7137,17 @@ packages: engines: {node: '>=0.10'} dev: false + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true @@ -6701,6 +7195,33 @@ packages: csstype: 3.1.2 dev: false + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -6881,6 +7402,35 @@ packages: once: 1.3.3 dev: true + /engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + dev: true + + /engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + dependencies: + '@types/cors': 2.8.17 + '@types/node': 20.11.24 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7451,7 +8001,6 @@ packages: '@esbuild/win32-arm64': 0.25.0 '@esbuild/win32-ia32': 0.25.0 '@esbuild/win32-x64': 0.25.0 - dev: false /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -7484,6 +8033,10 @@ packages: resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} dev: true + /fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + dev: false + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -7654,6 +8207,18 @@ packages: minipass: 7.0.4 path-scurry: 1.10.1 + /glob@10.3.4: + resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.1.2 + path-scurry: 1.10.1 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -7666,15 +8231,45 @@ packages: path-is-absolute: 1.0.1 dev: true + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + /hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + /html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + dev: false + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + dev: false + /http-errors@1.4.0: resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} engines: {node: '>= 0.6'} @@ -7711,6 +8306,10 @@ packages: safer-buffer: 2.1.2 dev: true + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -7738,7 +8337,7 @@ packages: '@formatjs/ecma402-abstract': 2.0.0 '@formatjs/fast-memoize': 2.2.0 '@formatjs/icu-messageformat-parser': 2.7.8 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /invariant@2.2.4: @@ -7778,10 +8377,20 @@ packages: dependencies: is-extglob: 2.1.1 + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: true @@ -7828,7 +8437,6 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} @@ -7837,6 +8445,12 @@ packages: argparse: 2.0.1 dev: true + /jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + dev: true + /json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} dependencies: @@ -7856,6 +8470,10 @@ packages: graceful-fs: 4.2.11 dev: true + /leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + dev: false + /libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} cpu: [x64, arm64, wasm32] @@ -7884,12 +8502,19 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - dev: false /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -7925,6 +8550,21 @@ packages: engines: {node: '>=8'} dev: false + /marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + dev: false + + /md-to-react-email@5.0.5(react@18.2.0): + resolution: {integrity: sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==} + peerDependencies: + react: ^18.0 || ^19.0 + dependencies: + marked: 7.0.4 + react: 18.2.0 + dev: false + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -7946,12 +8586,29 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + /mime@3.0.0: resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} engines: {node: '>=10.0.0'} hasBin: true dev: true + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + /miniflare@3.20250310.0: resolution: {integrity: sha512-TQAxoo2ZiQYjiOJoK3bbcyjKD/u1E3akYOeSHc2Zcp1sLVydrgzSjmxtrn65/3BfDIrUgfYHyy9wspT6wzBy/A==} engines: {node: '>=16.13'} @@ -8029,7 +8686,6 @@ packages: /minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - dev: true /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -8098,6 +8754,11 @@ packages: hasBin: true dev: false + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + /next-safe-action@7.10.2(next@14.2.25)(react-dom@18.2.0)(react@18.2.0)(zod@3.23.8): resolution: {integrity: sha512-Tpho8EolopnbJFYNuRuA1sXvUxndGuWhk17HbrPl701uuNOA+fs9zQx4vWCjkGWRvfZap67HqKOBueX7/x2Tug==} engines: {node: '>=18.17'} @@ -8177,6 +8838,51 @@ packages: - babel-plugin-macros dev: false + /next@15.2.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + 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 + dependencies: + '@next/env': 15.2.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 + busboy: 1.6.0 + caniuse-lite: 1.0.30001593 + postcss: 8.4.31 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.6(react@18.2.0) + optionalDependencies: + '@next/swc-darwin-arm64': 15.2.3 + '@next/swc-darwin-x64': 15.2.3 + '@next/swc-linux-arm64-gnu': 15.2.3 + '@next/swc-linux-arm64-musl': 15.2.3 + '@next/swc-linux-x64-gnu': 15.2.3 + '@next/swc-linux-x64-musl': 15.2.3 + '@next/swc-win32-arm64-msvc': 15.2.3 + '@next/swc-win32-x64-msvc': 15.2.3 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: true + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -8291,6 +8997,28 @@ packages: wrappy: 1.0.2 dev: true + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + /os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -8308,6 +9036,13 @@ packages: engines: {node: '>=6'} dev: true + /parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + dev: false + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true @@ -8336,7 +9071,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 /path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} @@ -8360,6 +9095,10 @@ packages: resolution: {integrity: sha512-KF9XxmUQJ2DIlMj3TqNqY1AWvyvTuIuq11CuuekxyaYMiFuMKGgQrePYMX5bXKLhLG3sDI4CsGAYHPaT7VV7+g==} dev: true + /peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + dev: false + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: true @@ -8560,6 +9299,12 @@ packages: engines: {node: '>=14'} dev: true + /prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + dev: false + /pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} @@ -8571,6 +9316,11 @@ packages: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} dev: true + /prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + dev: false + /promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} dev: false @@ -8698,7 +9448,39 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 - dev: false + + /react-email@4.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-W+fdztx6qafK5xCYhKg1R/F0mQJHd+ubYTBk9FJMOqoEcgn7n/myPbPSKDWuGt/hYrvurCHs4DBNhj47sgecGA==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@babel/parser': 7.24.5 + '@babel/traverse': 7.25.6 + chalk: 4.1.2 + chokidar: 4.0.3 + commander: 11.1.0 + debounce: 2.0.0 + esbuild: 0.25.0 + glob: 10.3.4 + log-symbols: 4.1.0 + mime-types: 2.1.35 + next: 15.2.3(react-dom@18.2.0)(react@18.2.0) + normalize-path: 3.0.0 + ora: 5.4.1 + socket.io: 4.8.1 + transitivePeerDependencies: + - '@babel/core' + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - babel-plugin-react-compiler + - bufferutil + - react + - react-dom + - sass + - supports-color + - utf-8-validate + dev: true /react-hook-form@7.51.3(react@18.2.0): resolution: {integrity: sha512-cvJ/wbHdhYx8aviSWh28w9ImjmVsb5Y05n1+FW786vEZQJV5STNM0pW6ujS+oiBecb0ARBxJFyAnXj9+GHXACQ==} @@ -8713,6 +9495,12 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + dependencies: + fast-deep-equal: 2.0.1 + dev: false + /react-qr-code@2.0.15(react@18.2.0): resolution: {integrity: sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw==} peerDependencies: @@ -8736,7 +9524,7 @@ packages: '@types/react': 18.2.61 react: 18.2.0 react-style-singleton: 2.2.1(@types/react@18.2.61)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-remove-scroll@2.5.5(@types/react@18.2.61)(react@18.2.0): @@ -8753,7 +9541,7 @@ packages: react: 18.2.0 react-remove-scroll-bar: 2.3.6(@types/react@18.2.61)(react@18.2.0) react-style-singleton: 2.2.1(@types/react@18.2.61)(react@18.2.0) - tslib: 2.6.2 + tslib: 2.8.1 use-callback-ref: 1.3.2(@types/react@18.2.61)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.2.61)(react@18.2.0) dev: false @@ -8816,7 +9604,7 @@ packages: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): @@ -8838,13 +9626,21 @@ packages: engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - dev: false /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -8914,6 +9710,14 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -8930,6 +9734,10 @@ packages: dependencies: queue-microtask: 1.2.3 + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true @@ -8938,6 +9746,11 @@ packages: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + + /selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + dependencies: + parseley: 0.12.1 dev: false /semver@6.3.1: @@ -9017,6 +9830,10 @@ packages: reghex: 1.0.2 dev: true + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + /signal-exit@4.0.2: resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} engines: {node: '>=14'} @@ -9050,6 +9867,44 @@ packages: type-fest: 4.38.0 dev: false + /socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + dependencies: + debug: 4.3.4 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /sonner@1.4.41(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ==} peerDependencies: @@ -9121,7 +9976,6 @@ packages: /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - dev: false /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} @@ -9144,6 +9998,12 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9177,6 +10037,23 @@ packages: react: 18.2.0 dev: false + /styled-jsx@5.1.6(react@18.2.0): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: true + /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -9190,6 +10067,13 @@ packages: pirates: 4.0.6 ts-interface-checker: 0.1.13 + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -9523,7 +10407,7 @@ packages: dependencies: '@types/react': 18.2.61 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-debounce@10.0.1(react@18.2.0): @@ -9561,7 +10445,7 @@ packages: '@types/react': 18.2.61 detect-node-es: 1.1.0 react: 18.2.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -9598,6 +10482,11 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + /vercel@41.4.1: resolution: {integrity: sha512-o7zsdAuFls+gMotvzoXFIe6pdsxsWmkdeQx7sAw4qbNgmDe80e0/C8hLEUs3wLO8NRI5E1AlwS2MM8vYs+ljOg==} engines: {node: '>= 18'} @@ -9643,6 +10532,12 @@ packages: d3-timer: 3.0.1 dev: false + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + /web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -9737,6 +10632,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} From b7e20fc42e0330682fdfabfde4b8078ec9653386 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:45:47 -0500 Subject: [PATCH 05/30] adds registration confirmation --- apps/web/src/actions/register/new.ts | 12 +- .../emails/RegistrationConfirmation.tsx | 134 ++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 apps/web/src/components/emails/RegistrationConfirmation.tsx diff --git a/apps/web/src/actions/register/new.ts b/apps/web/src/actions/register/new.ts index 83aba7c3..371fbefe 100644 --- a/apps/web/src/actions/register/new.ts +++ b/apps/web/src/actions/register/new.ts @@ -5,6 +5,9 @@ import { insertUserWithDataSchemaFormified } from "db/zod"; import { db } from "db"; import { eq, or } from "db/drizzle"; import { users, data } from "db/schema"; +import RegistrationConfirmation from "@/components/emails/RegistrationConfirmation"; +import { sendEmail } from "@/lib/server/email"; +import c from "config"; export const createRegistration = authenticatedAction .schema(insertUserWithDataSchemaFormified) @@ -64,7 +67,14 @@ export const createRegistration = authenticatedAction interestedEventTypes: [], }); }); - + await sendEmail({ + to: lowerCasedEmail, + subject: `Welcome to ${c.clubName}!`, + name: `${c.universityName} <${c.clubName}>`, + body: RegistrationConfirmation({ + firstName: usersSchemaInputs.firstName, + }), + }); return { success: true, code: "success", diff --git a/apps/web/src/components/emails/RegistrationConfirmation.tsx b/apps/web/src/components/emails/RegistrationConfirmation.tsx new file mode 100644 index 00000000..7d951e62 --- /dev/null +++ b/apps/web/src/components/emails/RegistrationConfirmation.tsx @@ -0,0 +1,134 @@ +import { + Body, + Button, + Column, + Container, + Head, + Heading, + Html, + Img, + Link, + Preview, + Row, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import type * as React from "react"; +import c, { emailsConfig } from "config"; + +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; + +export default function RegistrationConfirmation({ firstName }: { firstName: string }) { + return ( + + + + {`${c.universityName} ${c.clubName} Welcome`} + + Logo +
+ + {`Welcome to ${c.universityName} ${c.clubName}`} + + +
+ + + {`Hi ${firstName},`} + + + Thanks for registering with us and we are + happy to have you as one of our members. As you might know, ACM is always dedicated to our members and we want to help you get familiar with us and our membership portal. + + + Here's how to get started: + + +
+
    +
  • + + Go update your account information.{" "} + + Things might have changed since you were last + here so be sure to{" "} + + update your settings. + +
  • +
  • + Check out our upcoming events! + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} + + check out what is happening soon. + +
  • +
  • + + Check out how we bring our websites to life.{" "} + + All of our source code for the things we build + are open source.{" "} + + Stop by our Github for more. + +
  • +
+ +
+ +
+ +
+ {emailsConfig.footerLinks.map((link) => ( +
+ + {link.name} + {" "} + +
+ ))} +
+
+ + + + {`${emailsConfig.rightsReservedString}`} + + + +
+ + ); +} From ed87960fe1cee1c0e077753d5797d02b5c223a65 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:46:12 -0500 Subject: [PATCH 06/30] adds account connection email --- apps/web/src/actions/register/migrate.ts | 8 ++ .../components/emails/AccountConnected.tsx | 136 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 apps/web/src/components/emails/AccountConnected.tsx diff --git a/apps/web/src/actions/register/migrate.ts b/apps/web/src/actions/register/migrate.ts index fe30b2af..2e9f49fe 100644 --- a/apps/web/src/actions/register/migrate.ts +++ b/apps/web/src/actions/register/migrate.ts @@ -6,6 +6,8 @@ import { db } from "db"; import { and, eq, isNull } from "db/drizzle"; import { users, data } from "db/schema"; import { currentUser } from "@clerk/nextjs/server"; +import AccountConnected from "@/components/emails/AccountConnected"; +import { sendEmail } from "@/lib/server/email"; import c from "config"; export const doPortalLookupCheck = authenticatedAction @@ -67,6 +69,12 @@ export const doPortalLink = authenticatedAction .update(users) .set({ clerkID, email: userEmail }) .where(eq(users.userID, lookup[0].userID)); + await sendEmail({ + to: userEmail, + subject: `Welcome back to ${c.clubName}!`, + name: `${c.universityName} ${c.clubName}`, + body: AccountConnected({ firstName: lookup[0].firstName }), + }); return { success: true, }; diff --git a/apps/web/src/components/emails/AccountConnected.tsx b/apps/web/src/components/emails/AccountConnected.tsx new file mode 100644 index 00000000..937d9418 --- /dev/null +++ b/apps/web/src/components/emails/AccountConnected.tsx @@ -0,0 +1,136 @@ +import { + Body, + Button, + Column, + Container, + Head, + Heading, + Html, + Img, + Link, + Preview, + Row, + Section, + Tailwind, + Text, +} from "@react-email/components"; +import type * as React from "react"; +import c, { emailsConfig } from "config"; + +const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; + +export default function AccountConnected({firstName}: { firstName: string }) { + return ( + + + + {`${c.universityName} ${c.clubName} Welcome`} + + Logo +
+ + {`Welcome back to ${c.universityName} ${c.clubName}`} + + +
+ + + {`Hi ${firstName},`} + + + Thanks for connecting your account. We are + glad to have you back with us. Things have + changed since you were last here. Lots of + updates and enhancements that we hope you + will enjoy. + + + Here's how to get started: + + +
+
    +
  • + + Go update your account information.{" "} + + Things might have changed since you were last + here so be sure to{" "} + + update your settings. + +
  • +
  • + + Check out our upcoming events!{" "} + + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} + + check out what is happening soon. + +
  • +
  • + + Check out how we bring our websites to life.{" "} + + All of our source code for the things we build are open source.{" "} + + Stop by our Github for more. + +
  • +
+ +
+ +
+ +
+ {emailsConfig.footerLinks.map((link) => ( +
+ + {link.name} + {" "} + +
+ ))} +
+
+ + + + {`${emailsConfig.rightsReservedString}`} + + + +
+ + ); +}; + From 82740516168eb89fe4502d83b3bbaef617822c4f Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:46:31 -0500 Subject: [PATCH 07/30] updates env --- apps/web/src/env.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts index ce4b5b75..15c847e8 100644 --- a/apps/web/src/env.ts +++ b/apps/web/src/env.ts @@ -3,10 +3,11 @@ import { z } from "zod"; export const env = createEnv({ server: { - CLERK_SECRET_KEY: z.string().min(1), + CLERK_SECRET_KEY: z.string(), }, client: { - NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().min(1), + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), + NEXT_PUBLIC_BASE_URL:z.string(), }, // If you're using Next.js < 13.4.4, you'll need to specify the runtimeEnv manually // runtimeEnv: { @@ -18,5 +19,6 @@ export const env = createEnv({ experimental__runtimeEnv: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, + NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL, }, }); From 33ae7148f7cd199cc482ee18f9268b12e9aa3a48 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:46:51 -0500 Subject: [PATCH 08/30] adds email functionality --- apps/web/src/actions/email.ts | 40 ++++++++++++++++++++++++++++++++ apps/web/src/lib/server/email.ts | 38 ++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 apps/web/src/actions/email.ts create mode 100644 apps/web/src/lib/server/email.ts diff --git a/apps/web/src/actions/email.ts b/apps/web/src/actions/email.ts new file mode 100644 index 00000000..ba8b3901 --- /dev/null +++ b/apps/web/src/actions/email.ts @@ -0,0 +1,40 @@ +"use server"; +import { authenticatedAction } from "@/lib/safe-action"; +import z from "zod"; +import { sendEmail } from "@/lib/server/email"; + +const emailSchema = z + .string({ + invalid_type_error: "Email needs to be a string", + required_error: "Email is required", + }) + .email({ message: "Invalid email address" }) + .transform((e) => e.toLowerCase()); + +const emailPropsSchema = z.object({ + subscribed: z + .boolean({ invalid_type_error: "Subscribed should be a boolean" }) + .optional(), + from: emailSchema.optional(), + name: z.string().optional(), + reply: emailSchema.optional(), + to: z + .array(emailSchema) + .max(5, "You can only send transactional emails to 5 people at a time") + .or(emailSchema.transform((e) => [e])), + subject: z.string({ + required_error: + "Subject is required. Read more: https://docs.useplunk.com/api-reference/transactional/send", + }), + body: z.string({ + required_error: + "Body is required. Read more: https://docs.useplunk.com/api-reference/transactional/send", + }), + headers: z.record(z.string()).optional(), +}); + +export const sendEmailAction = authenticatedAction + .schema(emailPropsSchema) + .action(async ({ parsedInput }) => { + await sendEmail(parsedInput); + }); diff --git a/apps/web/src/lib/server/email.ts b/apps/web/src/lib/server/email.ts new file mode 100644 index 00000000..0dcd900a --- /dev/null +++ b/apps/web/src/lib/server/email.ts @@ -0,0 +1,38 @@ +import { render } from "@react-email/components"; +import { ReactElement } from "react"; +import {emailsConfig} from "config"; + +export interface SendEmailProps { + to: string | Array; + subject: string; + body: string | ReactElement; + subscribed?: boolean; + name?: string; + from?: string; + reply?: string; + headers?: Record; +} + +export async function sendEmail(sendEmailProps: SendEmailProps) { + if (!emailsConfig.useEmailService) { + return; + } + sendEmailProps.body = + typeof sendEmailProps.body === "string" + ? sendEmailProps.body + : await render(sendEmailProps.body); + const options = { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${process.env.PLUNK_API_KEY}`, + }, + body: JSON.stringify(sendEmailProps), + }; + + const res = await fetch(`${process.env.PLUNK_BASE_URL}/send`, options); + if (!res.ok) { + console.error(res); + throw new Error("Failed to send email"); + } +} From 8cc2cb1362a3a9f866d26743fe8e03ce94dda883 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:46:58 -0500 Subject: [PATCH 09/30] updates edit --- apps/web/src/actions/settings/edit.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/actions/settings/edit.ts b/apps/web/src/actions/settings/edit.ts index e59949a7..8e02e9e4 100644 --- a/apps/web/src/actions/settings/edit.ts +++ b/apps/web/src/actions/settings/edit.ts @@ -39,7 +39,7 @@ export const editAccountSettings = userAction }; } - revalidatePath("/settings"); + // revalidatePath("/settings"); return { success: true }; }, ); @@ -74,7 +74,7 @@ export const editAcademicSettings = userAction }; } - revalidatePath("/settings"); + // revalidatePath("/settings"); return { success: true }; }, ); @@ -90,7 +90,7 @@ export const editResumeUrl = userAction if (oldResume) await del(oldResume); - revalidatePath("/settings"); + // revalidatePath("/settings"); return { success: true }; } catch (error) { // Failed to update user data to new resume. Delete the new resume from the blob and make the user try again. @@ -120,7 +120,7 @@ export const editClubSettings = userAction }; } - revalidatePath("/settings"); + // revalidatePath("/settings"); return { success: true }; }, ); From e23a0a3178bc9ac15abc3d3453bc8c8c04d52338 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:47:27 -0500 Subject: [PATCH 10/30] formatter --- .../components/emails/AccountConnected.tsx | 21 ++++++++++--------- .../emails/RegistrationConfirmation.tsx | 11 ++++++++-- apps/web/src/env.ts | 2 +- apps/web/src/lib/server/email.ts | 2 +- packages/config/clubkit.config.ts | 8 ++++++- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/apps/web/src/components/emails/AccountConnected.tsx b/apps/web/src/components/emails/AccountConnected.tsx index 937d9418..6b8957f0 100644 --- a/apps/web/src/components/emails/AccountConnected.tsx +++ b/apps/web/src/components/emails/AccountConnected.tsx @@ -19,7 +19,7 @@ import c, { emailsConfig } from "config"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; -export default function AccountConnected({firstName}: { firstName: string }) { +export default function AccountConnected({ firstName }: { firstName: string }) { return ( @@ -66,12 +66,12 @@ export default function AccountConnected({firstName}: { firstName: string }) { updates and enhancements that we hope you will enjoy. - + Here's how to get started: -
    +
    • Go update your account information.{" "} @@ -83,9 +83,7 @@ export default function AccountConnected({firstName}: { firstName: string }) {
    • - - Check out our upcoming events!{" "} - + Check out our upcoming events! {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} check out what is happening soon. @@ -95,7 +93,8 @@ export default function AccountConnected({firstName}: { firstName: string }) { Check out how we bring our websites to life.{" "} - All of our source code for the things we build are open source.{" "} + All of our source code for the things we build + are open source.{" "} Stop by our Github for more. @@ -103,7 +102,10 @@ export default function AccountConnected({firstName}: { firstName: string }) {
    -
    @@ -132,5 +134,4 @@ export default function AccountConnected({firstName}: { firstName: string }) { ); -}; - +} diff --git a/apps/web/src/components/emails/RegistrationConfirmation.tsx b/apps/web/src/components/emails/RegistrationConfirmation.tsx index 7d951e62..0280d87b 100644 --- a/apps/web/src/components/emails/RegistrationConfirmation.tsx +++ b/apps/web/src/components/emails/RegistrationConfirmation.tsx @@ -19,7 +19,11 @@ import c, { emailsConfig } from "config"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; -export default function RegistrationConfirmation({ firstName }: { firstName: string }) { +export default function RegistrationConfirmation({ + firstName, +}: { + firstName: string; +}) { return ( @@ -61,7 +65,10 @@ export default function RegistrationConfirmation({ firstName }: { firstName: str Thanks for registering with us and we are - happy to have you as one of our members. As you might know, ACM is always dedicated to our members and we want to help you get familiar with us and our membership portal. + happy to have you as one of our members. As + you might know, ACM is always dedicated to + our members and we want to help you get + familiar with us and our membership portal. Here's how to get started: diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts index 15c847e8..45cda33e 100644 --- a/apps/web/src/env.ts +++ b/apps/web/src/env.ts @@ -7,7 +7,7 @@ export const env = createEnv({ }, client: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), - NEXT_PUBLIC_BASE_URL:z.string(), + NEXT_PUBLIC_BASE_URL: z.string(), }, // If you're using Next.js < 13.4.4, you'll need to specify the runtimeEnv manually // runtimeEnv: { diff --git a/apps/web/src/lib/server/email.ts b/apps/web/src/lib/server/email.ts index 0dcd900a..9544aba6 100644 --- a/apps/web/src/lib/server/email.ts +++ b/apps/web/src/lib/server/email.ts @@ -1,6 +1,6 @@ import { render } from "@react-email/components"; import { ReactElement } from "react"; -import {emailsConfig} from "config"; +import { emailsConfig } from "config"; export interface SendEmailProps { to: string | Array; diff --git a/packages/config/clubkit.config.ts b/packages/config/clubkit.config.ts index 8cc6396c..390e1ded 100644 --- a/packages/config/clubkit.config.ts +++ b/packages/config/clubkit.config.ts @@ -250,4 +250,10 @@ const staticUploads = { } as const; export default c; -export { majors, staticUploads, bucketEventThumbnailBaseUrl, bucketBaseUrl, emailsConfig }; +export { + majors, + staticUploads, + bucketEventThumbnailBaseUrl, + bucketBaseUrl, + emailsConfig, +}; From 4e5687d3278e6fe0505b1469ce3a676bcef08501 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 7 Apr 2025 23:55:33 -0500 Subject: [PATCH 11/30] updates data cleaning --- apps/web/src/actions/register/migrate.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/web/src/actions/register/migrate.ts b/apps/web/src/actions/register/migrate.ts index 2e9f49fe..0a4c35e0 100644 --- a/apps/web/src/actions/register/migrate.ts +++ b/apps/web/src/actions/register/migrate.ts @@ -12,7 +12,7 @@ import c from "config"; export const doPortalLookupCheck = authenticatedAction .schema( - z.object({ universityID: z.string().min(1), email: z.string().min(1) }), + z.object({ universityID: z.string().min(1).max(255), email: z.string().min(1).max(255) }), ) .action(async ({ parsedInput: { email, universityID } }) => { const lookup = await db @@ -42,18 +42,20 @@ export const doPortalLookupCheck = authenticatedAction export const doPortalLink = authenticatedAction .schema( - z.object({ universityID: z.string().min(1), email: z.string().min(1) }), + z.object({ universityID: z.string().min(1).max(255), email: z.string().min(1).max(255) }), ) .action( async ({ ctx: { clerkID }, parsedInput: { email, universityID } }) => { + const emailLower = email.toLowerCase(); + const universityIDLower = universityID.toLowerCase(); const lookup = await db .select() .from(users) .where( and( - eq(users.email, email.toLowerCase()), + eq(users.email, emailLower), isNull(users.clerkID), - eq(users.universityID, universityID.toLowerCase()), + eq(users.universityID, universityIDLower), ), ) .limit(1); @@ -67,7 +69,7 @@ export const doPortalLink = authenticatedAction if (lookup[0]) { await db .update(users) - .set({ clerkID, email: userEmail }) + .set({ clerkID, email: userEmail, universityID: universityIDLower }) .where(eq(users.userID, lookup[0].userID)); await sendEmail({ to: userEmail, From cabcc6698965f6907d690d98f5510b7d5ba7e1f0 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Tue, 8 Apr 2025 00:23:49 -0500 Subject: [PATCH 12/30] updates email components --- .../src/components/emails/AccountConnected.tsx | 16 +++++++++------- .../emails/RegistrationConfirmation.tsx | 10 +++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/web/src/components/emails/AccountConnected.tsx b/apps/web/src/components/emails/AccountConnected.tsx index 6b8957f0..a510d8ea 100644 --- a/apps/web/src/components/emails/AccountConnected.tsx +++ b/apps/web/src/components/emails/AccountConnected.tsx @@ -40,7 +40,11 @@ export default function AccountConnected({ firstName }: { firstName: string }) { }, }} > - {`${c.universityName} ${c.clubName} Welcome`} + {`Welcome back to ${c.universityName} ${c.clubName}. Thanks for connecting your account. We are + glad to have you back with us. Things have + changed since you were last here. Lots of + updates and enhancements that we hope you + will enjoy.`} Logo -
    + {`Welcome back to ${c.universityName} ${c.clubName}`} @@ -84,10 +88,8 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
  • Check out our upcoming events! - {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} - - check out what is happening soon. - + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to check out the upcoming `} + events.
  • @@ -123,7 +125,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
  • ))} - + diff --git a/apps/web/src/components/emails/RegistrationConfirmation.tsx b/apps/web/src/components/emails/RegistrationConfirmation.tsx index 0280d87b..a372fb45 100644 --- a/apps/web/src/components/emails/RegistrationConfirmation.tsx +++ b/apps/web/src/components/emails/RegistrationConfirmation.tsx @@ -44,7 +44,11 @@ export default function RegistrationConfirmation({ }, }} > - {`${c.universityName} ${c.clubName} Welcome`} + {`Welcome to ${c.universityName} ${c.clubName}. Thanks for registering with us and we are + happy to have you as one of our members. As + you might know, ACM is always dedicated to + our members and we want to help you get + familiar with us and our membership portal.`} Logo -
    + {`Welcome to ${c.universityName} ${c.clubName}`} @@ -127,7 +131,7 @@ export default function RegistrationConfirmation({
    ))} - +
    From 01772180b83a9849d79e824234ca42ed319078e2 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 13:28:13 -0500 Subject: [PATCH 13/30] refactor emails to own package --- apps/web/package.json | 3 +- apps/web/src/actions/register/migrate.ts | 4 +- apps/web/tsconfig.json | 2 +- .../emails/components}/AccountConnected.tsx | 46 ++++++++----------- .../components}/RegistrationConfirmation.tsx | 44 ++++++++---------- packages/emails/components/index.ts | 2 + packages/emails/components/shared.tsx | 26 +++++++++++ packages/emails/index.ts | 2 + packages/emails/package.json | 25 ++++++++++ packages/emails/tsconfig.json | 29 ++++++++++++ .../email.ts => packages/emails/utils.ts | 0 pnpm-lock.yaml | 39 +++++++++++++--- 12 files changed, 160 insertions(+), 62 deletions(-) rename {apps/web/src/components/emails => packages/emails/components}/AccountConnected.tsx (80%) rename {apps/web/src/components/emails => packages/emails/components}/RegistrationConfirmation.tsx (80%) create mode 100644 packages/emails/components/index.ts create mode 100644 packages/emails/components/shared.tsx create mode 100644 packages/emails/index.ts create mode 100644 packages/emails/package.json create mode 100644 packages/emails/tsconfig.json rename apps/web/src/lib/server/email.ts => packages/emails/utils.ts (100%) diff --git a/apps/web/package.json b/apps/web/package.json index 83f45a77..c0b6a53d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -70,7 +70,8 @@ "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", "use-debounce": "^10.0.1", - "zod": "^3.23.8" + "zod": "^3.23.8", + "emails": "workspace:*" }, "devDependencies": { "@cloudflare/next-on-pages": "^1.13.10", diff --git a/apps/web/src/actions/register/migrate.ts b/apps/web/src/actions/register/migrate.ts index 0a4c35e0..5154538b 100644 --- a/apps/web/src/actions/register/migrate.ts +++ b/apps/web/src/actions/register/migrate.ts @@ -6,8 +6,8 @@ import { db } from "db"; import { and, eq, isNull } from "db/drizzle"; import { users, data } from "db/schema"; import { currentUser } from "@clerk/nextjs/server"; -import AccountConnected from "@/components/emails/AccountConnected"; -import { sendEmail } from "@/lib/server/email"; +import {AccountConnected} from "emails/components" +import { sendEmail } from "emails/utils"; import c from "config"; export const doPortalLookupCheck = authenticatedAction diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 822e1ec7..32615cc8 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -21,7 +21,7 @@ "@/*": ["./src/*"] }, }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/emails/utils.ts"], "exclude": ["node_modules"], "types": [ "@cloudflare/workers-types/2024-07-29" diff --git a/apps/web/src/components/emails/AccountConnected.tsx b/packages/emails/components/AccountConnected.tsx similarity index 80% rename from apps/web/src/components/emails/AccountConnected.tsx rename to packages/emails/components/AccountConnected.tsx index a510d8ea..a8aba218 100644 --- a/apps/web/src/components/emails/AccountConnected.tsx +++ b/packages/emails/components/AccountConnected.tsx @@ -16,6 +16,7 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; +import { DefaultFooter, DefaultHeader } from "./shared"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; @@ -46,13 +47,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) { updates and enhancements that we hope you will enjoy.`} - Logo + {`Welcome back to ${c.universityName} ${c.clubName}`} @@ -112,26 +107,25 @@ export default function AccountConnected({ firstName }: { firstName: string }) { -
    - {emailsConfig.footerLinks.map((link) => ( -
    - - {link.name} - {" "} - -
    - ))} -
    -
    - - - - {`${emailsConfig.rightsReservedString}`} - +
    + + {emailsConfig.footerLinks.map((link) => ( + + + {link.name} + {" "} + + → + + + ))} + +
    + diff --git a/apps/web/src/components/emails/RegistrationConfirmation.tsx b/packages/emails/components/RegistrationConfirmation.tsx similarity index 80% rename from apps/web/src/components/emails/RegistrationConfirmation.tsx rename to packages/emails/components/RegistrationConfirmation.tsx index a372fb45..efc35eb4 100644 --- a/apps/web/src/components/emails/RegistrationConfirmation.tsx +++ b/packages/emails/components/RegistrationConfirmation.tsx @@ -16,6 +16,7 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; +import { DefaultFooter, DefaultHeader } from "./shared"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; @@ -50,13 +51,7 @@ export default function RegistrationConfirmation({ our members and we want to help you get familiar with us and our membership portal.`} - Logo + {`Welcome to ${c.universityName} ${c.clubName}`} @@ -118,26 +113,23 @@ export default function RegistrationConfirmation({ -
    - {emailsConfig.footerLinks.map((link) => ( -
    - - {link.name} - {" "} - -
    - ))} -
    -
    - - - - {`${emailsConfig.rightsReservedString}`} - + + {emailsConfig.footerLinks.map((link) => ( + + + {link.name} + {" "} + + → + + + ))} + + diff --git a/packages/emails/components/index.ts b/packages/emails/components/index.ts new file mode 100644 index 00000000..cf774f8d --- /dev/null +++ b/packages/emails/components/index.ts @@ -0,0 +1,2 @@ +export {default as AccountConnected} from "./AccountConnected" +export {default as RegistrationConfirmation} from "./RegistrationConfirmation" \ No newline at end of file diff --git a/packages/emails/components/shared.tsx b/packages/emails/components/shared.tsx new file mode 100644 index 00000000..5b786164 --- /dev/null +++ b/packages/emails/components/shared.tsx @@ -0,0 +1,26 @@ +import { Container, Text, Img } from "@react-email/components" +import { emailsConfig } from "config" + +function DefaultFooter(){ + return ( + + + {`${emailsConfig.rightsReservedString}`} + + + ) +} + +function DefaultHeader(){ + return ( + Logo + ); +} + +export {DefaultFooter, DefaultHeader} \ No newline at end of file diff --git a/packages/emails/index.ts b/packages/emails/index.ts new file mode 100644 index 00000000..4ca67d4d --- /dev/null +++ b/packages/emails/index.ts @@ -0,0 +1,2 @@ +export * as components from "./components/index"; +export * as utils from "./utils"; \ No newline at end of file diff --git a/packages/emails/package.json b/packages/emails/package.json new file mode 100644 index 00000000..ad538623 --- /dev/null +++ b/packages/emails/package.json @@ -0,0 +1,25 @@ +{ + "name": "emails", + "version": "1.0.0", + "description": "", + "main": "./index.tsx", + "types": "./index.tsx", + "scripts": { + "dev": "email dev --dir ./components --port 3001" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/node": "^20.11.24", + "react-email": "4.0.4" + }, + "dependencies": { + "@react-email/components": "0.0.36", + "@types/react": "^18", + "@types/react-dom": "^18", + "config": "workspace:*", + "react": "^18", + "react-dom": "^18" + } +} diff --git a/packages/emails/tsconfig.json b/packages/emails/tsconfig.json new file mode 100644 index 00000000..32615cc8 --- /dev/null +++ b/packages/emails/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "../../packages/emails/utils.ts"], + "exclude": ["node_modules"], + "types": [ + "@cloudflare/workers-types/2024-07-29" +] +} diff --git a/apps/web/src/lib/server/email.ts b/packages/emails/utils.ts similarity index 100% rename from apps/web/src/lib/server/email.ts rename to packages/emails/utils.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69892a8e..3b271e3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -187,6 +187,9 @@ importers: dotenv-cli: specifier: ^7.4.1 version: 7.4.1 + emails: + specifier: workspace:* + version: link:../../packages/emails jiti: specifier: ^1.21.0 version: 1.21.0 @@ -308,6 +311,34 @@ importers: specifier: ^3.23.8 version: 3.23.8 + packages/emails: + dependencies: + '@react-email/components': + specifier: 0.0.36 + version: 0.0.36(react-dom@18.2.0)(react@18.2.0) + '@types/react': + specifier: ^18 + version: 18.2.61 + '@types/react-dom': + specifier: ^18 + version: 18.2.19 + config: + specifier: workspace:* + version: link:../config + react: + specifier: ^18 + version: 18.2.0 + react-dom: + specifier: ^18 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/node': + specifier: ^20.11.24 + version: 20.11.24 + react-email: + specifier: 4.0.4 + version: 4.0.4(react-dom@18.2.0)(react@18.2.0) + packages/typescript-config: {} packages: @@ -6299,7 +6330,7 @@ packages: dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 - csstype: 3.1.2 + csstype: 3.1.3 /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} @@ -6997,12 +7028,8 @@ packages: engines: {node: '>=4'} hasBin: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false /d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} @@ -7192,7 +7219,7 @@ packages: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: '@babel/runtime': 7.24.5 - csstype: 3.1.2 + csstype: 3.1.3 dev: false /dom-serializer@2.0.0: From 72f46403f15d500445fc30e162c767302a4acda3 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 13:37:21 -0500 Subject: [PATCH 14/30] fixes imports --- apps/web/src/actions/email.ts | 2 +- apps/web/src/actions/register/new.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web/src/actions/email.ts b/apps/web/src/actions/email.ts index ba8b3901..6e09bf74 100644 --- a/apps/web/src/actions/email.ts +++ b/apps/web/src/actions/email.ts @@ -1,7 +1,7 @@ "use server"; import { authenticatedAction } from "@/lib/safe-action"; import z from "zod"; -import { sendEmail } from "@/lib/server/email"; +import { sendEmail } from "emails/utils"; const emailSchema = z .string({ diff --git a/apps/web/src/actions/register/new.ts b/apps/web/src/actions/register/new.ts index 371fbefe..f02aa0c1 100644 --- a/apps/web/src/actions/register/new.ts +++ b/apps/web/src/actions/register/new.ts @@ -5,8 +5,8 @@ import { insertUserWithDataSchemaFormified } from "db/zod"; import { db } from "db"; import { eq, or } from "db/drizzle"; import { users, data } from "db/schema"; -import RegistrationConfirmation from "@/components/emails/RegistrationConfirmation"; -import { sendEmail } from "@/lib/server/email"; +import { RegistrationConfirmation } from "emails/components"; +import { sendEmail } from "emails/utils"; import c from "config"; export const createRegistration = authenticatedAction From 0739f4455d3d3b5785936afa609ce176286b9cb8 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 13:56:45 -0500 Subject: [PATCH 15/30] updates component styling --- .../emails/components/AccountConnected.tsx | 20 ++----------------- .../components/RegistrationConfirmation.tsx | 20 +++---------------- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/packages/emails/components/AccountConnected.tsx b/packages/emails/components/AccountConnected.tsx index a8aba218..8c9c7851 100644 --- a/packages/emails/components/AccountConnected.tsx +++ b/packages/emails/components/AccountConnected.tsx @@ -16,7 +16,7 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; -import { DefaultFooter, DefaultHeader } from "./shared"; +import { DefaultFooter, DefaultHeader, RowLinks } from "./shared"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; @@ -107,23 +107,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) { -
    - - {emailsConfig.footerLinks.map((link) => ( - - - {link.name} - {" "} - - → - - - ))} - -
    +
    diff --git a/packages/emails/components/RegistrationConfirmation.tsx b/packages/emails/components/RegistrationConfirmation.tsx index efc35eb4..8655e4bc 100644 --- a/packages/emails/components/RegistrationConfirmation.tsx +++ b/packages/emails/components/RegistrationConfirmation.tsx @@ -16,7 +16,7 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; -import { DefaultFooter, DefaultHeader } from "./shared"; +import { DefaultFooter, DefaultHeader, RowLinks } from "./shared"; const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; @@ -113,23 +113,9 @@ export default function RegistrationConfirmation({ - - {emailsConfig.footerLinks.map((link) => ( - - - {link.name} - {" "} - - → - - - ))} - + - + From f2d4ffc2036dc189b35e90dddc0f955a87289147 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 13:56:50 -0500 Subject: [PATCH 16/30] formatter --- apps/web/src/actions/register/migrate.ts | 18 +++++++-- packages/emails/components/index.ts | 4 +- packages/emails/components/shared.tsx | 47 +++++++++++++++++++----- packages/emails/index.ts | 2 +- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/apps/web/src/actions/register/migrate.ts b/apps/web/src/actions/register/migrate.ts index 5154538b..5b91f52a 100644 --- a/apps/web/src/actions/register/migrate.ts +++ b/apps/web/src/actions/register/migrate.ts @@ -6,13 +6,16 @@ import { db } from "db"; import { and, eq, isNull } from "db/drizzle"; import { users, data } from "db/schema"; import { currentUser } from "@clerk/nextjs/server"; -import {AccountConnected} from "emails/components" +import { AccountConnected } from "emails/components"; import { sendEmail } from "emails/utils"; import c from "config"; export const doPortalLookupCheck = authenticatedAction .schema( - z.object({ universityID: z.string().min(1).max(255), email: z.string().min(1).max(255) }), + z.object({ + universityID: z.string().min(1).max(255), + email: z.string().min(1).max(255), + }), ) .action(async ({ parsedInput: { email, universityID } }) => { const lookup = await db @@ -42,7 +45,10 @@ export const doPortalLookupCheck = authenticatedAction export const doPortalLink = authenticatedAction .schema( - z.object({ universityID: z.string().min(1).max(255), email: z.string().min(1).max(255) }), + z.object({ + universityID: z.string().min(1).max(255), + email: z.string().min(1).max(255), + }), ) .action( async ({ ctx: { clerkID }, parsedInput: { email, universityID } }) => { @@ -69,7 +75,11 @@ export const doPortalLink = authenticatedAction if (lookup[0]) { await db .update(users) - .set({ clerkID, email: userEmail, universityID: universityIDLower }) + .set({ + clerkID, + email: userEmail, + universityID: universityIDLower, + }) .where(eq(users.userID, lookup[0].userID)); await sendEmail({ to: userEmail, diff --git a/packages/emails/components/index.ts b/packages/emails/components/index.ts index cf774f8d..927fb81d 100644 --- a/packages/emails/components/index.ts +++ b/packages/emails/components/index.ts @@ -1,2 +1,2 @@ -export {default as AccountConnected} from "./AccountConnected" -export {default as RegistrationConfirmation} from "./RegistrationConfirmation" \ No newline at end of file +export { default as AccountConnected } from "./AccountConnected"; +export { default as RegistrationConfirmation } from "./RegistrationConfirmation"; diff --git a/packages/emails/components/shared.tsx b/packages/emails/components/shared.tsx index 5b786164..8a7c7020 100644 --- a/packages/emails/components/shared.tsx +++ b/packages/emails/components/shared.tsx @@ -1,17 +1,25 @@ -import { Container, Text, Img } from "@react-email/components" -import { emailsConfig } from "config" +import { + Container, + Text, + Img, + Section, + Row, + Link, + Column, +} from "@react-email/components"; +import { emailsConfig } from "config"; -function DefaultFooter(){ - return ( - - +function DefaultFooter() { + return ( + + {`${emailsConfig.rightsReservedString}`} - + - ) + ); } -function DefaultHeader(){ +function DefaultHeader() { return ( + + {emailsConfig.footerLinks.map((link) => ( + + + {link.name} + {" "} + + ))} + + + ); +} + +export { DefaultFooter, DefaultHeader, RowLinks }; diff --git a/packages/emails/index.ts b/packages/emails/index.ts index 4ca67d4d..4654b07b 100644 --- a/packages/emails/index.ts +++ b/packages/emails/index.ts @@ -1,2 +1,2 @@ export * as components from "./components/index"; -export * as utils from "./utils"; \ No newline at end of file +export * as utils from "./utils"; From a03696dbe9e041e2f229467c860b0e6872351cd4 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 17:14:22 -0500 Subject: [PATCH 17/30] updates shared --- .../emails/components/AccountConnected.tsx | 25 +++++++++++++++++-- .../components/RegistrationConfirmation.tsx | 23 ++++++++++++++++- packages/emails/components/shared.tsx | 10 +++++++- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/packages/emails/components/AccountConnected.tsx b/packages/emails/components/AccountConnected.tsx index 8c9c7851..6355d276 100644 --- a/packages/emails/components/AccountConnected.tsx +++ b/packages/emails/components/AccountConnected.tsx @@ -53,7 +53,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) { {`Welcome back to ${c.universityName} ${c.clubName}`} -
    +
    {`Hi ${firstName},`} @@ -107,7 +107,28 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
    - +
    + + {emailsConfig.footerLinks.map((link) => ( + + + {link.name} + {" "} + + ))} + +
    diff --git a/packages/emails/components/RegistrationConfirmation.tsx b/packages/emails/components/RegistrationConfirmation.tsx index 8655e4bc..7eb73c48 100644 --- a/packages/emails/components/RegistrationConfirmation.tsx +++ b/packages/emails/components/RegistrationConfirmation.tsx @@ -113,7 +113,28 @@ export default function RegistrationConfirmation({
    - +
    + + {emailsConfig.footerLinks.map((link) => ( + + + {link.name} + {" "} + + ))} + +
    diff --git a/packages/emails/components/shared.tsx b/packages/emails/components/shared.tsx index 8a7c7020..0e55c807 100644 --- a/packages/emails/components/shared.tsx +++ b/packages/emails/components/shared.tsx @@ -33,7 +33,15 @@ function DefaultHeader() { function RowLinks() { return ( -
    +
    {emailsConfig.footerLinks.map((link) => ( From cee109dc81ff19d4575c5944c2d2de8686e48f43 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 20:35:23 -0500 Subject: [PATCH 18/30] updates email format --- apps/web/src/actions/register/new.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/web/src/actions/register/new.ts b/apps/web/src/actions/register/new.ts index f02aa0c1..b429465c 100644 --- a/apps/web/src/actions/register/new.ts +++ b/apps/web/src/actions/register/new.ts @@ -67,14 +67,21 @@ export const createRegistration = authenticatedAction interestedEventTypes: [], }); }); - await sendEmail({ - to: lowerCasedEmail, - subject: `Welcome to ${c.clubName}!`, - name: `${c.universityName} <${c.clubName}>`, - body: RegistrationConfirmation({ - firstName: usersSchemaInputs.firstName, - }), - }); + + try { + console.log("Sending email to: ", lowerCasedEmail); + await sendEmail({ + to: lowerCasedEmail, + subject: `Welcome to ${c.clubName}!`, + name: `${c.universityName} ${c.clubName}`, + body: RegistrationConfirmation({ + firstName: usersSchemaInputs.firstName, + }), + }); + } catch (e) { + console.log("Error sending email: ", e); + } + return { success: true, code: "success", From 94e4061bb3f7cb2df362f3ae6820ce2e88db4393 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 20:43:13 -0500 Subject: [PATCH 19/30] update styling --- apps/web/src/actions/register/new.ts | 2 +- packages/emails/components/AccountConnected.tsx | 13 ++----------- .../emails/components/RegistrationConfirmation.tsx | 12 ++---------- packages/emails/components/shared.tsx | 12 ++---------- 4 files changed, 7 insertions(+), 32 deletions(-) diff --git a/apps/web/src/actions/register/new.ts b/apps/web/src/actions/register/new.ts index b429465c..5025b399 100644 --- a/apps/web/src/actions/register/new.ts +++ b/apps/web/src/actions/register/new.ts @@ -81,7 +81,7 @@ export const createRegistration = authenticatedAction } catch (e) { console.log("Error sending email: ", e); } - + return { success: true, code: "success", diff --git a/packages/emails/components/AccountConnected.tsx b/packages/emails/components/AccountConnected.tsx index 6355d276..0bd26f4b 100644 --- a/packages/emails/components/AccountConnected.tsx +++ b/packages/emails/components/AccountConnected.tsx @@ -106,17 +106,8 @@ export default function AccountConnected({ firstName }: { firstName: string }) { Go to your dashboard
    - -
    - +
    + {emailsConfig.footerLinks.map((link) => (
    -
    - +
    + {emailsConfig.footerLinks.map((link) => ( - +
    + {emailsConfig.footerLinks.map((link) => ( Date: Wed, 9 Apr 2025 21:16:52 -0500 Subject: [PATCH 20/30] reformat --- packages/emails/components/index.ts | 4 +- packages/emails/components/shared.tsx | 53 --------------- .../{ => templates}/AccountConnected.tsx | 49 +------------- .../RegistrationConfirmation.tsx | 55 ++-------------- .../emails/components/templates/shared.tsx | 64 +++++++++++++++++++ packages/emails/package.json | 2 +- 6 files changed, 74 insertions(+), 153 deletions(-) delete mode 100644 packages/emails/components/shared.tsx rename packages/emails/components/{ => templates}/AccountConnected.tsx (55%) rename packages/emails/components/{ => templates}/RegistrationConfirmation.tsx (55%) create mode 100644 packages/emails/components/templates/shared.tsx diff --git a/packages/emails/components/index.ts b/packages/emails/components/index.ts index 927fb81d..e4cf3bdf 100644 --- a/packages/emails/components/index.ts +++ b/packages/emails/components/index.ts @@ -1,2 +1,2 @@ -export { default as AccountConnected } from "./AccountConnected"; -export { default as RegistrationConfirmation } from "./RegistrationConfirmation"; +export { default as AccountConnected } from "./templates/AccountConnected"; +export { default as RegistrationConfirmation } from "./templates/RegistrationConfirmation"; diff --git a/packages/emails/components/shared.tsx b/packages/emails/components/shared.tsx deleted file mode 100644 index e1228743..00000000 --- a/packages/emails/components/shared.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { - Container, - Text, - Img, - Section, - Row, - Link, - Column, -} from "@react-email/components"; -import { emailsConfig } from "config"; - -function DefaultFooter() { - return ( - - - {`${emailsConfig.rightsReservedString}`} - - - ); -} - -function DefaultHeader() { - return ( - Logo - ); -} - -function RowLinks() { - return ( -
    - - {emailsConfig.footerLinks.map((link) => ( - - - {link.name} - {" "} - - ))} - -
    - ); -} - -export { DefaultFooter, DefaultHeader, RowLinks }; diff --git a/packages/emails/components/AccountConnected.tsx b/packages/emails/components/templates/AccountConnected.tsx similarity index 55% rename from packages/emails/components/AccountConnected.tsx rename to packages/emails/components/templates/AccountConnected.tsx index 0bd26f4b..d8921038 100644 --- a/packages/emails/components/AccountConnected.tsx +++ b/packages/emails/components/templates/AccountConnected.tsx @@ -15,10 +15,8 @@ import { Text, } from "@react-email/components"; import type * as React from "react"; -import c, { emailsConfig } from "config"; -import { DefaultFooter, DefaultHeader, RowLinks } from "./shared"; - -const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; +import c, { emailsConfig } from "config"; +import { DefaultFooter, DefaultHeader, GetStartedList, baseUrl } from "./shared"; export default function AccountConnected({ firstName }: { firstName: string }) { return ( @@ -70,34 +68,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
    -
      -
    • - - Go update your account information.{" "} - - Things might have changed since you were last - here so be sure to{" "} - - update your settings. - -
    • -
    • - Check out our upcoming events! - {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to check out the upcoming `} - events. -
    • -
    • - - Check out how we bring our websites to life.{" "} - - All of our source code for the things we build - are open source.{" "} - - Stop by our Github for more. - -
    • -
    - +
    -
    - - {emailsConfig.footerLinks.map((link) => ( - - - {link.name} - {" "} - - ))} - -
    diff --git a/packages/emails/components/RegistrationConfirmation.tsx b/packages/emails/components/templates/RegistrationConfirmation.tsx similarity index 55% rename from packages/emails/components/RegistrationConfirmation.tsx rename to packages/emails/components/templates/RegistrationConfirmation.tsx index 7ba58665..8b246b90 100644 --- a/packages/emails/components/RegistrationConfirmation.tsx +++ b/packages/emails/components/templates/RegistrationConfirmation.tsx @@ -1,13 +1,10 @@ import { Body, Button, - Column, Container, Head, Heading, Html, - Img, - Link, Preview, Row, Section, @@ -16,9 +13,8 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; -import { DefaultFooter, DefaultHeader, RowLinks } from "./shared"; +import { DefaultFooter, DefaultHeader, GetStartedList, baseUrl } from "./shared"; -const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; export default function RegistrationConfirmation({ firstName, @@ -74,37 +70,8 @@ export default function RegistrationConfirmation({
    -
      -
    • - - Go update your account information.{" "} - - Things might have changed since you were last - here so be sure to{" "} - - update your settings. - -
    • -
    • - Check out our upcoming events! - {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} - - check out what is happening soon. - -
    • -
    • - - Check out how we bring our websites to life.{" "} - - All of our source code for the things we build - are open source.{" "} - - Stop by our Github for more. - -
    • -
    - -
    + +
    - -
    - - {emailsConfig.footerLinks.map((link) => ( - - - {link.name} - {" "} - - ))} - -
    + diff --git a/packages/emails/components/templates/shared.tsx b/packages/emails/components/templates/shared.tsx new file mode 100644 index 00000000..448abe2f --- /dev/null +++ b/packages/emails/components/templates/shared.tsx @@ -0,0 +1,64 @@ +import { + Container, + Text, + Img, + Section, + Row, + Link, + Column, +} from "@react-email/components"; +import c, { emailsConfig } from "config"; + +export default function PlaceHolderShared(){ + <> +} + +export const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; +function DefaultFooter() { + return ( + + + {`${emailsConfig.rightsReservedString}`} + + + ); +} + +function DefaultHeader() { + return ( + Logo + ); +} + +function GetStartedList(){ + return ( +
      +
    • + Go update your account information. + Things might have changed since you were last here so be sure to{" "} + update your settings. +
    • +
    • + Check out our upcoming events. + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} + + check out what is happening soon. + +
    • +
    • + Join our discord. + We are always chatting and sharing cool stuff there. You can + also talk with our officers and ask any questions you may have. {" "} + Click the here to join. +
    • +
    + ); +} + +export { DefaultFooter, DefaultHeader, GetStartedList }; diff --git a/packages/emails/package.json b/packages/emails/package.json index ad538623..aec37c0b 100644 --- a/packages/emails/package.json +++ b/packages/emails/package.json @@ -5,7 +5,7 @@ "main": "./index.tsx", "types": "./index.tsx", "scripts": { - "dev": "email dev --dir ./components --port 3001" + "dev": "email dev --dir ./components/templates --port 3001" }, "keywords": [], "author": "", From aac60bcf0a9994d1edad3d24b17d9752c50264a0 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:17:01 -0500 Subject: [PATCH 21/30] updates config --- packages/config/clubkit.config.ts | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/config/clubkit.config.ts b/packages/config/clubkit.config.ts index 390e1ded..645c79ca 100644 --- a/packages/config/clubkit.config.ts +++ b/packages/config/clubkit.config.ts @@ -1,7 +1,7 @@ const c = { clubName: "ClubKit", universityName: "UTSA", - sourceCodeLink: "https://github.com/acmutsa", + discordLink: "https://go.acmutsa.org/discord", universityID: { name: "ABC123", maxLength: 6, @@ -106,20 +106,6 @@ const emailsConfig = { useEmailService: true, rightsReservedString: `© Association of Computing Machinery at UTSA 2015 - ${new Date().getFullYear()}. All Rights Reserved.`, - footerLinks: [ - { - name: "Discord", - href: "https://go.acmutsa.org/discord", - }, - { - name: "Help", - href: `mailto:${c.contactEmail}`, - }, - { - name: "About ACM", - href: "https://acmutsa.org", - }, - ], publicLogoLink: "https://static.acmutsa.org/acm-logo.png", }; From 2a84441e448a03744cc3e23fa9ad1fd68f9682ac Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:17:59 -0500 Subject: [PATCH 22/30] formatter --- .../emails/components/templates/AccountConnected.tsx | 11 ++++++++--- .../components/templates/RegistrationConfirmation.tsx | 11 +++++++---- packages/emails/components/templates/shared.tsx | 8 ++++---- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/emails/components/templates/AccountConnected.tsx b/packages/emails/components/templates/AccountConnected.tsx index d8921038..49c2ef3c 100644 --- a/packages/emails/components/templates/AccountConnected.tsx +++ b/packages/emails/components/templates/AccountConnected.tsx @@ -15,8 +15,13 @@ import { Text, } from "@react-email/components"; import type * as React from "react"; -import c, { emailsConfig } from "config"; -import { DefaultFooter, DefaultHeader, GetStartedList, baseUrl } from "./shared"; +import c, { emailsConfig } from "config"; +import { + DefaultFooter, + DefaultHeader, + GetStartedList, + baseUrl, +} from "./shared"; export default function AccountConnected({ firstName }: { firstName: string }) { return ( @@ -68,7 +73,7 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
    - +
    -
    +
    - diff --git a/packages/emails/components/templates/shared.tsx b/packages/emails/components/templates/shared.tsx index 448abe2f..4cb19483 100644 --- a/packages/emails/components/templates/shared.tsx +++ b/packages/emails/components/templates/shared.tsx @@ -9,8 +9,8 @@ import { } from "@react-email/components"; import c, { emailsConfig } from "config"; -export default function PlaceHolderShared(){ - <> +export default function PlaceHolderShared() { + <>; } export const baseUrl = process.env.NEXT_PUBLIC_BASE_URL!; @@ -36,7 +36,7 @@ function DefaultHeader() { ); } -function GetStartedList(){ +function GetStartedList() { return (
    • @@ -54,7 +54,7 @@ function GetStartedList(){
    • Join our discord. We are always chatting and sharing cool stuff there. You can - also talk with our officers and ask any questions you may have. {" "} + also talk with our officers and ask any questions you may have.{" "} Click the here to join.
    From b4504e27582707e36347316ae76a570485269ec8 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:37:38 -0500 Subject: [PATCH 23/30] updates wording --- .../components/templates/AccountConnected.tsx | 39 +++++++++++++++---- .../templates/RegistrationConfirmation.tsx | 39 +++++++++++++++---- .../emails/components/templates/shared.tsx | 27 +------------ 3 files changed, 63 insertions(+), 42 deletions(-) diff --git a/packages/emails/components/templates/AccountConnected.tsx b/packages/emails/components/templates/AccountConnected.tsx index 49c2ef3c..c5dde887 100644 --- a/packages/emails/components/templates/AccountConnected.tsx +++ b/packages/emails/components/templates/AccountConnected.tsx @@ -16,12 +16,7 @@ import { } from "@react-email/components"; import type * as React from "react"; import c, { emailsConfig } from "config"; -import { - DefaultFooter, - DefaultHeader, - GetStartedList, - baseUrl, -} from "./shared"; +import { DefaultFooter, DefaultHeader, baseUrl } from "./shared"; export default function AccountConnected({ firstName }: { firstName: string }) { return ( @@ -73,8 +68,36 @@ export default function AccountConnected({ firstName }: { firstName: string }) {
    - -
    +
      +
    • + + Go update your account information.{" "} + + Things might have changed since you were last + here so be sure to{" "} + + update your settings. + +
    • +
    • + Check out our upcoming events. + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} + + check out what is happening soon. + +
    • +
    • + Join our discord. + We are always chatting and sharing cool stuff + there. You can also talk with our officers and + ask any questions you may have.{" "} + + {" "} + Click the here to join. + +
    • +
    +
- ); -} - -export { DefaultFooter, DefaultHeader, GetStartedList }; +export { DefaultFooter, DefaultHeader }; From f1d4f5046ace80514d5bd5e558326e975625db49 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:44:36 -0500 Subject: [PATCH 24/30] update wording --- packages/emails/components/templates/AccountConnected.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/emails/components/templates/AccountConnected.tsx b/packages/emails/components/templates/AccountConnected.tsx index c5dde887..88ddd46a 100644 --- a/packages/emails/components/templates/AccountConnected.tsx +++ b/packages/emails/components/templates/AccountConnected.tsx @@ -73,15 +73,14 @@ export default function AccountConnected({ firstName }: { firstName: string }) { Go update your account information.{" "} - Things might have changed since you were last - here so be sure to{" "} + We know it might have been a bit difficult to update all of your information in the previous iteration, but we have made it much easier for you to do so now. Click the link to {" "} update your settings.
  • Check out our upcoming events. - {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, have snacks, and meet new people so be sure to `} + {`${c.clubName} is always hosting cool events that give you an opportunity to come learn, eat snacks, and meet new people so be sure to `} check out what is happening soon. From 5f6258191d8fd7646325507ce46d8eb9ebcb3821 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:47:39 -0500 Subject: [PATCH 25/30] adds try-catch --- apps/web/src/actions/register/migrate.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/web/src/actions/register/migrate.ts b/apps/web/src/actions/register/migrate.ts index 5b91f52a..58d0ad55 100644 --- a/apps/web/src/actions/register/migrate.ts +++ b/apps/web/src/actions/register/migrate.ts @@ -81,12 +81,18 @@ export const doPortalLink = authenticatedAction universityID: universityIDLower, }) .where(eq(users.userID, lookup[0].userID)); - await sendEmail({ - to: userEmail, - subject: `Welcome back to ${c.clubName}!`, - name: `${c.universityName} ${c.clubName}`, - body: AccountConnected({ firstName: lookup[0].firstName }), - }); + try { + await sendEmail({ + to: userEmail, + subject: `Welcome back to ${c.clubName}!`, + name: `${c.universityName} ${c.clubName}`, + body: AccountConnected({ + firstName: lookup[0].firstName, + }), + }); + } catch (e) { + console.error("Error sending email:", e); + } return { success: true, }; From fc34411d6932d1ce6ab96c72a347e0acc03aecc3 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Wed, 9 Apr 2025 21:47:50 -0500 Subject: [PATCH 26/30] reword --- packages/emails/components/templates/AccountConnected.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/emails/components/templates/AccountConnected.tsx b/packages/emails/components/templates/AccountConnected.tsx index 88ddd46a..c03f9327 100644 --- a/packages/emails/components/templates/AccountConnected.tsx +++ b/packages/emails/components/templates/AccountConnected.tsx @@ -73,7 +73,10 @@ export default function AccountConnected({ firstName }: { firstName: string }) { Go update your account information.{" "} - We know it might have been a bit difficult to update all of your information in the previous iteration, but we have made it much easier for you to do so now. Click the link to {" "} + We know it might have been a bit difficult to + update all of your information in the previous + iteration, but we have made it much easier for + you to do so now. Click the link to{" "} update your settings. From a03acfc61b9b6f93bd3f52b373bf4863d85f040f Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Thu, 10 Apr 2025 14:59:53 -0500 Subject: [PATCH 27/30] updates config --- packages/config/clubkit.config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/config/clubkit.config.ts b/packages/config/clubkit.config.ts index 645c79ca..898ce08d 100644 --- a/packages/config/clubkit.config.ts +++ b/packages/config/clubkit.config.ts @@ -104,6 +104,8 @@ const c = { const emailsConfig = { useEmailService: true, + //If self hosted, the api route should look like: https://base_url_hosted/api/v1/ - Do NOT omit the final forward slash or it will not be included + isSelfHosted: true, rightsReservedString: `© Association of Computing Machinery at UTSA 2015 - ${new Date().getFullYear()}. All Rights Reserved.`, publicLogoLink: "https://static.acmutsa.org/acm-logo.png", From eb34f3db106a33dcd9f92952415d17c6630024b8 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Thu, 10 Apr 2025 14:59:59 -0500 Subject: [PATCH 28/30] use useplunk --- apps/web/package.json | 5 ++--- packages/emails/package.json | 5 +++-- packages/emails/utils.ts | 36 ++++++++++++++++-------------------- pnpm-lock.yaml | 9 +++++---- 4 files changed, 26 insertions(+), 29 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index c0b6a53d..afdfbff0 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -20,7 +20,6 @@ "@clerk/nextjs": "^6.12.9", "@hookform/resolvers": "^3.3.4", "@internationalized/date": "^3.5.4", - "@plunk/node": "^3.0.3", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-avatar": "^1.0.4", @@ -51,6 +50,7 @@ "db": "workspace:*", "dotenv": "^16.3.1", "dotenv-cli": "^7.4.1", + "emails": "workspace:*", "jiti": "^1.21.0", "lucide-react": "^0.377.0", "nanoid": "^5.0.6", @@ -70,8 +70,7 @@ "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", "use-debounce": "^10.0.1", - "zod": "^3.23.8", - "emails": "workspace:*" + "zod": "^3.23.8" }, "devDependencies": { "@cloudflare/next-on-pages": "^1.13.10", diff --git a/packages/emails/package.json b/packages/emails/package.json index aec37c0b..9d187898 100644 --- a/packages/emails/package.json +++ b/packages/emails/package.json @@ -2,8 +2,8 @@ "name": "emails", "version": "1.0.0", "description": "", - "main": "./index.tsx", - "types": "./index.tsx", + "main": "./index.tsx", + "types": "./index.tsx", "scripts": { "dev": "email dev --dir ./components/templates --port 3001" }, @@ -15,6 +15,7 @@ "react-email": "4.0.4" }, "dependencies": { + "@plunk/node": "^3.0.3", "@react-email/components": "0.0.36", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/packages/emails/utils.ts b/packages/emails/utils.ts index 9544aba6..41e0d41f 100644 --- a/packages/emails/utils.ts +++ b/packages/emails/utils.ts @@ -1,38 +1,34 @@ import { render } from "@react-email/components"; import { ReactElement } from "react"; import { emailsConfig } from "config"; +import Plunk from "@plunk/node"; +import { SendParams } from "@plunk/node/dist/types/emails"; -export interface SendEmailProps { - to: string | Array; - subject: string; +const plunk = new Plunk(process.env.PLUNK_API_KEY!, { + baseUrl: emailsConfig.isSelfHosted + ? process.env.PLUNK_BASE_URL + : "https://api.useplunk.com/v1/", +}); + +export interface SendEmailProps extends Omit { body: string | ReactElement; - subscribed?: boolean; - name?: string; - from?: string; - reply?: string; - headers?: Record; } export async function sendEmail(sendEmailProps: SendEmailProps) { if (!emailsConfig.useEmailService) { return; } - sendEmailProps.body = + const emailBody = typeof sendEmailProps.body === "string" ? sendEmailProps.body : await render(sendEmailProps.body); - const options = { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${process.env.PLUNK_API_KEY}`, - }, - body: JSON.stringify(sendEmailProps), - }; + const success = await plunk.emails.send({ + ...sendEmailProps, + body: emailBody, + }); - const res = await fetch(`${process.env.PLUNK_BASE_URL}/send`, options); - if (!res.ok) { - console.error(res); + if (!success) { + console.error(success); throw new Error("Failed to send email"); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b271e3c..c963d5ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,9 +94,6 @@ importers: '@internationalized/date': specifier: ^3.5.4 version: 3.5.4 - '@plunk/node': - specifier: ^3.0.3 - version: 3.0.3 '@radix-ui/react-accordion': specifier: ^1.2.0 version: 1.2.0(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.2.0)(react@18.2.0) @@ -313,6 +310,9 @@ importers: packages/emails: dependencies: + '@plunk/node': + specifier: ^3.0.3 + version: 3.0.3 '@react-email/components': specifier: 0.0.36 version: 0.0.36(react-dom@18.2.0)(react@18.2.0) @@ -6663,7 +6663,7 @@ packages: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: true /async-listen@1.2.0: @@ -10280,6 +10280,7 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} From 6ab4c527702bcfaa16d215cec85a46b0c6915766 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 14 Apr 2025 11:42:04 -0500 Subject: [PATCH 29/30] updates env --- apps/web/src/env.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts index 45cda33e..7a1fa214 100644 --- a/apps/web/src/env.ts +++ b/apps/web/src/env.ts @@ -1,5 +1,6 @@ import { createEnv } from "@t3-oss/env-nextjs"; import { z } from "zod"; +import {emailsConfig} from "config"; export const env = createEnv({ server: { @@ -7,18 +8,12 @@ export const env = createEnv({ }, client: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), - NEXT_PUBLIC_BASE_URL: z.string(), + NEXT_PUBLIC_BASE_URL: (emailsConfig.useEmailService) ? z.string() : z.string().optional(), }, - // If you're using Next.js < 13.4.4, you'll need to specify the runtimeEnv manually - // runtimeEnv: { - // DATABASE_URL: process.env.DATABASE_URL, - // OPEN_AI_API_KEY: process.env.OPEN_AI_API_KEY, - // NEXT_PUBLIC_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_PUBLISHABLE_KEY, - // }, - // For Next.js >= 13.4.4, you only need to destructure client variables: experimental__runtimeEnv: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL, }, + emptyStringAsUndefined:true }); From bfca91c9ff9b0744d7c6fbd22dda0d3254ad2512 Mon Sep 17 00:00:00 2001 From: Christian Walker Date: Mon, 14 Apr 2025 11:44:03 -0500 Subject: [PATCH 30/30] prettier --- apps/web/src/env.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts index 7a1fa214..291b84e9 100644 --- a/apps/web/src/env.ts +++ b/apps/web/src/env.ts @@ -1,6 +1,6 @@ import { createEnv } from "@t3-oss/env-nextjs"; import { z } from "zod"; -import {emailsConfig} from "config"; +import { emailsConfig } from "config"; export const env = createEnv({ server: { @@ -8,12 +8,14 @@ export const env = createEnv({ }, client: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string(), - NEXT_PUBLIC_BASE_URL: (emailsConfig.useEmailService) ? z.string() : z.string().optional(), + NEXT_PUBLIC_BASE_URL: emailsConfig.useEmailService + ? z.string() + : z.string().optional(), }, experimental__runtimeEnv: { NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL, }, - emptyStringAsUndefined:true + emptyStringAsUndefined: true, });