diff --git a/.eslintrc.json b/.eslintrc.json index 2c37840..22c30eb 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,29 +1,6 @@ { "extends": [ "next/core-web-vitals", - "plugin:@typescript-eslint/recommended", "prettier" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": "./tsconfig.json" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/consistent-type-imports": [ - "error", - { - "prefer": "type-imports", - "fixStyle": "inline-type-imports" - } - ], - "@typescript-eslint/no-unused-vars": [ - "warn", - { - "argsIgnorePattern": "^_" - } - ] - } + ] } \ No newline at end of file diff --git a/emails/verification.tsx b/emails/verification.tsx index e978f8b..844edb4 100644 --- a/emails/verification.tsx +++ b/emails/verification.tsx @@ -18,12 +18,12 @@ const siteUrl = interface VerificationTemplateProps { userName: string; - verificationUrl: string; + code: string; } const VerificationTemp: React.FC> = ({ userName, - verificationUrl, + code, }) => ( @@ -51,14 +51,13 @@ const VerificationTemp: React.FC> = ({ Click the link below to login to your account.
- + {code} + - This link expires in 3 minutes and can only be used once. + This link expires in 10 minutes and can only be used once.
diff --git a/lefthook.yml b/lefthook.yml index 95d3346..288ff33 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -11,7 +11,7 @@ pre-commit: run: npx tsc --noEmit lint: glob: "src/**/*.{ts,tsx,js,jsx}" - run: pnpm eslint {staged_files} --fix && git update-index --again + run: pnpm lint format: glob: "src/**/*.{ts,tsx,js,jsx,css}" run: pnpm prettier --write {staged_files} && git update-index --again diff --git a/next.config.mjs b/next.config.mjs index 42ad6f5..8c24ad0 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -5,6 +5,7 @@ const withSerwist = withSerwistInit({ // use something else that works, such as "service-worker/index.ts". swSrc: "src/app/sw.ts", swDest: "public/sw.js", + disable: process.env.NODE_ENV !== "production", }); const nextConfig = { diff --git a/package.json b/package.json index 9a34688..c995c9c 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "@hookform/resolvers": "^3.3.2", - "@lucia-auth/adapter-prisma": "4.0.0-beta.8", + "@lucia-auth/adapter-prisma": "4.0.1", "@prisma/client": "^5.7.0", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-avatar": "^1.0.4", @@ -30,22 +30,23 @@ "@react-email/components": "^0.0.12", "@serwist/next": "^9.0.3", "@uploadthing/react": "^6.0.2", - "arctic": "^0.10.2", + "arctic": "^1.9.1", "dayjs": "^1.11.10", - "lucia": "3.0.0-beta.13", + "input-otp": "^1.2.4", + "lucia": "3.2.0", "lucide-react": "^0.341.0", "nanoid": "^5.0.4", "next": "14.2.2", "next-international": "^1.1.4", - "next-themes": "^0.2.1", - "oslo": "^0.26.1", + "next-themes": "^0.3.0", + "oslo": "^1.2.1", "postcss": "8.4.35", "react": "18.2.0", "react-dom": "18.2.0", "react-dropzone": "^14.2.3", "react-email": "1.10.0", "react-hook-form": "^7.49.2", - "resend": "^2.1.0-canary.1", + "resend": "^3.4.0", "stripe": "^14.8.0", "uploadthing": "^6.1.0", "zod": "^3.22.4" @@ -56,8 +57,6 @@ "@types/node": "20.11.20", "@types/react": "18.2.79", "@types/react-dom": "18.2.19", - "@typescript-eslint/eslint-plugin": "^6.14.0", - "@typescript-eslint/parser": "^6.14.0", "autoprefixer": "10.4.16", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", @@ -75,6 +74,6 @@ "tailwindcss": "3.4.1", "tailwindcss-animate": "^1.0.7", "typescript": "5.3.3", - "velite": "0.1.0-rc.3" + "velite": "0.1.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ddfb559..b61e2fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^3.3.2 version: 3.6.0(react-hook-form@7.51.5(react@18.2.0)) '@lucia-auth/adapter-prisma': - specifier: 4.0.0-beta.8 - version: 4.0.0-beta.8(@prisma/client@5.15.0(prisma@5.15.0))(lucia@3.0.0-beta.13) + specifier: 4.0.1 + version: 4.0.1(@prisma/client@5.15.0(prisma@5.15.0))(lucia@3.2.0) '@prisma/client': specifier: ^5.7.0 version: 5.15.0(prisma@5.15.0) @@ -52,19 +52,22 @@ importers: version: 0.0.12(@types/react@18.2.79)(react@18.2.0) '@serwist/next': specifier: ^9.0.3 - version: 9.0.3(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.3.3)(webpack@5.91.0) + version: 9.0.3(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.3.3)(webpack@5.92.1) '@uploadthing/react': specifier: ^6.0.2 version: 6.6.0(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)(uploadthing@6.12.0(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(tailwindcss@3.4.1)) arctic: - specifier: ^0.10.2 - version: 0.10.6 + specifier: ^1.9.1 + version: 1.9.1 dayjs: specifier: ^1.11.10 version: 1.11.11 + input-otp: + specifier: ^1.2.4 + version: 1.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) lucia: - specifier: 3.0.0-beta.13 - version: 3.0.0-beta.13 + specifier: 3.2.0 + version: 3.2.0 lucide-react: specifier: ^0.341.0 version: 0.341.0(react@18.2.0) @@ -78,11 +81,11 @@ importers: specifier: ^1.1.4 version: 1.2.4 next-themes: - specifier: ^0.2.1 - version: 0.2.1(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^0.3.0 + version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) oslo: - specifier: ^0.26.1 - version: 0.26.2 + specifier: ^1.2.1 + version: 1.2.1 postcss: specifier: 8.4.35 version: 8.4.35 @@ -102,8 +105,8 @@ importers: specifier: ^7.49.2 version: 7.51.5(react@18.2.0) resend: - specifier: ^2.1.0-canary.1 - version: 2.1.0 + specifier: ^3.4.0 + version: 3.4.0 stripe: specifier: ^14.8.0 version: 14.25.0 @@ -129,12 +132,6 @@ importers: '@types/react-dom': specifier: 18.2.19 version: 18.2.19 - '@typescript-eslint/eslint-plugin': - specifier: ^6.14.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.14.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) autoprefixer: specifier: 10.4.16 version: 10.4.16(postcss@8.4.35) @@ -187,8 +184,8 @@ importers: specifier: 5.3.3 version: 5.3.3 velite: - specifier: 0.1.0-rc.3 - version: 0.1.0-rc.3 + specifier: 0.1.0 + version: 0.1.0 packages: @@ -223,17 +220,17 @@ packages: effect: ^3.1.3 fast-check: ^3.13.2 - '@emnapi/core@1.2.0': - resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} + '@emnapi/core@0.45.0': + resolution: {integrity: sha512-DPWjcUDQkCeEM4VnljEOEcXdAD7pp8zSZsgOujk/LGIwCXWbXJngin+MO4zbH429lzeC3WbYLGjE2MaUOwzpyw==} + + '@emnapi/runtime@0.45.0': + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - - '@esbuild/aix-ppc64@0.21.1': - resolution: {integrity: sha512-O7yppwipkXvnEPjzkSXJRk2g4bS8sUx9p9oXHq9MU/U7lxUzZVsnFZMDTmeeX9bfQxrFcvOacl/ENgOh0WP9pA==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -244,8 +241,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.1': - resolution: {integrity: sha512-jXhccq6es+onw7x8MxoFnm820mz7sGa9J14kLADclmiEUH4fyj+FjR6t0M93RgtlI/awHWhtF0Wgfhqgf9gDZA==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -256,8 +253,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.1': - resolution: {integrity: sha512-hh3jKWikdnTtHCglDAeVO3Oyh8MaH8xZUaWMiCCvJ9/c3NtPqZq+CACOlGTxhddypXhl+8B45SeceYBfB/e8Ow==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -268,8 +265,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.1': - resolution: {integrity: sha512-NPObtlBh4jQHE01gJeucqEhdoD/4ya2owSIS8lZYS58aR0x7oZo9lB2lVFxgTANSa5MGCBeoQtr+yA9oKCGPvA==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -280,8 +277,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.1': - resolution: {integrity: sha512-BLT7TDzqsVlQRmJfO/FirzKlzmDpBWwmCUlyggfzUwg1cAxVxeA4O6b1XkMInlxISdfPAOunV9zXjvh5x99Heg==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -292,8 +289,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.1': - resolution: {integrity: sha512-D3h3wBQmeS/vp93O4B+SWsXB8HvRDwMyhTNhBd8yMbh5wN/2pPWRW5o/hM3EKgk9bdKd9594lMGoTCTiglQGRQ==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -304,8 +301,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.1': - resolution: {integrity: sha512-/uVdqqpNKXIxT6TyS/oSK4XE4xWOqp6fh4B5tgAwozkyWdylcX+W4YF2v6SKsL4wCQ5h1bnaSNjWPXG/2hp8AQ==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -316,8 +313,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.1': - resolution: {integrity: sha512-paAkKN1n1jJitw+dAoR27TdCzxRl1FOEITx3h201R6NoXUojpMzgMLdkXVgCvaCSCqwYkeGLoe9UVNRDKSvQgw==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -328,8 +325,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.1': - resolution: {integrity: sha512-G65d08YoH00TL7Xg4LaL3gLV21bpoAhQ+r31NUu013YB7KK0fyXIt05VbsJtpqh/6wWxoLJZOvQHYnodRrnbUQ==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -340,8 +337,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.1': - resolution: {integrity: sha512-tRHnxWJnvNnDpNVnsyDhr1DIQZUfCXlHSCDohbXFqmg9W4kKR7g8LmA3kzcwbuxbRMKeit8ladnCabU5f2traA==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -352,8 +349,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.1': - resolution: {integrity: sha512-tt/54LqNNAqCz++QhxoqB9+XqdsaZOtFD/srEhHYwBd3ZUOepmR1Eeot8bS+Q7BiEvy9vvKbtpHf+r6q8hF5UA==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -364,8 +361,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.1': - resolution: {integrity: sha512-MhNalK6r0nZD0q8VzUBPwheHzXPr9wronqmZrewLfP7ui9Fv1tdPmg6e7A8lmg0ziQCziSDHxh3cyRt4YMhGnQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -376,8 +373,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.1': - resolution: {integrity: sha512-YCKVY7Zen5rwZV+nZczOhFmHaeIxR4Zn3jcmNH53LbgF6IKRwmrMywqDrg4SiSNApEefkAbPSIzN39FC8VsxPg==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -388,8 +385,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.1': - resolution: {integrity: sha512-bw7bcQ+270IOzDV4mcsKAnDtAFqKO0jVv3IgRSd8iM0ac3L8amvCrujRVt1ajBTJcpDaFhIX+lCNRKteoDSLig==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -400,8 +397,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.1': - resolution: {integrity: sha512-ARmDRNkcOGOm1AqUBSwRVDfDeD9hGYRfkudP2QdoonBz1ucWVnfBPfy7H4JPI14eYtZruRSczJxyu7SRYDVOcg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -412,8 +409,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.1': - resolution: {integrity: sha512-o73TcUNMuoTZlhwFdsgr8SfQtmMV58sbgq6gQq9G1xUiYnHMTmJbwq65RzMx89l0iya69lR4bxBgtWiiOyDQZA==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -424,8 +421,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.1': - resolution: {integrity: sha512-da4/1mBJwwgJkbj4fMH7SOXq2zapgTo0LKXX1VUZ0Dxr+e8N0WbS80nSZ5+zf3lvpf8qxrkZdqkOqFfm57gXwA==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -436,8 +433,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.1': - resolution: {integrity: sha512-CPWs0HTFe5woTJN5eKPvgraUoRHrCtzlYIAv9wBC+FAyagBSaf+UdZrjwYyTGnwPGkThV4OCI7XibZOnPvONVw==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -448,8 +445,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.1': - resolution: {integrity: sha512-xxhTm5QtzNLc24R0hEkcH+zCx/o49AsdFZ0Cy5zSd/5tOj4X2g3/2AJB625NoadUuc4A8B3TenLJoYdWYOYCew==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -460,8 +457,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.1': - resolution: {integrity: sha512-CWibXszpWys1pYmbr9UiKAkX6x+Sxw8HWtw1dRESK1dLW5fFJ6rMDVw0o8MbadusvVQx1a8xuOxnHXT941Hp1A==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -472,8 +469,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.1': - resolution: {integrity: sha512-jb5B4k+xkytGbGUS4T+Z89cQJ9DJ4lozGRSV+hhfmCPpfJ3880O31Q1srPCimm+V6UCbnigqD10EgDNgjvjerQ==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -484,8 +481,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.1': - resolution: {integrity: sha512-PgyFvjJhXqHn1uxPhyN1wZ6dIomKjiLUQh1LjFvjiV1JmnkZ/oMPrfeEAZg5R/1ftz4LZWZr02kefNIQ5SKREQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -496,8 +493,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.1': - resolution: {integrity: sha512-W9NttRZQR5ehAiqHGDnvfDaGmQOm6Fi4vSlce8mjM75x//XKuVAByohlEX6N17yZnVXxQFuh4fDRunP8ca6bfA==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -553,24 +550,12 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.33.3': - resolution: {integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [darwin] - '@img/sharp-darwin-arm64@0.33.4': resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.3': - resolution: {integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [darwin] - '@img/sharp-darwin-x64@0.33.4': resolution: {integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} @@ -625,106 +610,53 @@ packages: cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.3': - resolution: {integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - '@img/sharp-linux-arm64@0.33.4': resolution: {integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.3': - resolution: {integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm] - os: [linux] - '@img/sharp-linux-arm@0.33.4': resolution: {integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==} engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.3': - resolution: {integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==} - engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [s390x] - os: [linux] - '@img/sharp-linux-s390x@0.33.4': resolution: {integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==} engines: {glibc: '>=2.31', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.3': - resolution: {integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==} - engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - '@img/sharp-linux-x64@0.33.4': resolution: {integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.3': - resolution: {integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [arm64] - os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.4': resolution: {integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.3': - resolution: {integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==} - engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [linux] - '@img/sharp-linuxmusl-x64@0.33.4': resolution: {integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==} engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.3': - resolution: {integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [wasm32] - '@img/sharp-wasm32@0.33.4': resolution: {integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.3': - resolution: {integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [ia32] - os: [win32] - '@img/sharp-win32-ia32@0.33.4': resolution: {integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.3': - resolution: {integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} - cpu: [x64] - os: [win32] - '@img/sharp-win32-x64@0.33.4': resolution: {integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} @@ -756,11 +688,11 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@lucia-auth/adapter-prisma@4.0.0-beta.8': - resolution: {integrity: sha512-4/bIJ7VEEHJI9sdpxhHB88f0o9ysGMHc5gEztk7VJwbNvMSrxEt11SYm6PNxEhO0/m6DE2Ar4f0nPu7nBmH0uA==} + '@lucia-auth/adapter-prisma@4.0.1': + resolution: {integrity: sha512-3SztRhj1RAHbbhI/0aB7YC5zl6Z6aktPhkWpn2CHhiB03B9x/+A+M6pqJuAt1usU8PzkjVilgRPhrPymMar66A==} peerDependencies: '@prisma/client': ^4.2.0 || ^5.0.0 - lucia: 3.0.0-beta.13 + lucia: 3.x '@manypkg/find-root@2.2.1': resolution: {integrity: sha512-34NlypD5mmTY65cFAK7QPgY5Tzt0qXR4ZRXdg97xAlkiLuwXUPBEXy5Hsqzd+7S2acsLxUz6Cs50rlDZQr4xUA==} @@ -773,12 +705,6 @@ packages: '@mdx-js/mdx@3.0.1': resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} - '@napi-rs/wasm-runtime@0.1.2': - resolution: {integrity: sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==} - - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@next/env@14.2.2': resolution: {integrity: sha512-sk72qRfM1Q90XZWYRoJKu/UWlTgihrASiYw/scb15u+tyzcze3bOuJ/UV6TBOQEeUaxOkRqGeuGUdiiuxc5oqw==} @@ -839,352 +765,178 @@ packages: cpu: [x64] os: [win32] - '@node-rs/argon2-android-arm-eabi@1.7.2': - resolution: {integrity: sha512-WhW84XOzdR4AOGc4BJvIg5lCRVBL0pXp/PPCe8QCyWw493p7VdNCdYpr2xdtjS/0zImmY85HNB/6zpzjLRTT/A==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/argon2-android-arm-eabi@1.8.3': - resolution: {integrity: sha512-JFZPlNM0A8Og+Tncb8UZsQrhEMlbHBXPsT3hRoKImzVmTmq28Os0ucFWow0AACp2coLHBSydXH3Dh0lZup3rWw==} + '@node-rs/argon2-android-arm-eabi@1.7.0': + resolution: {integrity: sha512-udDqkr5P9E+wYX1SZwAVPdyfYvaF4ry9Tm+R9LkfSHbzWH0uhU6zjIwNRp7m+n4gx691rk+lqqDAIP8RLKwbhg==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@node-rs/argon2-android-arm64@1.7.2': - resolution: {integrity: sha512-CdtayHSMIyDuVhSYFirwA757c4foQuyTjpysgFJLHweP9C7uDiBf9WBYij+UyabpaCadJ0wPyK6Vakinvlk4/g==} + '@node-rs/argon2-android-arm64@1.7.0': + resolution: {integrity: sha512-s9j/G30xKUx8WU50WIhF0fIl1EdhBGq0RQ06lEhZ0Gi0ap8lhqbE2Bn5h3/G2D1k0Dx+yjeVVNmt/xOQIRG38A==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@node-rs/argon2-android-arm64@1.8.3': - resolution: {integrity: sha512-zaf8P3T92caeW2xnMA7P1QvRA4pIt/04oilYP44XlTCtMye//vwXDMeK53sl7dvYiJKnzAWDRx41k8vZvpZazg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/argon2-darwin-arm64@1.7.2': - resolution: {integrity: sha512-hUOhtgYHTEyzX5sgMZVdXunONOus2HWpWydF5D/RYJ1mZ76FXRnFpQE40DqbzisdPIraKdn40m7JqkPP7wqdyg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/argon2-darwin-arm64@1.8.3': - resolution: {integrity: sha512-DV/IbmLGdNXBtXb5o2UI5ba6kvqXqPAJgmMOTUCuHeBSp992GlLHdfU4rzGu0dNrxudBnunNZv+crd0YdEQSUA==} + '@node-rs/argon2-darwin-arm64@1.7.0': + resolution: {integrity: sha512-ZIz4L6HGOB9U1kW23g+m7anGNuTZ0RuTw0vNp3o+2DWpb8u8rODq6A8tH4JRL79S+Co/Nq608m9uackN2pe0Rw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@node-rs/argon2-darwin-x64@1.7.2': - resolution: {integrity: sha512-lfs5HX+t542yUfcv6Aa/NeGD1nUCwyQNgnPEGcik71Ow6V13hkR1bHgmT1u3CHN4fBts0gW+DQEDsq1xlVgkvw==} + '@node-rs/argon2-darwin-x64@1.7.0': + resolution: {integrity: sha512-5oi/pxqVhODW/pj1+3zElMTn/YukQeywPHHYDbcAW3KsojFjKySfhcJMd1DjKTc+CHQI+4lOxZzSUzK7mI14Hw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@node-rs/argon2-darwin-x64@1.8.3': - resolution: {integrity: sha512-YMjmBGFZhLfYjfQ2gll9A+BZu/zAMV7lWZIbKxb7ZgEofILQwuGmExjDtY3Jplido/6leCEdpmlk2oIsME00LA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/argon2-freebsd-x64@1.7.2': - resolution: {integrity: sha512-ROoF+4VaCBJUjddrTN1hjuqSl89ppRcjVXJscSPJjWzTlbzFmGGovJvIzUBmCr/Oq3yM1zKHj6MP9oRD5cB+/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/argon2-freebsd-x64@1.8.3': - resolution: {integrity: sha512-Hq3Rj5Yb2RolTG/luRPnv+XiGCbi5nAK25Pc8ou/tVapwX+iktEm/NXbxc5zsMxraYVkCvfdwBjweC5O+KqCGw==} + '@node-rs/argon2-freebsd-x64@1.7.0': + resolution: {integrity: sha512-Ify08683hA4QVXYoIm5SUWOY5DPIT/CMB0CQT+IdxQAg/F+qp342+lUkeAtD5bvStQuCx/dFO3bnnzoe2clMhA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@node-rs/argon2-linux-arm-gnueabihf@1.7.2': - resolution: {integrity: sha512-CBSB8KPI8LS74Bcz3dYaa2/khULutz4vSDvFWUERlSLX+mPdDhoZi6UPuUPPF9e01w8AbiK1YCqlLUTm3tIMfw==} + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': + resolution: {integrity: sha512-7DjDZ1h5AUHAtRNjD19RnQatbhL+uuxBASuuXIBu4/w6Dx8n7YPxwTP4MXfsvuRgKuMWiOb/Ub/HJ3kXVCXRkg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@node-rs/argon2-linux-arm-gnueabihf@1.8.3': - resolution: {integrity: sha512-x49l8RgzKoG0/V0IXa5rrEl1TcJEc936ctlYFvqcunSOyowZ6kiWtrp1qrbOR8gbaNILl11KTF52vF6+h8UlEQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/argon2-linux-arm64-gnu@1.7.2': - resolution: {integrity: sha512-6LBTug6ZiWFakP3X3Nqs7ZTM03gmcSWX4YvEn20HhhQE5NDrsrw3zNqGj0cJiNzKKIMSDDuj7uGy+ITEfNo4CA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-arm64-gnu@1.8.3': - resolution: {integrity: sha512-gJesam/qA63reGkb9qJ2TjFSLBtY41zQh2oei7nfnYsmVQPuHHWItJxEa1Bm21SPW53gZex4jFJbDIgj0+PxIw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/argon2-linux-arm64-musl@1.7.2': - resolution: {integrity: sha512-KjhQ+ZPne29t9VRVeIif7JdKwQba+tM6CBNYBoJB1iON0CUKeqSQtZcHuTj9gkf2SNRG5bsU4ABcfxd0OKsKHg==} + '@node-rs/argon2-linux-arm64-gnu@1.7.0': + resolution: {integrity: sha512-nJDoMP4Y3YcqGswE4DvP080w6O24RmnFEDnL0emdI8Nou17kNYBzP2546Nasx9GCyLzRcYQwZOUjrtUuQ+od2g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@node-rs/argon2-linux-arm64-musl@1.8.3': - resolution: {integrity: sha512-7O6kQdSKzB4Tjx/EBa8zKIxnmLkQE8VdJgPm6Ksrpn+ueo0mx2xf76fIDnbbTCtm3UbB+y+FkTo2wLA7tOqIKg==} + '@node-rs/argon2-linux-arm64-musl@1.7.0': + resolution: {integrity: sha512-BKWS8iVconhE3jrb9mj6t1J9vwUqQPpzCbUKxfTGJfc+kNL58F1SXHBoe2cDYGnHrFEHTY0YochzXoAfm4Dm/A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@node-rs/argon2-linux-x64-gnu@1.7.2': - resolution: {integrity: sha512-BQvp+iLtKqomHz4q5t1aKoni9osgvUDU5sZtHAlFm5dRTlGHnympcQVATRE5GHyH9C6MIM9W7P1kqEeCLGPolQ==} + '@node-rs/argon2-linux-x64-gnu@1.7.0': + resolution: {integrity: sha512-EmgqZOlf4Jurk/szW1iTsVISx25bKksVC5uttJDUloTgsAgIGReCpUUO1R24pBhu9ESJa47iv8NSf3yAfGv6jQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@node-rs/argon2-linux-x64-gnu@1.8.3': - resolution: {integrity: sha512-OBH+EFG7BGjFyldaao2H2gSCLmjtrrwf420B1L+lFn7JLW9UAjsIPFKAcWsYwPa/PwYzIge9Y7SGcpqlsSEX0w==} + '@node-rs/argon2-linux-x64-musl@1.7.0': + resolution: {integrity: sha512-/o1efYCYIxjfuoRYyBTi2Iy+1iFfhqHCvvVsnjNSgO1xWiWrX0Rrt/xXW5Zsl7vS2Y+yu8PL8KFWRzZhaVxfKA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@node-rs/argon2-linux-x64-musl@1.7.2': - resolution: {integrity: sha512-yXJudpBZQ98g+lWaHn9EzZ5KsAyqRdlpub/K+5NP7gHehb8wzBRIFAejIHAG0fvzQEEc86VOnV2koWIVZxWAvw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-linux-x64-musl@1.8.3': - resolution: {integrity: sha512-bDbMuyekIxZaN7NaX+gHVkOyABB8bcMEJYeRPW1vCXKHj3brJns1wiUFSxqeUXreupifNVJlQfPt1Y5B/vFXgQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/argon2-wasm32-wasi@1.7.2': - resolution: {integrity: sha512-diXlVjJZY2GIV8ZDwUqXPhacXsFR0klGSv5D9f+XidwWXK4udtzDhkM/7N/Mb7h1HAWaxZ6IN9spYFjvWH1wqg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/argon2-wasm32-wasi@1.8.3': - resolution: {integrity: sha512-NBf2cMCDbNKMzp13Pog8ZPmI0M9U4Ak5b95EUjkp17kdKZFds12dwW67EMnj7Zy+pRqby2QLECaWebDYfNENTg==} + '@node-rs/argon2-wasm32-wasi@1.7.0': + resolution: {integrity: sha512-Evmk9VcxqnuwQftfAfYEr6YZYSPLzmKUsbFIMep5nTt9PT4XYRFAERj7wNYp+rOcBenF3X4xoB+LhwcOMTNE5w==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@node-rs/argon2-win32-arm64-msvc@1.7.2': - resolution: {integrity: sha512-dhIBrY04P9nbmwzBpgERQDmmSu4YBZyeEE32t4TikMz5rQ07iaVC+JpGmtCBZoDIsLDHGC8cikENd3YEqpqIcA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/argon2-win32-arm64-msvc@1.8.3': - resolution: {integrity: sha512-AHpPo7UbdW5WWjwreVpgFSY0o1RY4A7cUFaqDXZB2OqEuyrhMxBdZct9PX7PQKI18D85pLsODnR+gvVuTwJ6rQ==} + '@node-rs/argon2-win32-arm64-msvc@1.7.0': + resolution: {integrity: sha512-qgsU7T004COWWpSA0tppDqDxbPLgg8FaU09krIJ7FBl71Sz8SFO40h7fDIjfbTT5w7u6mcaINMQ5bSHu75PCaA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@node-rs/argon2-win32-ia32-msvc@1.7.2': - resolution: {integrity: sha512-o1tfqr8gyALCzuxBoQfvhxkeYMaw/0H8Gmt7klTYyEIBvEFu7SD5qytXO9Px7t5420nZL/Wy5cflg3IB1s57Pg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/argon2-win32-ia32-msvc@1.8.3': - resolution: {integrity: sha512-bqzn2rcQkEwCINefhm69ttBVVkgHJb/V03DdBKsPFtiX6H47axXKz62d1imi26zFXhOEYxhKbu3js03GobJOLw==} + '@node-rs/argon2-win32-ia32-msvc@1.7.0': + resolution: {integrity: sha512-JGafwWYQ/HpZ3XSwP4adQ6W41pRvhcdXvpzIWtKvX+17+xEXAe2nmGWM6s27pVkg1iV2ZtoYLRDkOUoGqZkCcg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@node-rs/argon2-win32-x64-msvc@1.7.2': - resolution: {integrity: sha512-v0h53XUc7hNgWiWi0qcMcHvj9/kwuItI9NwLK4C+gtzT3UB0cedhfIL8HFMKThMXasy41ZdbpCF2Bi0kJoLNEg==} + '@node-rs/argon2-win32-x64-msvc@1.7.0': + resolution: {integrity: sha512-9oq4ShyFakw8AG3mRls0AoCpxBFcimYx7+jvXeAf2OqKNO+mSA6eZ9z7KQeVCi0+SOEUYxMGf5UiGiDb9R6+9Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@node-rs/argon2-win32-x64-msvc@1.8.3': - resolution: {integrity: sha512-ILlrRThdbp5xNR5gwYM2ic1n/vG5rJ8dQZ+YMRqksl+lnTJ/6FDe5BOyIhiPtiDwlCiCtUA+1NxpDB9KlUCAIA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/argon2@1.7.2': - resolution: {integrity: sha512-+H6pc3M1vIX9YnG59YW7prHhhpv19P8YyxlXHnnFzTimf2q+kKDF7mGWbhvN9STqIY+P70Patn0Q6qb6Ib5/4g==} - engines: {node: '>= 10'} - - '@node-rs/argon2@1.8.3': - resolution: {integrity: sha512-sf/QAEI59hsMEEE2J8vO4hKrXrv4Oplte3KI2N4MhMDYpytH0drkVfErmHBfWFZxxIEK03fX1WsBNswS2nIZKg==} + '@node-rs/argon2@1.7.0': + resolution: {integrity: sha512-zfULc+/tmcWcxn+nHkbyY8vP3+MpEqKORbszt4UkpqZgBgDAAIYvuDN/zukfTgdmo6tmJKKVfzigZOPk4LlIog==} engines: {node: '>= 10'} - '@node-rs/bcrypt-android-arm-eabi@1.10.4': - resolution: {integrity: sha512-55ajutuTdfK1hKseyliflnxzNtxszQQ/EoLtgJlgCe7rI24vGP9EEEZDznB/u9OaJ14/AYzZtIhkEOYdbIdw0A==} + '@node-rs/bcrypt-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-nOCFISGtnodGHNiLrG0WYLWr81qQzZKYfmwHc7muUeq+KY0sQXyHOwZk9OuNQAWv/lnntmtbwkwT0QNEmOyLvA==} engines: {node: '>= 10'} cpu: [arm] os: [android] - '@node-rs/bcrypt-android-arm-eabi@1.9.2': - resolution: {integrity: sha512-er/Q2khwpan9pczvTTqY/DJE4UU65u31xd0NkZlHUTKyB7djRhWfzoGexGx2GN+k831/RR3U8kKE/8QUHeO3hQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [android] - - '@node-rs/bcrypt-android-arm64@1.10.4': - resolution: {integrity: sha512-dCgQT7nH65tORmJw2hQ6zQgFmmC+/JBYZUWtf7pPZI76AVAn5tc7cIUrxYoV4OT1+uD63b9Av+mS1fT2EPzWEg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@node-rs/bcrypt-android-arm64@1.9.2': - resolution: {integrity: sha512-OUYatOEG5vbLbF73q2TC8UqrDO81zUQxnaFD/OAB1hcm6J+ur0zJ8E53c35/DIqkTp7JarPMraC4rouJ2ugN4w==} + '@node-rs/bcrypt-android-arm64@1.9.0': + resolution: {integrity: sha512-+ZrIAtigVmjYkqZQTThHVlz0+TG6D+GDHWhVKvR2DifjtqJ0i+mb9gjo++hN+fWEQdWNGxKCiBBjwgT4EcXd6A==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@node-rs/bcrypt-darwin-arm64@1.10.4': - resolution: {integrity: sha512-gmHdWikHL3YVZgqXAHT+X/PG+kqIyNlPeFAWKdby83RkDI8FUiPV4qqGilgNnBmVWKkobRae9/I1HDbc4Sbhyg==} + '@node-rs/bcrypt-darwin-arm64@1.9.0': + resolution: {integrity: sha512-CQiS+F9Pa0XozvkXR1g7uXE9QvBOPOplDg0iCCPRYTN9PqA5qYxhwe48G3o+v2UeQceNRrbnEtWuANm7JRqIhw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@node-rs/bcrypt-darwin-arm64@1.9.2': - resolution: {integrity: sha512-svJKsGbzMAxOB5oluOYneN4YkKUy26WSMgm3KOIhgoX30IeMilj+2jFN/5qrI0oDZ0Iczb3XyL5DuZFtEkdP8A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@node-rs/bcrypt-darwin-x64@1.10.4': - resolution: {integrity: sha512-WDzL1WKRtoyTkH6IMPx95Mkd6XaeN0VWJbSDMqQY6AFBOk03yJEj7YYXshCcF+Ur6KBBVSwRf6sdFJ15NI1Z3g==} + '@node-rs/bcrypt-darwin-x64@1.9.0': + resolution: {integrity: sha512-4pTKGawYd7sNEjdJ7R/R67uwQH1VvwPZ0SSUMmeNHbxD5QlwAPXdDH11q22uzVXsvNFZ6nGQBg8No5OUGpx6Ug==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@node-rs/bcrypt-darwin-x64@1.9.2': - resolution: {integrity: sha512-9OrySjBi/rWix8NZWD/TrNbNcwMY0pAiMHdL09aJnJ07uPih83GGh1pq4UHCYFCMy7iTX8swOmDlGBUImkOZbg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@node-rs/bcrypt-freebsd-x64@1.10.4': - resolution: {integrity: sha512-seSPJi+4MIUd1faL/n/wmDdDwaynd/FTkvTnb7qzCk8LBT+/dxi7MTz+uaD8KYDREcB9Wmhv+lwr0S9/jBTcjg==} + '@node-rs/bcrypt-freebsd-x64@1.9.0': + resolution: {integrity: sha512-UmWzySX4BJhT/B8xmTru6iFif3h0Rpx3TqxRLCcbgmH43r7k5/9QuhpiyzpvKGpKHJCFNm4F3rC2wghvw5FCIg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@node-rs/bcrypt-freebsd-x64@1.9.2': - resolution: {integrity: sha512-/djXV71RO6g5L1mI2pVvmp3x3pH7G4uKI3ODG1JBIXoz334oOcCMh40sB0uq0ljP8WEadker01p4T1rJE98fpg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@node-rs/bcrypt-linux-arm-gnueabihf@1.10.4': - resolution: {integrity: sha512-YcMLUtN9cGNTWKnaXslxGO1M0S5b4QN9KYhuyG6Kju27RfqvU5UbmpKElCsEUO2EIjxGwzvPu59T+Fyh6sVbwg==} + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-8qoX4PgBND2cVwsbajoAWo3NwdfJPEXgpCsZQZURz42oMjbGyhhSYbovBCskGU3EBLoC8RA2B1jFWooeYVn5BA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2': - resolution: {integrity: sha512-F7wP950OTAooxEleUN4I2hqryGZK7hi1cSgRF13Wvbc597RFux35KiSxIXUA3mNt2DE7lV2PeceEtCOScaThWQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-gnu@1.10.4': - resolution: {integrity: sha512-uYGUK/mO8SiftqmVSAePWxgK82vg+X/gtrVRJi95yq2iwp1+fYJX3ndxCyYPmeplBbd3NJ/F5lPT3FC/IHTTGw==} + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-TuAC6kx0SbcIA4mSEWPi+OCcDjTQUMl213v5gMNlttF+D4ieIZx6pPDGTaMO6M2PDHTeCG0CBzZl0Lu+9b0c7Q==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@node-rs/bcrypt-linux-arm64-gnu@1.9.2': - resolution: {integrity: sha512-MehG+yQ0TgKMgKR1rO4hdvHkVsTM91Cof8qI9EJlS5+7+QSwfFA5O0zGwCkISD7bsyauJ5uJgcByGjpEobAHOg==} + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/sIvKDABOI8QOEnLD7hIj02BVaNOuCIWBKvxcJOt8+TuwJ6zmY1UI5kSv9d99WbiHjTp97wtAUbZQwauU4b9ew==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@node-rs/bcrypt-linux-arm64-musl@1.10.4': - resolution: {integrity: sha512-rLvSMW/gVUBd2k2gAqQfuOReHWd9+jvz58E3i1TbkRE3a5ChvjOFc9qKPEmXuXuD9Mdj7gUwcYwpq8MdB5MtNw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-PRZTAJjOwKEGsIhmBvfNh81So+wGl4QyCFAt23j+KwBujLStjC0N3YaqtTlWVKG9tcriPtmMYiAQtXWIyIgg/w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-gnu@1.10.4': - resolution: {integrity: sha512-I++6bh+BIp70X/D/crlSgCq8K0s9nGvzmvAGFkqSG4h3LBtjJx4RKbygnoWvcBV9ErK1rvcjfMyjwZt1ukueFA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-gnu@1.9.2': - resolution: {integrity: sha512-5WfGO+O1m7nJ55WZ8XDq+ItA98Z4O7sNWsR+1nIj9YGT+Tx5zkQ2RBhpK6oCWZMluuZ0eKQ0FDmyP6K+2NDRIA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@node-rs/bcrypt-linux-x64-musl@1.10.4': - resolution: {integrity: sha512-f9RPl/5n2NS0mMJXB4IYbodKnq5HzOK5x1b9eKbcjsY0rw3mJC3K0XRFc8iaw1a5chA+xV1TPXz5mkykmr2CQQ==} + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-DyyhDHDsLBsCKz1tZ1hLvUZSc1DK0FU0v52jK6IBQxrj24WscSU9zZe7ie/V9kdmA4Ep57BfpWX8Dsa2JxGdgQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@node-rs/bcrypt-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-VjCn0388p6PMCVUYHgYmHZrKNc7WwNJRr2WLJsHbQRGDOKbpNL6YolCjQxUchcSPDhzwrq1cIdy4j0fpoXEsdw==} + '@node-rs/bcrypt-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-duIiuqQ+Lew8ASSAYm6ZRqcmfBGWwsi81XLUwz86a2HR7Qv6V4yc3ZAUQovAikhjCsIqe8C11JlAZSK6+PlXYg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@node-rs/bcrypt-wasm32-wasi@1.10.4': - resolution: {integrity: sha512-VaDOf+wic0yoHFimMkC5VMa/33BNqg6ieD+C/ibb7Av3NnVW4/W9YpDpqAWMR2w3fA40uTLWZ7FZSrcFck27oA==} + '@node-rs/bcrypt-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-ylaGmn9Wjwv/D5lxtawttx3H6Uu2WTTR7lWlRHGT6Ga/MB1Vj4OjSGUW8G8zIVnKuXpGbZ92pgHlt4HUpSLctw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@node-rs/bcrypt-wasm32-wasi@1.9.2': - resolution: {integrity: sha512-P06aHfMzm9makwU+nM7WA65yQnS1xuqJ8l/6I/LvXjnl+lfB3DtJ2B0CSLtjnUGpUgcHbWl5gEbNnTPxSAirjQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@node-rs/bcrypt-win32-arm64-msvc@1.10.4': - resolution: {integrity: sha512-M7sGnbKPvhYJ5b76ywXiEwR4mIs/JSDHjRrhm9fshKAvltQrwc3Mou22TJggvDN3gKOF1W85uPiM2OgGX/jxMg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.2': - resolution: {integrity: sha512-Iyo/Q5/eNw27VRd3mLBgh1b9b5fnT3QHTVwxv3Siv/MRAIfJXH/cTOe18qSwYQzNh0ZioW4yemFPYCWSZi7szA==} + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-2h86gF7QFyEzODuDFml/Dp1MSJoZjxJ4yyT2Erf4NkwsiA5MqowUhUsorRwZhX6+2CtlGa7orbwi13AKMsYndw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@node-rs/bcrypt-win32-ia32-msvc@1.10.4': - resolution: {integrity: sha512-zn/n4DYnuOfC2JgmVDa0JHP+5DUqAOTl2jmV3yrMrmN+StDT4Om5wtvWxvEmgv3CkeZAuAU3Y/fwjSXIpZ0Fhg==} + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-kqxalCvhs4FkN0+gWWfa4Bdy2NQAkfiqq/CEf6mNXC13RSV673Ev9V8sRlQyNpCHCNkeXfOT9pgoBdJmMs9muA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@node-rs/bcrypt-win32-ia32-msvc@1.9.2': - resolution: {integrity: sha512-6LHWMaPylyyHoS5863YpxAACVB8DWCxro5W6pQ4h8WKSgHpJp8Um9jphTdN0A2w45HZjUnfcFuiFFC+TbftjCw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@node-rs/bcrypt-win32-x64-msvc@1.10.4': - resolution: {integrity: sha512-ynQokTTGbuLu/cckaD8dNcE+Zsfam1zElE+teNol8AxcL7Jv+ghJItSnRthPRV/vLxuycDF2DIICgpXG/p9jrQ==} + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-2y0Tuo6ZAT2Cz8V7DHulSlv1Bip3zbzeXyeur+uR25IRNYXKvI/P99Zl85Fbuu/zzYAZRLLlGTRe6/9IHofe/w==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@node-rs/bcrypt-win32-x64-msvc@1.9.2': - resolution: {integrity: sha512-vZ9T1MOaYkLO9FTyl28YX0SYJneiYTKNFgM8PUv8nas8xrD+7OzokA0fEtlNp6413T7IKSD/iG9qi8nTWsiyGg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@node-rs/bcrypt@1.10.4': - resolution: {integrity: sha512-Kzs8HKt2eBeT5VnkeKgiz/QKTjOO3URcvSNEQZahNwZnL6dBeeJQTxxYisc/6969+5n6c3+gNwKvqJsZzmGe7g==} - engines: {node: '>= 10'} - - '@node-rs/bcrypt@1.9.2': - resolution: {integrity: sha512-FKUo9iCSIti+ldwoOlY1ztyIFhZxEgT7jZ/UCt/9bg1rLmNdbQQD2JKIMImDCqmTWuLPY4ZF4Q5MyOMIfDCd8Q==} + '@node-rs/bcrypt@1.9.0': + resolution: {integrity: sha512-u2OlIxW264bFUfvbFqDz9HZKFjwe8FHFtn7T/U8mYjPZ7DWYpbUB+/dkW/QgYfMSfR0ejkyuWaBBe0coW7/7ig==} engines: {node: '>= 10'} '@nodelib/fs.scandir@2.1.5': @@ -1751,6 +1503,10 @@ packages: resolution: {integrity: sha512-FdLhg/E5PH5qZU/jf9NbvRi5v5134kbX7o8zIhOJIk/TALxB18ggprnH5tQX96dGQFqlLob8OLReaRwrpEF7YA==} engines: {node: '>=18.0.0'} + '@react-email/render@0.0.15': + resolution: {integrity: sha512-/pT5dBu0y1mogrfEpc002rgRcXpbShK6PFtxTVU6LZZ+bccvZPgk67HKc01lxpa1eYGQgZ6I+VQ02GRnMDclTg==} + engines: {node: '>=18.0.0'} + '@react-email/render@0.0.9': resolution: {integrity: sha512-nrim7wiACnaXsGtL7GF6jp3Qmml8J6vAjAH88jkC8lIbfNZaCyuPQHANjyYIXlvQeAbsWADQJFZgOHUqFqjh/A==} engines: {node: '>=18.0.0'} @@ -1923,9 +1679,6 @@ packages: '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -1980,9 +1733,6 @@ packages: '@types/react@18.2.79': resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -1992,17 +1742,6 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@6.21.0': resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2017,16 +1756,6 @@ packages: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2040,12 +1769,6 @@ packages: typescript: optional: true - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2141,8 +1864,8 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 @@ -2156,6 +1879,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -2199,8 +1927,8 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - arctic@0.10.6: - resolution: {integrity: sha512-c5qnHtk6a5wQva4DJyuPrPx7GklyOQXPZRnoUZFwoJjxD0lGCTNJkPQg5nQZ8lXvRhMGCYsMlmZRp2UiNwAkZw==} + arctic@1.9.1: + resolution: {integrity: sha512-ZHSeTdB+W2uvIAqH5yaBjepct0NrutQehe+nRJa5n4ONGEULUyCehf2m53W/0hyrs4nidqKhVUerrS8MuvUmPg==} arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -2670,8 +2398,8 @@ packages: resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.3: - resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} @@ -2693,8 +2421,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.1: - resolution: {integrity: sha512-GPqx+FX7mdqulCeQ4TsGZQ3djBJkx5k7zBGtqt9ycVlWNg8llJ4RO9n2vciu8BN2zAEs6lPbPl0asZsAh7oWzg==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -2867,6 +2595,9 @@ packages: resolution: {integrity: sha512-CO2JX/8/PT9bDGO1iXa5h5ey1skaKI1dvecERyhH4pp3PGjwd3KIjMAXEg79Ps9nclsdt4oPbfqiAnLU0EwrAQ==} engines: {node: '>=8.0.0'} + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2932,6 +2663,9 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3123,6 +2857,12 @@ packages: inline-style-parser@0.2.3: resolution: {integrity: sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==} + input-otp@1.2.4: + resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -3497,8 +3237,8 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - lucia@3.0.0-beta.13: - resolution: {integrity: sha512-p5qJWSFax+MSuifh1lJ37lj9l7q7hB3JgMNutRgy6PKF+3Aw4hMii+Sts5yR4t1ETodqlDmuOBE7mdarGQunwg==} + lucia@3.2.0: + resolution: {integrity: sha512-eXMxXwk6hqtjRTj4W/x3EnTUtAztLPm0p2N2TEBMDEbakDLXiYnDQ9z/qahjPdPdhPguQc+vwO0/88zIWxlpuw==} lucide-react@0.341.0: resolution: {integrity: sha512-fqI0TLU/VbzC3p90MHP3kdCRRUMTRT5qBfxwaXlllkZieYfRrMVd/RORXytqJUC2GBrvZdWYs6yvJIrqdsOmDQ==} @@ -3544,6 +3284,13 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + memfs-browser@3.5.10302: + resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + meow@7.1.1: resolution: {integrity: sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==} engines: {node: '>=10'} @@ -3713,12 +3460,11 @@ packages: next-international@1.2.4: resolution: {integrity: sha512-JQvp+h2iSgA/t8hu5S/Lwow1ZErJutQRdpnplxjv4VTlCiND8T95fYih8BjkHcVhQbtM+Wu9Mb1CM32wD9hlWQ==} - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + next-themes@0.3.0: + resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} peerDependencies: - next: '*' - react: '*' - react-dom: '*' + react: ^16.8 || ^17 || ^18 + react-dom: ^16.8 || ^17 || ^18 next@14.2.2: resolution: {integrity: sha512-oGwUaa2bCs47FbuxWMpOoXtBMPYpvTPgdZr3UAo+pu7Ns00z9otmYpoeV1HEiYL06AlRQQIA/ypK526KjJfaxg==} @@ -3824,14 +3570,11 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - oslo@0.25.1: - resolution: {integrity: sha512-XEmUNC9qeMx8UVtHsP6I2xXYSmzVsv/sZw5VsKMTJvXHd3boHAY016ZJtviXiBbE18ah/mU9Dyv4MizwOGShxw==} + oslo@1.2.0: + resolution: {integrity: sha512-OoFX6rDsNcOQVAD2gQD/z03u4vEjWZLzJtwkmgfRF+KpQUXwdgEXErD7zNhyowmHwHefP+PM9Pw13pgpHMRlzw==} - oslo@0.26.2: - resolution: {integrity: sha512-SY5AhyEc/Lvpq9ZeP/MuGXzI+TV6WRAIgSKtfyc0+/BSOhZr8vVTt/mfhOTATk41VsDeYcDutMKgLmFGOL4UMw==} - - oslo@0.28.0: - resolution: {integrity: sha512-4tCeHtjTp4iE7To9l9LXzoVncaxw/+hsJIlua2j4wusoMEzgUWb6l6RCaXWxWyypFaSR4nFjhBWC0YNCLQR0cA==} + oslo@1.2.1: + resolution: {integrity: sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -4097,6 +3840,9 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + react-remove-scroll-bar@2.3.6: resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} @@ -4182,8 +3928,8 @@ packages: remark-rehype@11.1.0: resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - resend@2.1.0: - resolution: {integrity: sha512-s6LlaEReTUvlbo6w3Eg1M1TMuwK9OKJ1GVgyptIV8smLPHhFZVqnwBTFPZHID9rcsih72t3iuyrtkQ3IIGwnow==} + resend@3.4.0: + resolution: {integrity: sha512-F3PVHdTHeLonSnrU5V6k8643LJ9QacLu3uI9M+BAFkmBmB1ELM2x7fdsziYZoSm6DmU6TKwiQCK0jf8dcNomcQ==} engines: {node: '>=18'} resolve-from@4.0.0: @@ -4281,10 +4027,6 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - sharp@0.33.3: - resolution: {integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==} - engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} - sharp@0.33.4: resolution: {integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==} engines: {libvips: '>=8.15.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -4502,11 +4244,6 @@ packages: uglify-js: optional: true - terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} - engines: {node: '>=10'} - hasBin: true - terser@5.31.1: resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} engines: {node: '>=10'} @@ -4609,8 +4346,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -4704,8 +4441,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - velite@0.1.0-rc.3: - resolution: {integrity: sha512-oBtGUZP8V2sqYGnH1ERpvZqE1sbjIFGsjg+D1zA7bzt2oQpvxYhBKtkOt4hDZIXPpTnWfx7HDnFSxZSQXVdReQ==} + velite@0.1.0: + resolution: {integrity: sha512-Kx6zo7tSyM+B18jgsQCq+RPfIM5lCp3mliIiYL4ykL8chJOf6L8FXd3etj3nW1VeSWLwq7tpj3geyNWIf9QVLg==} engines: {node: ^18.17.0 || >=20.3.0} hasBin: true @@ -4732,8 +4469,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -4833,155 +4570,154 @@ snapshots: effect: 3.3.1 fast-check: 3.19.0 - '@emnapi/core@1.2.0': + '@emnapi/core@0.45.0': dependencies: - '@emnapi/wasi-threads': 1.0.1 tslib: 2.6.3 optional: true - '@emnapi/runtime@1.2.0': + '@emnapi/runtime@0.45.0': dependencies: tslib: 2.6.3 optional: true - '@emnapi/wasi-threads@1.0.1': + '@emnapi/runtime@1.2.0': dependencies: tslib: 2.6.3 optional: true - '@esbuild/aix-ppc64@0.21.1': + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.16.4': optional: true - '@esbuild/android-arm64@0.21.1': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.16.4': optional: true - '@esbuild/android-arm@0.21.1': + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.16.4': optional: true - '@esbuild/android-x64@0.21.1': + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.16.4': optional: true - '@esbuild/darwin-arm64@0.21.1': + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.16.4': optional: true - '@esbuild/darwin-x64@0.21.1': + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.16.4': optional: true - '@esbuild/freebsd-arm64@0.21.1': + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.16.4': optional: true - '@esbuild/freebsd-x64@0.21.1': + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.16.4': optional: true - '@esbuild/linux-arm64@0.21.1': + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.16.4': optional: true - '@esbuild/linux-arm@0.21.1': + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.16.4': optional: true - '@esbuild/linux-ia32@0.21.1': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.16.4': optional: true - '@esbuild/linux-loong64@0.21.1': + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.16.4': optional: true - '@esbuild/linux-mips64el@0.21.1': + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.16.4': optional: true - '@esbuild/linux-ppc64@0.21.1': + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.16.4': optional: true - '@esbuild/linux-riscv64@0.21.1': + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.16.4': optional: true - '@esbuild/linux-s390x@0.21.1': + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.16.4': optional: true - '@esbuild/linux-x64@0.21.1': + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.16.4': optional: true - '@esbuild/netbsd-x64@0.21.1': + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.16.4': optional: true - '@esbuild/openbsd-x64@0.21.1': + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.16.4': optional: true - '@esbuild/sunos-x64@0.21.1': + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.16.4': optional: true - '@esbuild/win32-arm64@0.21.1': + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.16.4': optional: true - '@esbuild/win32-ia32@0.21.1': + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.16.4': optional: true - '@esbuild/win32-x64@0.21.1': + '@esbuild/win32-x64@0.21.5': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': @@ -5040,21 +4776,11 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@img/sharp-darwin-arm64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 - optional: true - '@img/sharp-darwin-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.2 optional: true - '@img/sharp-darwin-x64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 - optional: true - '@img/sharp-darwin-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.2 @@ -5084,85 +4810,44 @@ snapshots: '@img/sharp-libvips-linuxmusl-x64@1.0.2': optional: true - '@img/sharp-linux-arm64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 - optional: true - '@img/sharp-linux-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.2 optional: true - '@img/sharp-linux-arm@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 - optional: true - '@img/sharp-linux-arm@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.2 optional: true - '@img/sharp-linux-s390x@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 - optional: true - '@img/sharp-linux-s390x@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.2 optional: true - '@img/sharp-linux-x64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 - optional: true - '@img/sharp-linux-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.2 optional: true - '@img/sharp-linuxmusl-arm64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - optional: true - '@img/sharp-linuxmusl-arm64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 optional: true - '@img/sharp-linuxmusl-x64@0.33.3': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - optional: true - '@img/sharp-linuxmusl-x64@0.33.4': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.2 optional: true - '@img/sharp-wasm32@0.33.3': - dependencies: - '@emnapi/runtime': 1.2.0 - optional: true - '@img/sharp-wasm32@0.33.4': dependencies: '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.3': - optional: true - '@img/sharp-win32-ia32@0.33.4': optional: true - '@img/sharp-win32-x64@0.33.3': - optional: true - '@img/sharp-win32-x64@0.33.4': optional: true @@ -5197,10 +4882,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@lucia-auth/adapter-prisma@4.0.0-beta.8(@prisma/client@5.15.0(prisma@5.15.0))(lucia@3.0.0-beta.13)': + '@lucia-auth/adapter-prisma@4.0.1(@prisma/client@5.15.0(prisma@5.15.0))(lucia@3.2.0)': dependencies: '@prisma/client': 5.15.0(prisma@5.15.0) - lucia: 3.0.0-beta.13 + lucia: 3.2.0 '@manypkg/find-root@2.2.1': dependencies: @@ -5235,7 +4920,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.0 source-map: 0.7.4 - unified: 11.0.4 + unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 unist-util-visit: 5.0.0 @@ -5243,20 +4928,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@napi-rs/wasm-runtime@0.1.2': - dependencies: - '@emnapi/core': 1.2.0 - '@emnapi/runtime': 1.2.0 - '@tybys/wasm-util': 0.8.3 - optional: true - - '@napi-rs/wasm-runtime@0.2.4': - dependencies: - '@emnapi/core': 1.2.0 - '@emnapi/runtime': 1.2.0 - '@tybys/wasm-util': 0.9.0 - optional: true - '@next/env@14.2.2': {} '@next/eslint-plugin-next@14.2.2': @@ -5290,249 +4961,133 @@ snapshots: '@next/swc-win32-x64-msvc@14.2.2': optional: true - '@node-rs/argon2-android-arm-eabi@1.7.2': - optional: true - - '@node-rs/argon2-android-arm-eabi@1.8.3': - optional: true - - '@node-rs/argon2-android-arm64@1.7.2': - optional: true - - '@node-rs/argon2-android-arm64@1.8.3': + '@node-rs/argon2-android-arm-eabi@1.7.0': optional: true - '@node-rs/argon2-darwin-arm64@1.7.2': + '@node-rs/argon2-android-arm64@1.7.0': optional: true - '@node-rs/argon2-darwin-arm64@1.8.3': + '@node-rs/argon2-darwin-arm64@1.7.0': optional: true - '@node-rs/argon2-darwin-x64@1.7.2': + '@node-rs/argon2-darwin-x64@1.7.0': optional: true - '@node-rs/argon2-darwin-x64@1.8.3': + '@node-rs/argon2-freebsd-x64@1.7.0': optional: true - '@node-rs/argon2-freebsd-x64@1.7.2': + '@node-rs/argon2-linux-arm-gnueabihf@1.7.0': optional: true - '@node-rs/argon2-freebsd-x64@1.8.3': + '@node-rs/argon2-linux-arm64-gnu@1.7.0': optional: true - '@node-rs/argon2-linux-arm-gnueabihf@1.7.2': + '@node-rs/argon2-linux-arm64-musl@1.7.0': optional: true - '@node-rs/argon2-linux-arm-gnueabihf@1.8.3': + '@node-rs/argon2-linux-x64-gnu@1.7.0': optional: true - '@node-rs/argon2-linux-arm64-gnu@1.7.2': + '@node-rs/argon2-linux-x64-musl@1.7.0': optional: true - '@node-rs/argon2-linux-arm64-gnu@1.8.3': - optional: true - - '@node-rs/argon2-linux-arm64-musl@1.7.2': - optional: true - - '@node-rs/argon2-linux-arm64-musl@1.8.3': - optional: true - - '@node-rs/argon2-linux-x64-gnu@1.7.2': - optional: true - - '@node-rs/argon2-linux-x64-gnu@1.8.3': - optional: true - - '@node-rs/argon2-linux-x64-musl@1.7.2': - optional: true - - '@node-rs/argon2-linux-x64-musl@1.8.3': - optional: true - - '@node-rs/argon2-wasm32-wasi@1.7.2': - dependencies: - '@napi-rs/wasm-runtime': 0.1.2 - optional: true - - '@node-rs/argon2-wasm32-wasi@1.8.3': + '@node-rs/argon2-wasm32-wasi@1.7.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - optional: true - - '@node-rs/argon2-win32-arm64-msvc@1.7.2': - optional: true - - '@node-rs/argon2-win32-arm64-msvc@1.8.3': - optional: true - - '@node-rs/argon2-win32-ia32-msvc@1.7.2': + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 optional: true - '@node-rs/argon2-win32-ia32-msvc@1.8.3': + '@node-rs/argon2-win32-arm64-msvc@1.7.0': optional: true - '@node-rs/argon2-win32-x64-msvc@1.7.2': + '@node-rs/argon2-win32-ia32-msvc@1.7.0': optional: true - '@node-rs/argon2-win32-x64-msvc@1.8.3': + '@node-rs/argon2-win32-x64-msvc@1.7.0': optional: true - '@node-rs/argon2@1.7.2': - optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.7.2 - '@node-rs/argon2-android-arm64': 1.7.2 - '@node-rs/argon2-darwin-arm64': 1.7.2 - '@node-rs/argon2-darwin-x64': 1.7.2 - '@node-rs/argon2-freebsd-x64': 1.7.2 - '@node-rs/argon2-linux-arm-gnueabihf': 1.7.2 - '@node-rs/argon2-linux-arm64-gnu': 1.7.2 - '@node-rs/argon2-linux-arm64-musl': 1.7.2 - '@node-rs/argon2-linux-x64-gnu': 1.7.2 - '@node-rs/argon2-linux-x64-musl': 1.7.2 - '@node-rs/argon2-wasm32-wasi': 1.7.2 - '@node-rs/argon2-win32-arm64-msvc': 1.7.2 - '@node-rs/argon2-win32-ia32-msvc': 1.7.2 - '@node-rs/argon2-win32-x64-msvc': 1.7.2 - - '@node-rs/argon2@1.8.3': + '@node-rs/argon2@1.7.0': optionalDependencies: - '@node-rs/argon2-android-arm-eabi': 1.8.3 - '@node-rs/argon2-android-arm64': 1.8.3 - '@node-rs/argon2-darwin-arm64': 1.8.3 - '@node-rs/argon2-darwin-x64': 1.8.3 - '@node-rs/argon2-freebsd-x64': 1.8.3 - '@node-rs/argon2-linux-arm-gnueabihf': 1.8.3 - '@node-rs/argon2-linux-arm64-gnu': 1.8.3 - '@node-rs/argon2-linux-arm64-musl': 1.8.3 - '@node-rs/argon2-linux-x64-gnu': 1.8.3 - '@node-rs/argon2-linux-x64-musl': 1.8.3 - '@node-rs/argon2-wasm32-wasi': 1.8.3 - '@node-rs/argon2-win32-arm64-msvc': 1.8.3 - '@node-rs/argon2-win32-ia32-msvc': 1.8.3 - '@node-rs/argon2-win32-x64-msvc': 1.8.3 - - '@node-rs/bcrypt-android-arm-eabi@1.10.4': - optional: true - - '@node-rs/bcrypt-android-arm-eabi@1.9.2': - optional: true - - '@node-rs/bcrypt-android-arm64@1.10.4': - optional: true - - '@node-rs/bcrypt-android-arm64@1.9.2': - optional: true - - '@node-rs/bcrypt-darwin-arm64@1.10.4': - optional: true - - '@node-rs/bcrypt-darwin-arm64@1.9.2': - optional: true - - '@node-rs/bcrypt-darwin-x64@1.10.4': - optional: true + '@node-rs/argon2-android-arm-eabi': 1.7.0 + '@node-rs/argon2-android-arm64': 1.7.0 + '@node-rs/argon2-darwin-arm64': 1.7.0 + '@node-rs/argon2-darwin-x64': 1.7.0 + '@node-rs/argon2-freebsd-x64': 1.7.0 + '@node-rs/argon2-linux-arm-gnueabihf': 1.7.0 + '@node-rs/argon2-linux-arm64-gnu': 1.7.0 + '@node-rs/argon2-linux-arm64-musl': 1.7.0 + '@node-rs/argon2-linux-x64-gnu': 1.7.0 + '@node-rs/argon2-linux-x64-musl': 1.7.0 + '@node-rs/argon2-wasm32-wasi': 1.7.0 + '@node-rs/argon2-win32-arm64-msvc': 1.7.0 + '@node-rs/argon2-win32-ia32-msvc': 1.7.0 + '@node-rs/argon2-win32-x64-msvc': 1.7.0 - '@node-rs/bcrypt-darwin-x64@1.9.2': + '@node-rs/bcrypt-android-arm-eabi@1.9.0': optional: true - '@node-rs/bcrypt-freebsd-x64@1.10.4': + '@node-rs/bcrypt-android-arm64@1.9.0': optional: true - '@node-rs/bcrypt-freebsd-x64@1.9.2': + '@node-rs/bcrypt-darwin-arm64@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm-gnueabihf@1.10.4': + '@node-rs/bcrypt-darwin-x64@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.2': + '@node-rs/bcrypt-freebsd-x64@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm64-gnu@1.10.4': + '@node-rs/bcrypt-linux-arm-gnueabihf@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm64-gnu@1.9.2': + '@node-rs/bcrypt-linux-arm64-gnu@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm64-musl@1.10.4': + '@node-rs/bcrypt-linux-arm64-musl@1.9.0': optional: true - '@node-rs/bcrypt-linux-arm64-musl@1.9.2': + '@node-rs/bcrypt-linux-x64-gnu@1.9.0': optional: true - '@node-rs/bcrypt-linux-x64-gnu@1.10.4': + '@node-rs/bcrypt-linux-x64-musl@1.9.0': optional: true - '@node-rs/bcrypt-linux-x64-gnu@1.9.2': - optional: true - - '@node-rs/bcrypt-linux-x64-musl@1.10.4': - optional: true - - '@node-rs/bcrypt-linux-x64-musl@1.9.2': - optional: true - - '@node-rs/bcrypt-wasm32-wasi@1.10.4': + '@node-rs/bcrypt-wasm32-wasi@1.9.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - optional: true - - '@node-rs/bcrypt-wasm32-wasi@1.9.2': - dependencies: - '@napi-rs/wasm-runtime': 0.1.2 - optional: true - - '@node-rs/bcrypt-win32-arm64-msvc@1.10.4': - optional: true - - '@node-rs/bcrypt-win32-arm64-msvc@1.9.2': - optional: true - - '@node-rs/bcrypt-win32-ia32-msvc@1.10.4': + '@emnapi/core': 0.45.0 + '@emnapi/runtime': 0.45.0 + '@tybys/wasm-util': 0.8.3 + memfs-browser: 3.5.10302 optional: true - '@node-rs/bcrypt-win32-ia32-msvc@1.9.2': + '@node-rs/bcrypt-win32-arm64-msvc@1.9.0': optional: true - '@node-rs/bcrypt-win32-x64-msvc@1.10.4': + '@node-rs/bcrypt-win32-ia32-msvc@1.9.0': optional: true - '@node-rs/bcrypt-win32-x64-msvc@1.9.2': + '@node-rs/bcrypt-win32-x64-msvc@1.9.0': optional: true - '@node-rs/bcrypt@1.10.4': - optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.10.4 - '@node-rs/bcrypt-android-arm64': 1.10.4 - '@node-rs/bcrypt-darwin-arm64': 1.10.4 - '@node-rs/bcrypt-darwin-x64': 1.10.4 - '@node-rs/bcrypt-freebsd-x64': 1.10.4 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.10.4 - '@node-rs/bcrypt-linux-arm64-gnu': 1.10.4 - '@node-rs/bcrypt-linux-arm64-musl': 1.10.4 - '@node-rs/bcrypt-linux-x64-gnu': 1.10.4 - '@node-rs/bcrypt-linux-x64-musl': 1.10.4 - '@node-rs/bcrypt-wasm32-wasi': 1.10.4 - '@node-rs/bcrypt-win32-arm64-msvc': 1.10.4 - '@node-rs/bcrypt-win32-ia32-msvc': 1.10.4 - '@node-rs/bcrypt-win32-x64-msvc': 1.10.4 - - '@node-rs/bcrypt@1.9.2': + '@node-rs/bcrypt@1.9.0': optionalDependencies: - '@node-rs/bcrypt-android-arm-eabi': 1.9.2 - '@node-rs/bcrypt-android-arm64': 1.9.2 - '@node-rs/bcrypt-darwin-arm64': 1.9.2 - '@node-rs/bcrypt-darwin-x64': 1.9.2 - '@node-rs/bcrypt-freebsd-x64': 1.9.2 - '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.2 - '@node-rs/bcrypt-linux-arm64-gnu': 1.9.2 - '@node-rs/bcrypt-linux-arm64-musl': 1.9.2 - '@node-rs/bcrypt-linux-x64-gnu': 1.9.2 - '@node-rs/bcrypt-linux-x64-musl': 1.9.2 - '@node-rs/bcrypt-wasm32-wasi': 1.9.2 - '@node-rs/bcrypt-win32-arm64-msvc': 1.9.2 - '@node-rs/bcrypt-win32-ia32-msvc': 1.9.2 - '@node-rs/bcrypt-win32-x64-msvc': 1.9.2 + '@node-rs/bcrypt-android-arm-eabi': 1.9.0 + '@node-rs/bcrypt-android-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-arm64': 1.9.0 + '@node-rs/bcrypt-darwin-x64': 1.9.0 + '@node-rs/bcrypt-freebsd-x64': 1.9.0 + '@node-rs/bcrypt-linux-arm-gnueabihf': 1.9.0 + '@node-rs/bcrypt-linux-arm64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-arm64-musl': 1.9.0 + '@node-rs/bcrypt-linux-x64-gnu': 1.9.0 + '@node-rs/bcrypt-linux-x64-musl': 1.9.0 + '@node-rs/bcrypt-wasm32-wasi': 1.9.0 + '@node-rs/bcrypt-win32-arm64-msvc': 1.9.0 + '@node-rs/bcrypt-win32-ia32-msvc': 1.9.0 + '@node-rs/bcrypt-win32-x64-msvc': 1.9.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -6165,6 +5720,14 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@react-email/render@0.0.15': + dependencies: + html-to-text: 9.0.5 + js-beautify: 1.15.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-promise-suspense: 0.3.4 + '@react-email/render@0.0.9': dependencies: html-to-text: 9.0.5 @@ -6258,10 +5821,10 @@ snapshots: optionalDependencies: typescript: 5.3.3 - '@serwist/next@9.0.3(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.3.3)(webpack@5.91.0)': + '@serwist/next@9.0.3(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.3.3)(webpack@5.92.1)': dependencies: '@serwist/build': 9.0.3(typescript@5.3.3) - '@serwist/webpack-plugin': 9.0.3(typescript@5.3.3)(webpack@5.91.0) + '@serwist/webpack-plugin': 9.0.3(typescript@5.3.3)(webpack@5.92.1) '@serwist/window': 9.0.3(typescript@5.3.3) chalk: 5.3.0 glob: 10.4.1 @@ -6273,7 +5836,7 @@ snapshots: transitivePeerDependencies: - webpack - '@serwist/webpack-plugin@9.0.3(typescript@5.3.3)(webpack@5.91.0)': + '@serwist/webpack-plugin@9.0.3(typescript@5.3.3)(webpack@5.92.1)': dependencies: '@serwist/build': 9.0.3(typescript@5.3.3) pretty-bytes: 6.1.1 @@ -6281,7 +5844,7 @@ snapshots: zod: 3.23.8 optionalDependencies: typescript: 5.3.3 - webpack: 5.91.0 + webpack: 5.92.1 '@serwist/window@9.0.3(typescript@5.3.3)': dependencies: @@ -6314,11 +5877,6 @@ snapshots: tslib: 2.6.3 optional: true - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.6.3 - optional: true - '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 @@ -6349,7 +5907,8 @@ snapshots: dependencies: '@types/unist': 3.0.2 - '@types/json-schema@7.0.15': {} + '@types/json-schema@7.0.15': + optional: true '@types/json5@0.0.29': {} @@ -6380,34 +5939,12 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 - '@types/semver@7.5.8': {} - '@types/trusted-types@2.0.7': {} '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint@8.56.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 @@ -6426,18 +5963,6 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.5 - eslint: 8.56.0 - ts-api-utils: 1.3.0(typescript@5.3.3) - optionalDependencies: - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3)': @@ -6455,20 +5980,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -6604,17 +6115,23 @@ snapshots: abbrev@2.0.0: {} - acorn-import-assertions@1.9.0(acorn@8.11.3): + acorn-import-attributes@1.9.5(acorn@8.12.1): dependencies: - acorn: 8.11.3 + acorn: 8.12.1 optional: true acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + acorn@8.11.3: {} + acorn@8.12.1: {} + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -6652,9 +6169,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - arctic@0.10.6: + arctic@1.9.1: dependencies: - oslo: 0.28.0 + oslo: 1.2.0 arg@5.0.2: {} @@ -7199,7 +6716,7 @@ snapshots: iterator.prototype: 1.1.2 safe-array-concat: 1.1.2 - es-module-lexer@1.5.3: + es-module-lexer@1.5.4: optional: true es-object-atoms@1.0.0: @@ -7247,31 +6764,31 @@ snapshots: '@esbuild/win32-ia32': 0.16.4 '@esbuild/win32-x64': 0.16.4 - esbuild@0.21.1: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.1 - '@esbuild/android-arm': 0.21.1 - '@esbuild/android-arm64': 0.21.1 - '@esbuild/android-x64': 0.21.1 - '@esbuild/darwin-arm64': 0.21.1 - '@esbuild/darwin-x64': 0.21.1 - '@esbuild/freebsd-arm64': 0.21.1 - '@esbuild/freebsd-x64': 0.21.1 - '@esbuild/linux-arm': 0.21.1 - '@esbuild/linux-arm64': 0.21.1 - '@esbuild/linux-ia32': 0.21.1 - '@esbuild/linux-loong64': 0.21.1 - '@esbuild/linux-mips64el': 0.21.1 - '@esbuild/linux-ppc64': 0.21.1 - '@esbuild/linux-riscv64': 0.21.1 - '@esbuild/linux-s390x': 0.21.1 - '@esbuild/linux-x64': 0.21.1 - '@esbuild/netbsd-x64': 0.21.1 - '@esbuild/openbsd-x64': 0.21.1 - '@esbuild/sunos-x64': 0.21.1 - '@esbuild/win32-arm64': 0.21.1 - '@esbuild/win32-ia32': 0.21.1 - '@esbuild/win32-x64': 0.21.1 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 escalade@3.1.2: {} @@ -7286,8 +6803,8 @@ snapshots: '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-react: 7.34.2(eslint@8.56.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.56.0) @@ -7309,13 +6826,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0): dependencies: debug: 4.3.5 enhanced-resolve: 5.17.0 eslint: 8.56.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -7326,18 +6843,18 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -7347,7 +6864,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0))(eslint@8.56.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.56.0))(eslint@8.56.0))(eslint@8.56.0) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -7542,6 +7059,8 @@ snapshots: dependencies: pure-rand: 6.1.0 + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -7619,6 +7138,9 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-monkey@1.0.6: + optional: true + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -7851,6 +7373,11 @@ snapshots: inline-style-parser@0.2.3: {} + input-otp@1.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -8183,9 +7710,9 @@ snapshots: lru-cache@10.2.2: {} - lucia@3.0.0-beta.13: + lucia@3.2.0: dependencies: - oslo: 0.25.1 + oslo: 1.2.0 lucide-react@0.341.0(react@18.2.0): dependencies: @@ -8296,6 +7823,16 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + memfs-browser@3.5.10302: + dependencies: + memfs: 3.5.3 + optional: true + + memfs@3.5.3: + dependencies: + fs-monkey: 1.0.6 + optional: true + meow@7.1.1: dependencies: '@types/minimist': 1.2.5 @@ -8375,8 +7912,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.0 micromark-extension-mdx-md: 2.0.0 @@ -8588,9 +8125,8 @@ snapshots: international-types: 0.8.1 server-only: 0.0.1 - next-themes@0.2.1(next@14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-themes@0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - next: 14.2.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -8721,20 +8257,15 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - oslo@0.25.1: + oslo@1.2.0: dependencies: - '@node-rs/argon2': 1.8.3 - '@node-rs/bcrypt': 1.10.4 + '@node-rs/argon2': 1.7.0 + '@node-rs/bcrypt': 1.9.0 - oslo@0.26.2: + oslo@1.2.1: dependencies: - '@node-rs/argon2': 1.8.3 - '@node-rs/bcrypt': 1.10.4 - - oslo@0.28.0: - dependencies: - '@node-rs/argon2': 1.7.2 - '@node-rs/bcrypt': 1.9.2 + '@node-rs/argon2': 1.7.0 + '@node-rs/bcrypt': 1.9.0 p-limit@2.3.0: dependencies: @@ -8951,6 +8482,10 @@ snapshots: react-is@16.13.1: {} + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + react-remove-scroll-bar@2.3.6(@types/react@18.2.79)(react@18.2.0): dependencies: react: 18.2.0 @@ -9057,7 +8592,7 @@ snapshots: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.1 micromark-util-types: 2.0.0 - unified: 11.0.4 + unified: 11.0.5 transitivePeerDependencies: - supports-color @@ -9066,12 +8601,12 @@ snapshots: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.0 - unified: 11.0.4 + unified: 11.0.5 vfile: 6.0.1 - resend@2.1.0: + resend@3.4.0: dependencies: - '@react-email/render': 0.0.9 + '@react-email/render': 0.0.15 resolve-from@4.0.0: {} @@ -9193,32 +8728,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - sharp@0.33.3: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.2 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.3 - '@img/sharp-darwin-x64': 0.33.3 - '@img/sharp-libvips-darwin-arm64': 1.0.2 - '@img/sharp-libvips-darwin-x64': 1.0.2 - '@img/sharp-libvips-linux-arm': 1.0.2 - '@img/sharp-libvips-linux-arm64': 1.0.2 - '@img/sharp-libvips-linux-s390x': 1.0.2 - '@img/sharp-libvips-linux-x64': 1.0.2 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 - '@img/sharp-linux-arm': 0.33.3 - '@img/sharp-linux-arm64': 0.33.3 - '@img/sharp-linux-s390x': 0.33.3 - '@img/sharp-linux-x64': 0.33.3 - '@img/sharp-linuxmusl-arm64': 0.33.3 - '@img/sharp-linuxmusl-x64': 0.33.3 - '@img/sharp-wasm32': 0.33.3 - '@img/sharp-win32-ia32': 0.33.3 - '@img/sharp-win32-x64': 0.33.3 - sharp@0.33.4: dependencies: color: 4.2.3 @@ -9470,30 +8979,22 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.10(webpack@5.91.0): + terser-webpack-plugin@5.3.10(webpack@5.92.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.31.1 - webpack: 5.91.0 + webpack: 5.92.1 optional: true - terser@5.31.0: - dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 - terser@5.31.1: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 - optional: true text-table@0.2.0: {} @@ -9600,7 +9101,7 @@ snapshots: undici-types@5.26.5: {} - unified@11.0.4: + unified@11.0.5: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -9695,12 +9196,12 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - velite@0.1.0-rc.3: + velite@0.1.0: dependencies: '@mdx-js/mdx': 3.0.1 - esbuild: 0.21.1 - sharp: 0.33.3 - terser: 5.31.0 + esbuild: 0.21.5 + sharp: 0.33.4 + terser: 5.31.1 transitivePeerDependencies: - supports-color @@ -9732,19 +9233,19 @@ snapshots: webpack-sources@3.2.3: optional: true - webpack@5.91.0: + webpack@5.92.1: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) browserslist: 4.23.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.0 - es-module-lexer: 1.5.3 + es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -9755,7 +9256,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(webpack@5.92.1) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f77a668..a377875 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -17,8 +17,9 @@ model Session { user User @relation(references: [id], fields: [userId], onDelete: Cascade) } -model EmailVerificationToken { +model EmailVerificationCode { id String @id @default(cuid()) + code String userId String email String expiresAt DateTime @@ -26,15 +27,15 @@ model EmailVerificationToken { } model User { - id String @id @unique @default(cuid()) - name String? - email String? @unique - emailVerified Boolean? @default(false) - picture String? - githubId Int? @unique - sessions Session[] - projects Project[] - emailVerificationTokens EmailVerificationToken[] + id String @id @unique @default(cuid()) + name String? + email String? @unique + emailVerified Boolean? @default(false) + picture String? + githubId Int? @unique + sessions Session[] + projects Project[] + emailVerificationCodes EmailVerificationCode[] stripeCustomerId String? @unique @map(name: "stripe_customer_id") stripeSubscriptionId String? @unique @map(name: "stripe_subscription_id") diff --git a/src/server/auth.ts b/src/actions/auth.ts similarity index 57% rename from src/server/auth.ts rename to src/actions/auth.ts index 3602785..8884d40 100644 --- a/src/server/auth.ts +++ b/src/actions/auth.ts @@ -3,7 +3,8 @@ import { type Session, type User } from "lucia"; import { cookies } from "next/headers"; import { redirect } from "next/navigation"; -import { TimeSpan, createDate } from "oslo"; +import { TimeSpan, createDate, isWithinExpirationDate } from "oslo"; +import { alphabet, generateRandomString } from "oslo/crypto"; import { cache } from "react"; import db from "~/lib/db"; import { lucia } from "~/lib/lucia"; @@ -21,7 +22,6 @@ export const validateRequest = cache( } const result = await lucia.validateSession(sessionId); - // next.js throws when you attempt to set cookie when rendering page try { if (result.session && result.session.fresh) { const sessionCookie = lucia.createSessionCookie(result.session.id); @@ -39,7 +39,9 @@ export const validateRequest = cache( sessionCookie.attributes ); } - } catch {} + } catch { + // next.js throws when you attempt to set cookie when rendering page + } return result; } ); @@ -60,24 +62,59 @@ export async function logout() { sessionCookie.value, sessionCookie.attributes ); - return redirect("/login"); + redirect("/"); } -export async function createEmailVerificationToken( +export async function generateEmailVerificationCode( userId: string, email: string ): Promise { - await db.emailVerificationToken.deleteMany({ + await db.emailVerificationCode.deleteMany({ where: { userId, }, }); - const newToken = await db.emailVerificationToken.create({ + const code = generateRandomString(6, alphabet("0-9")); + await db.emailVerificationCode.create({ data: { userId, email, - expiresAt: createDate(new TimeSpan(3, "m")), + code, + expiresAt: createDate(new TimeSpan(10, "m")), // 10 minutes }, }); - return newToken.id; + return code; +} + +export async function verifyVerificationCode( + user: { id: string; email: string }, + code: string +): Promise { + return await db.$transaction(async (tx) => { + const databaseCode = await tx.emailVerificationCode.findFirst({ + where: { + userId: user.id, + }, + }); + + if (!databaseCode || databaseCode.code !== code) { + return false; + } + + await tx.emailVerificationCode.delete({ + where: { + id: databaseCode.id, + }, + }); + + if (!isWithinExpirationDate(databaseCode.expiresAt)) { + return false; + } + + if (databaseCode.email !== user.email) { + return false; + } + + return true; + }); } diff --git a/src/server/mail.ts b/src/actions/mail.ts similarity index 64% rename from src/server/mail.ts rename to src/actions/mail.ts index d4457f1..d08a504 100644 --- a/src/server/mail.ts +++ b/src/actions/mail.ts @@ -1,11 +1,10 @@ +"use server"; + import ThanksTemp from "emails/thanks"; import VerificationTemp from "emails/verification"; import { nanoid } from "nanoid"; import { resend } from "~/lib/resend"; -import { - type SendWelcomeEmailProps, - type sendVerificationEmailProps, -} from "~/types"; +import { type SendOTPProps, type SendWelcomeEmailProps } from "~/types"; export const sendWelcomeEmail = async ({ toMail, @@ -14,7 +13,6 @@ export const sendWelcomeEmail = async ({ const subject = "Thanks for using ChadNext!"; const temp = ThanksTemp({ userName }); - //@ts-expect-error text field is required await resend.emails.send({ from: `ChadNext App `, to: toMail, @@ -23,18 +21,14 @@ export const sendWelcomeEmail = async ({ "X-Entity-Ref-ID": nanoid(), }, react: temp, + text: "", }); }; -export const sendVerificationEmail = async ({ - toMail, - verificationUrl, - userName, -}: sendVerificationEmailProps) => { - const subject = "Email Verification for ChadNext"; - const temp = VerificationTemp({ userName, verificationUrl }); +export const sendOTP = async ({ toMail, code, userName }: SendOTPProps) => { + const subject = "OTP for ChadNext"; + const temp = VerificationTemp({ userName, code }); - //@ts-expect-error text field is required await resend.emails.send({ from: `ChadNext App `, to: toMail, @@ -43,5 +37,6 @@ export const sendVerificationEmail = async ({ "X-Entity-Ref-ID": nanoid(), }, react: temp, + text: "", }); }; diff --git a/src/server/utapi.ts b/src/actions/upload.ts similarity index 100% rename from src/server/utapi.ts rename to src/actions/upload.ts diff --git a/src/app/[locale]/dashboard/billing/page.tsx b/src/app/[locale]/dashboard/billing/page.tsx index c74229e..7352185 100644 --- a/src/app/[locale]/dashboard/billing/page.tsx +++ b/src/app/[locale]/dashboard/billing/page.tsx @@ -1,9 +1,9 @@ import { AlertTriangleIcon } from "lucide-react"; +import { validateRequest } from "~/actions/auth"; import { BillingForm } from "~/components/billing-form"; import { Alert, AlertDescription } from "~/components/ui/alert"; import { stripe } from "~/lib/stripe"; import { getUserSubscriptionPlan } from "~/lib/subscription"; -import { validateRequest } from "~/server/auth"; export const revalidate = 0; export const dynamic = "force-dynamic"; @@ -22,9 +22,9 @@ export default async function Billing() { isCanceled = stripePlan.cancel_at_period_end; } return ( -
+
-
+
diff --git a/src/app/[locale]/dashboard/layout.tsx b/src/app/[locale]/dashboard/layout.tsx index da37b5d..b18ea4b 100644 --- a/src/app/[locale]/dashboard/layout.tsx +++ b/src/app/[locale]/dashboard/layout.tsx @@ -1,6 +1,6 @@ import { redirect } from "next/navigation"; +import { validateRequest } from "~/actions/auth"; import SidebarNav from "~/components/layout/sidebar-nav"; -import { validateRequest } from "~/server/auth"; interface DashboardLayoutProps { children: React.ReactNode; diff --git a/src/app/[locale]/dashboard/projects/action.ts b/src/app/[locale]/dashboard/projects/action.ts index dc11389..cc4a643 100644 --- a/src/app/[locale]/dashboard/projects/action.ts +++ b/src/app/[locale]/dashboard/projects/action.ts @@ -3,9 +3,9 @@ import { type Project } from "@prisma/client"; import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; +import { validateRequest } from "~/actions/auth"; import db from "~/lib/db"; import { getUserSubscriptionPlan } from "~/lib/subscription"; -import { validateRequest } from "~/server/auth"; interface Payload { name: string; diff --git a/src/app/[locale]/dashboard/settings/actions.ts b/src/app/[locale]/dashboard/settings/actions.ts index 3152433..cd9414e 100644 --- a/src/app/[locale]/dashboard/settings/actions.ts +++ b/src/app/[locale]/dashboard/settings/actions.ts @@ -1,9 +1,9 @@ "use server"; import { revalidatePath } from "next/cache"; +import { utapi } from "~/actions/upload"; import db from "~/lib/db"; import { getImageKeyFromUrl, isOurCdnUrl } from "~/lib/utils"; -import { utapi } from "~/server/utapi"; import { type payload } from "~/types"; export const updateUser = async (id: string, payload: payload) => { diff --git a/src/app/[locale]/dashboard/settings/page.tsx b/src/app/[locale]/dashboard/settings/page.tsx index c015344..b67b515 100644 --- a/src/app/[locale]/dashboard/settings/page.tsx +++ b/src/app/[locale]/dashboard/settings/page.tsx @@ -1,6 +1,6 @@ import { type User } from "lucia"; import { type Metadata } from "next"; -import { validateRequest } from "~/server/auth"; +import { validateRequest } from "~/actions/auth"; import SettingsForm from "./settings-form"; export const metadata: Metadata = { diff --git a/src/app/[locale]/login/page.tsx b/src/app/[locale]/login/page.tsx index ec86c79..57455e1 100644 --- a/src/app/[locale]/login/page.tsx +++ b/src/app/[locale]/login/page.tsx @@ -1,18 +1,18 @@ import { redirect } from "next/navigation"; +import { validateRequest } from "~/actions/auth"; import AuthForm from "~/components/layout/auth-form"; import { Card } from "~/components/ui/card"; -import { validateRequest } from "~/server/auth"; export default async function Login() { const { session } = await validateRequest(); if (session) redirect("/"); return (
-
+

- Welcome Back 👋 + Login

diff --git a/src/app/api/auth/email-verify/route.ts b/src/app/api/auth/email-verify/route.ts deleted file mode 100644 index 1a9fac4..0000000 --- a/src/app/api/auth/email-verify/route.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { PrismaClientKnownRequestError } from "@prisma/client/runtime/library"; -import { cookies } from "next/headers"; -import { type NextRequest } from "next/server"; -import { isWithinExpirationDate } from "oslo"; -import db from "~/lib/db"; -import { lucia } from "~/lib/lucia"; - -export const GET = async (req: NextRequest) => { - const url = new URL(req.url); - const verificationToken = url.searchParams.get("token"); - - if (!verificationToken) { - return new Response("Invalid token", { - status: 400, - }); - } - - try { - const [token] = await db.$transaction([ - db.emailVerificationToken.findFirst({ - where: { - id: verificationToken!, - }, - }), - db.emailVerificationToken.delete({ - where: { - id: verificationToken!, - }, - }), - ]); - - if (!token || !isWithinExpirationDate(token.expiresAt)) { - return new Response("Token expired", { - status: 400, - }); - } - const user = await db.user.findFirst({ - where: { - id: token.userId, - }, - }); - if (!user || user.email !== token.email) { - return new Response("Invalid token", { - status: 400, - }); - } - - await lucia.invalidateUserSessions(user.id); - await db.user.upsert({ - where: { - id: user.id, - emailVerified: false, - }, - update: { - emailVerified: true, - }, - create: {}, - }); - - const session = await lucia.createSession(user.id, {}); - const sessionCookie = lucia.createSessionCookie(session.id); - cookies().set( - sessionCookie.name, - sessionCookie.value, - sessionCookie.attributes - ); - return new Response(null, { - status: 302, - headers: { - Location: "/dashboard", - }, - }); - } catch (error) { - console.log(error); - if (error instanceof PrismaClientKnownRequestError) { - if ( - error.code === "P2025" || - error.meta?.cause === "Record to delete does not exist." - ) { - return new Response("Token already used", { - status: 404, - }); - } - } - - return new Response("Something went wrong.", { - status: 500, - }); - } -}; diff --git a/src/app/api/auth/login/github/callback/route.ts b/src/app/api/auth/login/github/callback/route.ts index a032c81..eb3e143 100644 --- a/src/app/api/auth/login/github/callback/route.ts +++ b/src/app/api/auth/login/github/callback/route.ts @@ -1,9 +1,10 @@ import { OAuth2RequestError } from "arctic"; import { cookies } from "next/headers"; import type { NextRequest } from "next/server"; +import { sendWelcomeEmail } from "~/actions/mail"; import db from "~/lib/db"; -import { github, lucia } from "~/lib/lucia"; -import { sendWelcomeEmail } from "~/server/mail"; +import { github } from "~/lib/github"; +import { lucia } from "~/lib/lucia"; export const GET = async (request: NextRequest) => { const url = new URL(request.url); diff --git a/src/app/api/auth/login/github/route.ts b/src/app/api/auth/login/github/route.ts index 44c2f99..d88026a 100644 --- a/src/app/api/auth/login/github/route.ts +++ b/src/app/api/auth/login/github/route.ts @@ -1,6 +1,6 @@ import { generateState } from "arctic"; import { cookies } from "next/headers"; -import { github } from "~/lib/lucia"; +import { github } from "~/lib/github"; export const GET = async () => { const state = generateState(); diff --git a/src/app/api/auth/login/magic-link/route.ts b/src/app/api/auth/login/send-otp/route.ts similarity index 61% rename from src/app/api/auth/login/magic-link/route.ts rename to src/app/api/auth/login/send-otp/route.ts index 01c7b8c..7123d5b 100644 --- a/src/app/api/auth/login/magic-link/route.ts +++ b/src/app/api/auth/login/send-otp/route.ts @@ -1,7 +1,7 @@ +import { generateEmailVerificationCode } from "~/actions/auth"; +import { sendOTP } from "~/actions/mail"; import { siteUrl } from "~/config/site"; import db from "~/lib/db"; -import { createEmailVerificationToken } from "~/server/auth"; -import { sendVerificationEmail } from "~/server/mail"; export const POST = async (req: Request) => { const body = await req.json(); @@ -18,15 +18,10 @@ export const POST = async (req: Request) => { }, }); - const verificationToken = await createEmailVerificationToken( - user.id, - body.email - ); - const verificationUrl = - siteUrl + "/api/auth/email-verify?token=" + verificationToken; - await sendVerificationEmail({ + const otp = await generateEmailVerificationCode(user.id, body.email); + await sendOTP({ toMail: body.email, - verificationUrl, + code: otp, userName: user.name?.split(" ")[0] || "", }); diff --git a/src/app/api/auth/login/verify-otp/route.ts b/src/app/api/auth/login/verify-otp/route.ts new file mode 100644 index 0000000..d36f269 --- /dev/null +++ b/src/app/api/auth/login/verify-otp/route.ts @@ -0,0 +1,68 @@ +import { cookies } from "next/headers"; +import { verifyVerificationCode } from "~/actions/auth"; +import db from "~/lib/db"; +import { lucia } from "~/lib/lucia"; + +export const POST = async (req: Request) => { + const body = await req.json(); + + try { + const user = await db.user.findFirst({ + where: { + email: body.email, + }, + select: { + id: true, + email: true, + emailVerified: true, + }, + }); + + if (!user) { + return new Response(null, { + status: 400, + }); + } + + const isValid = await verifyVerificationCode( + { id: user.id, email: body.email }, + body.code + ); + + if (!isValid) { + return new Response(null, { + status: 400, + }); + } + + await lucia.invalidateUserSessions(user.id); + + if (!user.emailVerified) { + await db.user.update({ + where: { + id: user.id, + }, + data: { + emailVerified: true, + }, + }); + } + + const session = await lucia.createSession(user.id, {}); + const sessionCookie = lucia.createSessionCookie(session.id); + cookies().set( + sessionCookie.name, + sessionCookie.value, + sessionCookie.attributes + ); + return new Response(null, { + status: 200, + }); + } catch (error) { + console.log(error); + + return new Response(null, { + status: 500, + }); + } +}; diff --git a/src/app/api/og/route.ts b/src/app/api/og/route.ts index 1ec9097..4a35261 100644 --- a/src/app/api/og/route.ts +++ b/src/app/api/og/route.ts @@ -23,7 +23,6 @@ export async function GET(request: Request) { height: 630, } ); - // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { console.log(`${e.message}`); return new Response(`Failed to generate the image`, { diff --git a/src/app/api/stripe/route.ts b/src/app/api/stripe/route.ts index f9eb5df..3fe440c 100644 --- a/src/app/api/stripe/route.ts +++ b/src/app/api/stripe/route.ts @@ -1,10 +1,10 @@ import { type NextRequest } from "next/server"; import { z } from "zod"; +import { validateRequest } from "~/actions/auth"; import { siteConfig } from "~/config/site"; import { proPlan } from "~/config/subscription"; import { stripe } from "~/lib/stripe"; import { getUserSubscriptionPlan } from "~/lib/subscription"; -import { validateRequest } from "~/server/auth"; export async function GET(req: NextRequest) { const locale = req.cookies.get("Next-Locale")?.value || "en"; diff --git a/src/app/api/uploadthing/core.ts b/src/app/api/uploadthing/core.ts index b6106f6..2eb6926 100644 --- a/src/app/api/uploadthing/core.ts +++ b/src/app/api/uploadthing/core.ts @@ -1,5 +1,5 @@ import { createUploadthing, type FileRouter } from "uploadthing/next"; -import { validateRequest } from "~/server/auth"; +import { validateRequest } from "~/actions/auth"; const f = createUploadthing(); diff --git a/src/components/layout/auth-form.tsx b/src/components/layout/auth-form.tsx index 7d9db73..9546b24 100644 --- a/src/components/layout/auth-form.tsx +++ b/src/components/layout/auth-form.tsx @@ -4,13 +4,15 @@ import { zodResolver } from "@hookform/resolvers/zod"; import Link from "next/link"; import { useState } from "react"; import { useForm } from "react-hook-form"; -import { z } from "zod"; +import { set, z } from "zod"; import { Button, buttonVariants } from "~/components/ui/button"; import { cn } from "~/lib/utils"; import Icons from "../shared/icons"; import { Input } from "../ui/input"; +import { InputOTP, InputOTPGroup, InputOTPSlot } from "../ui/input-otp"; import { Label } from "../ui/label"; import { toast } from "../ui/use-toast"; +import { useRouter } from "next/navigation"; const userAuthSchema = z.object({ email: z.string().email("Please enter a valid email address."), @@ -19,8 +21,11 @@ const userAuthSchema = z.object({ type FormData = z.infer; export default function AuthForm() { + const router = useRouter(); + const [currentStep, setCurrentStep] = useState(1); const [isLoading, setIsLoading] = useState(false); const [isGithubLoading, setIsGithubLoading] = useState(false); + const [otp, setOTP] = useState(""); const { register, @@ -31,83 +36,150 @@ export default function AuthForm() { resolver: zodResolver(userAuthSchema), }); - async function onSubmit(data: FormData) { + async function onEmailSubmit(data: FormData) { setIsLoading(true); try { - const res = await fetch("/api/auth/login/magic-link", { + const res = await fetch("/api/auth/login/send-otp", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), }); + if (!res.ok) { + throw new Error("Failed to send OTP"); + } + setCurrentStep(2); + toast({ + title: "OTP sent!", + description: "Please check your mail inbox", + }); + } catch (error) { + toast({ + title: "Failed to send OTP", + description: "Please try again later", + variant: "destructive", + }); + } finally { setIsLoading(false); + } + } + + async function onOTPSubmit(data: FormData) { + setIsLoading(true); + + try { + const res = await fetch("/api/auth/login/verify-otp", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ email: data.email, code: otp }), + }); if (!res.ok) { - return toast({ - title: "Failed to send Magic link!", - description: "Please try again later.", - variant: "destructive", - }); + throw new Error("Invalid OTP"); } - - reset(); toast({ - title: "Magic Link sent!", - description: "Please check your mail inbox", + title: "Successfully verified!", }); + router.push("/dashboard"); } catch (error) { - console.log(error); + toast({ + title: "Invalid OTP", + description: "Please try again", + variant: "destructive", + }); + } finally { + setIsLoading(false); } } return (
-
-
-
- - - {errors?.email && ( -

- {errors?.email.message} -

- )} + {currentStep === 1 && ( + <> + +
+
+ + + {errors?.email && ( +

+ {errors?.email.message} +

+ )} +
+ +
+ +
+ /
- -
- -
- / -
- {isGithubLoading ? ( - - ) : ( - setIsGithubLoading(true)} - > - Continue with - + + ) : ( + setIsGithubLoading(true)} + > + Continue with + + )} + + )} + {currentStep === 2 && ( +
+
+
+ +
+ + + + + + + + + + +
+
+ +
+
)}
); diff --git a/src/components/layout/header/index.tsx b/src/components/layout/header/index.tsx index df08afa..9b05ab7 100644 --- a/src/components/layout/header/index.tsx +++ b/src/components/layout/header/index.tsx @@ -1,5 +1,5 @@ +import { validateRequest } from "~/actions/auth"; import { getScopedI18n } from "~/locales/server"; -import { validateRequest } from "~/server/auth"; import Navbar from "./navbar"; export default async function Header() { diff --git a/src/components/layout/login-modal.tsx b/src/components/layout/login-modal.tsx index 95ddbc5..7c9d822 100644 --- a/src/components/layout/login-modal.tsx +++ b/src/components/layout/login-modal.tsx @@ -20,8 +20,8 @@ export default function LoginModal() { -

- Welcome Back 👋 +

+ Login

diff --git a/src/components/sections/pricing.tsx b/src/components/sections/pricing.tsx index eb6b36d..2454117 100644 --- a/src/components/sections/pricing.tsx +++ b/src/components/sections/pricing.tsx @@ -1,7 +1,7 @@ import Link from "next/link"; +import { validateRequest } from "~/actions/auth"; import { getUserSubscriptionPlan } from "~/lib/subscription"; import { cn } from "~/lib/utils"; -import { validateRequest } from "~/server/auth"; import { Badge } from "../ui/badge"; import { buttonVariants } from "../ui/button"; import { @@ -36,7 +36,7 @@ export default async function Pricing() { Free Plan{" "} {subscription && !subscription?.isPro && ( - Current + Current )} Up to 3 projects @@ -51,7 +51,7 @@ export default async function Pricing() {

- + {!subscription ? ( Get Started @@ -70,7 +70,7 @@ export default async function Pricing() { Pro Plan{" "} {subscription && subscription?.isPro && ( - Current + Current )} Unlimited projects @@ -85,7 +85,7 @@ export default async function Pricing() {

- + {!subscription ? "Get Started" diff --git a/src/components/shared/logout-button.tsx b/src/components/shared/logout-button.tsx index 211247f..b6b1008 100644 --- a/src/components/shared/logout-button.tsx +++ b/src/components/shared/logout-button.tsx @@ -1,5 +1,5 @@ import { LogOutIcon } from "lucide-react"; -import { logout } from "~/server/auth"; +import { logout } from "~/actions/auth"; import { Button } from "../ui/button"; export default function LogoutButton({ className }: { className?: string }) { diff --git a/src/components/ui/input-otp.tsx b/src/components/ui/input-otp.tsx new file mode 100644 index 0000000..524de7c --- /dev/null +++ b/src/components/ui/input-otp.tsx @@ -0,0 +1,71 @@ +"use client"; + +import * as React from "react"; +import { OTPInput, OTPInputContext } from "input-otp"; +import { Dot } from "lucide-react"; + +import { cn } from "~/lib/utils"; + +const InputOTP = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, containerClassName, ...props }, ref) => ( + +)); +InputOTP.displayName = "InputOTP"; + +const InputOTPGroup = React.forwardRef< + React.ElementRef<"div">, + React.ComponentPropsWithoutRef<"div"> +>(({ className, ...props }, ref) => ( +
+)); +InputOTPGroup.displayName = "InputOTPGroup"; + +const InputOTPSlot = React.forwardRef< + React.ElementRef<"div">, + React.ComponentPropsWithoutRef<"div"> & { index: number } +>(({ index, className, ...props }, ref) => { + const inputOTPContext = React.useContext(OTPInputContext); + const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]; + + return ( +
+ {char} + {hasFakeCaret && ( +
+
+
+ )} +
+ ); +}); +InputOTPSlot.displayName = "InputOTPSlot"; + +const InputOTPSeparator = React.forwardRef< + React.ElementRef<"div">, + React.ComponentPropsWithoutRef<"div"> +>(({ ...props }, ref) => ( +
+ +
+)); +InputOTPSeparator.displayName = "InputOTPSeparator"; + +export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }; diff --git a/src/lib/github.ts b/src/lib/github.ts new file mode 100644 index 0000000..3fd6965 --- /dev/null +++ b/src/lib/github.ts @@ -0,0 +1,6 @@ +import { GitHub } from "arctic"; + +export const github = new GitHub( + process.env.GITHUB_CLIENT_ID!, + process.env.GITHUB_CLIENT_SECRET! +); diff --git a/src/lib/lucia.ts b/src/lib/lucia.ts index f4853e6..bae29df 100644 --- a/src/lib/lucia.ts +++ b/src/lib/lucia.ts @@ -1,5 +1,4 @@ import { PrismaAdapter } from "@lucia-auth/adapter-prisma"; -import { GitHub } from "arctic"; import { Lucia } from "lucia"; import db from "./db"; @@ -20,8 +19,3 @@ export const lucia = new Lucia(adapter, { }; }, }); - -export const github = new GitHub( - process.env.GITHUB_CLIENT_ID!, - process.env.GITHUB_CLIENT_SECRET! -); diff --git a/src/lib/subscription.ts b/src/lib/subscription.ts index 8e4c394..e83c5e1 100644 --- a/src/lib/subscription.ts +++ b/src/lib/subscription.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ import { freePlan, proPlan } from "~/config/subscription"; import { type UserSubscriptionPlan } from "~/types"; import db from "./db"; diff --git a/src/types/index.ts b/src/types/index.ts index 47c3024..8ba54bc 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -49,6 +49,6 @@ export interface SendWelcomeEmailProps { userName: string; } -export interface sendVerificationEmailProps extends SendWelcomeEmailProps { - verificationUrl: string; +export interface SendOTPProps extends SendWelcomeEmailProps { + code: string; } diff --git a/src/types/lucia.d.ts b/src/types/lucia.d.ts index 77970af..1b4d398 100644 --- a/src/types/lucia.d.ts +++ b/src/types/lucia.d.ts @@ -3,6 +3,7 @@ import { lucia } from "~/lib/lucia"; declare module "lucia" { interface Register { Lucia: typeof lucia; + DatabaseUserAttributes: DatabaseUserAttributes; } interface DatabaseUserAttributes { name: string; diff --git a/tailwind.config.js b/tailwind.config.js index 661f3df..8d3ae0b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -57,6 +57,15 @@ module.exports = { sans: ["var(--font-sans)", ...fontFamily.sans], heading: ["var(--font-heading)", ...fontFamily.sans], }, + keyframes: { + "caret-blink": { + "0%,70%,100%": { opacity: "1" }, + "20%,50%": { opacity: "0" }, + }, + }, + animation: { + "caret-blink": "caret-blink 1.25s ease-out infinite", + }, }, }, plugins: [require("tailwindcss-animate"), require("@tailwindcss/typography")],