feat(frontend): Update better-auth, add orga slug check, add PDF preview, fix invitation

This commit is contained in:
2025-07-27 09:03:11 +02:00
parent bd49291bf2
commit 4d1280749f
6 changed files with 116 additions and 77 deletions

View File

@@ -6,6 +6,12 @@ export function useBetterAuth() {
const { organization } = useAuth() const { organization } = useAuth()
async function createOrganization(name: string, slug: string, logo?: string) { async function createOrganization(name: string, slug: string, logo?: string) {
const slugCheck = await organization.checkSlug({ slug })
if (!slugCheck.data.available) {
toast.add({ title: 'Slug bereits vergeben', description: 'Bitte wählen Sie einen anderen Slug', color: 'error' })
return Promise.reject()
}
await organization.create( await organization.create(
{ name, slug, logo }, { name, slug, logo },
{ {

View File

@@ -7,12 +7,13 @@
"dev": "nuxt dev --port 3001 --host", "dev": "nuxt dev --port 3001 --host",
"generate": "nuxt generate", "generate": "nuxt generate",
"preview": "nuxt preview", "preview": "nuxt preview",
"postinstall": "nuxt prepare && pnpm run fix:bettersqlite && pnpm run api:generate", "postinstall": "nuxt prepare && pnpm run fix:bettersqlite && pnpm run api:generate && pnpm run api:middleware:generate",
"format": "prettier . --write", "format": "prettier . --write",
"type-check": "nuxi typecheck", "type-check": "nuxi typecheck",
"lint": "eslint .", "lint": "eslint .",
"lint:fix": "eslint . --fix", "lint:fix": "eslint . --fix",
"api:generate": "openapi-generator-cli generate -i ../legalconsenthub-backend/api/legalconsenthub.yml -g typescript-fetch -o .api-client", "api:generate": "openapi-generator-cli generate -i ../legalconsenthub-backend/api/legalconsenthub.yml -g typescript-fetch -o .api-client",
"api:middleware:generate": "openapi-generator-cli generate -i ../legalconsenthub-middleware/api/legalconsenthub-middleware.yml -g typescript-fetch -o .api-client-middleware",
"fix:bettersqlite": "cd node_modules/better-sqlite3 && pnpm dlx node-gyp rebuild && cd ../..", "fix:bettersqlite": "cd node_modules/better-sqlite3 && pnpm dlx node-gyp rebuild && cd ../..",
"generate:betterauth": "pnpm dlx @better-auth/cli generate --config server/utils/auth.ts", "generate:betterauth": "pnpm dlx @better-auth/cli generate --config server/utils/auth.ts",
"migrate:betterauth": "pnpm dlx @better-auth/cli migrate --config server/utils/auth.ts" "migrate:betterauth": "pnpm dlx @better-auth/cli migrate --config server/utils/auth.ts"
@@ -20,7 +21,7 @@
"dependencies": { "dependencies": {
"@nuxt/ui-pro": "3.1.1", "@nuxt/ui-pro": "3.1.1",
"@pinia/nuxt": "0.10.1", "@pinia/nuxt": "0.10.1",
"better-auth": "1.1.16", "better-auth": "1.3.4",
"better-sqlite3": "11.8.1", "better-sqlite3": "11.8.1",
"nuxt": "3.16.1", "nuxt": "3.16.1",
"pinia": "3.0.1", "pinia": "3.0.1",

View File

@@ -89,30 +89,34 @@
<div class="flex-1"> <div class="flex-1">
<p class="font-medium mb-2">Invites</p> <p class="font-medium mb-2">Invites</p>
<div class="space-y-2"> <div class="space-y-2">
<div <template v-if="activeOrganization?.invitations">
v-for="inv in activeOrganization?.invitations.filter((i: Invitation) => i.status === 'pending')" <div
:key="inv.id" v-for="invitation in activeOrganization?.invitations.filter(
class="flex justify-between items-center" (i: Invitation) => i.status === 'pending'
> )"
<div> :key="invitation.id"
<p class="text-sm">{{ inv.email }}</p> class="flex justify-between items-center"
<p class="text-xs text-gray-500">{{ inv.role }}</p> >
<div>
<p class="text-sm">{{ invitation.email }}</p>
<p class="text-xs text-gray-500">{{ invitation.role }}</p>
</div>
<div class="flex items-center gap-2">
<UButton
size="xs"
color="error"
:loading="isRevoking.includes(invitation.id)"
@click="() => handleRevokeInvitation(invitation.id)"
>
Revoke
</UButton>
<UButton icon="i-lucide-copy" size="xs" @click="copy(getInviteLink(invitation.id))">
{{ copied ? 'Copied!' : 'Copy' }}
</UButton>
</div>
</div> </div>
<div class="flex items-center gap-2"> </template>
<UButton <p v-if="!activeOrganization?.invitations?.length" class="text-sm text-gray-500">
size="xs"
color="error"
:loading="isRevoking.includes(inv.id)"
@click="() => handleRevokeInvitation(inv.id)"
>
Revoke
</UButton>
<UButton icon="i-lucide-copy" size="xs" @click="copy(getInviteLink(inv.id))">
{{ copied ? 'Copied!' : 'Copy' }}
</UButton>
</div>
</div>
<p v-if="!activeOrganization?.invitations.length" class="text-sm text-gray-500">
No active invitations No active invitations
</p> </p>
<p v-if="!activeOrganization?.id" class="text-xs text-gray-500"> <p v-if="!activeOrganization?.id" class="text-xs text-gray-500">
@@ -137,6 +141,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { useClipboard } from '@vueuse/core' import { useClipboard } from '@vueuse/core'
import type { Invitation } from 'better-auth/plugins'
const { copy, copied } = useClipboard() const { copy, copied } = useClipboard()
const toast = useToast() const toast = useToast()
@@ -173,7 +178,7 @@ async function handleRevokeInvitation(invitationId: string) {
isRevoking.value = isRevoking.value.filter((id) => id !== invitationId) isRevoking.value = isRevoking.value.filter((id) => id !== invitationId)
if (activeOrganization.value) { if (activeOrganization.value) {
activeOrganization.value.invitations = activeOrganization.value.invitations.filter( activeOrganization.value.invitations = activeOrganization.value.invitations.filter(
(inv) => inv.id !== invitationId (invitation: Invitation) => invitation.id !== invitationId
) )
} }
}, },

View File

@@ -14,7 +14,9 @@
</UDashboardNavbar> </UDashboardNavbar>
<UDashboardToolbar> <UDashboardToolbar>
<template #left> toolbar left </template> <template #right>
<UButton icon="i-lucide-file-text" size="md" color="primary" variant="solid" target="_blank" :to="`/api/application-forms/${applicationForm.id}/pdf`">PDF Vorschau</UButton>
</template>
</UDashboardToolbar> </UDashboardToolbar>
</template> </template>

View File

@@ -10,13 +10,13 @@ importers:
dependencies: dependencies:
'@nuxt/ui-pro': '@nuxt/ui-pro':
specifier: 3.1.1 specifier: 3.1.1
version: 3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@3.24.2) version: 3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)
'@pinia/nuxt': '@pinia/nuxt':
specifier: 0.10.1 specifier: 0.10.1
version: 0.10.1(magicast@0.3.5)(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3))) version: 0.10.1(magicast@0.3.5)(pinia@3.0.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))
better-auth: better-auth:
specifier: 1.1.16 specifier: 1.3.4
version: 1.1.16 version: 1.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
better-sqlite3: better-sqlite3:
specifier: 11.8.1 specifier: 11.8.1
version: 11.8.1 version: 11.8.1
@@ -220,11 +220,11 @@ packages:
resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
'@better-auth/utils@0.2.3': '@better-auth/utils@0.2.5':
resolution: {integrity: sha512-Ap1GaSmo6JYhJhxJOpUB0HobkKPTNzfta+bLV89HfpyCAHN7p8ntCrmNFHNAVD0F6v0mywFVEUg1FUhNCc81Rw==} resolution: {integrity: sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ==}
'@better-fetch/fetch@1.1.12': '@better-fetch/fetch@1.1.18':
resolution: {integrity: sha512-B3bfloI/2UBQWIATRN6qmlORrvx3Mp0kkNjmXLv0b+DtbtR+pP4/I5kQA/rDUv+OReLywCCldf6co4LdDmh8JA==} resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==}
'@capsizecss/metrics@3.5.0': '@capsizecss/metrics@3.5.0':
resolution: {integrity: sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==} resolution: {integrity: sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==}
@@ -771,8 +771,8 @@ packages:
'@noble/ciphers@0.6.0': '@noble/ciphers@0.6.0':
resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==}
'@noble/hashes@1.7.1': '@noble/hashes@1.8.0':
resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==}
engines: {node: ^14.21.3 || >=16} engines: {node: ^14.21.3 || >=16}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
@@ -1955,11 +1955,19 @@ packages:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
better-auth@1.1.16: better-auth@1.3.4:
resolution: {integrity: sha512-Xc5pxafKZw4QVU8WYfkV2z4Hd8KCXXbphrgOpe2gA/EfanysLBhE1G/F7cEi5e0bW2pGR+vw6gf0ARHA7VFihg==} resolution: {integrity: sha512-JbZYam6Cs3Eu5CSoMK120zSshfaKvrCftSo/+v7524H1RvhryQ7UtMbzagBcXj0Digjj8hZtVkkR4tTZD/wK2g==}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
peerDependenciesMeta:
react:
optional: true
react-dom:
optional: true
better-call@0.3.3: better-call@1.0.12:
resolution: {integrity: sha512-N4lDVm0NGmFfDJ0XMQ4O83Zm/3dPlvIQdxvwvgSLSkjFX5PM4GUYSVAuxNzXN27QZMHDkrJTWUqxBrm4tPC3eA==} resolution: {integrity: sha512-ssq5OfB9Ungv2M1WVrRnMBomB0qz1VKuhkY2WxjHaLtlsHoSe9EPolj1xf7xf8LY9o3vfk3Rx6rCWI4oVHeBRg==}
better-sqlite3@11.8.1: better-sqlite3@11.8.1:
resolution: {integrity: sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg==} resolution: {integrity: sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg==}
@@ -3328,9 +3336,9 @@ packages:
kolorist@1.8.0: kolorist@1.8.0:
resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
kysely@0.27.6: kysely@0.28.3:
resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} resolution: {integrity: sha512-svKnkSH72APRdjfVCCOknxaC9Eb3nA2StHG9d5/sKOqRvHRp2Dtf1XwDvc92b4B5v6LV+EAGWXQbZ5jMOvHaDw==}
engines: {node: '>=14.0.0'} engines: {node: '>=20.0.0'}
launch-editor@2.10.0: launch-editor@2.10.0:
resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==}
@@ -4378,6 +4386,9 @@ packages:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
set-cookie-parser@2.7.1:
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
setprototypeof@1.2.0: setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
@@ -4705,6 +4716,11 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
typescript@5.8.3:
resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
engines: {node: '>=14.17'}
hasBin: true
ufo@1.5.4: ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
@@ -5246,33 +5262,33 @@ packages:
peerDependencies: peerDependencies:
zod: ^3.24.1 zod: ^3.24.1
zod@3.24.2: zod@4.0.10:
resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} resolution: {integrity: sha512-3vB+UU3/VmLL2lvwcY/4RV2i9z/YU0DTV/tDuYjrwmx5WeJ7hwy+rGEEx8glHp6Yxw7ibRbKSaIFBgReRPe5KA==}
snapshots: snapshots:
'@ai-sdk/provider-utils@2.2.8(zod@3.24.2)': '@ai-sdk/provider-utils@2.2.8(zod@4.0.10)':
dependencies: dependencies:
'@ai-sdk/provider': 1.1.3 '@ai-sdk/provider': 1.1.3
nanoid: 3.3.11 nanoid: 3.3.11
secure-json-parse: 2.7.0 secure-json-parse: 2.7.0
zod: 3.24.2 zod: 4.0.10
'@ai-sdk/provider@1.1.3': '@ai-sdk/provider@1.1.3':
dependencies: dependencies:
json-schema: 0.4.0 json-schema: 0.4.0
'@ai-sdk/ui-utils@1.2.11(zod@3.24.2)': '@ai-sdk/ui-utils@1.2.11(zod@4.0.10)':
dependencies: dependencies:
'@ai-sdk/provider': 1.1.3 '@ai-sdk/provider': 1.1.3
'@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) '@ai-sdk/provider-utils': 2.2.8(zod@4.0.10)
zod: 3.24.2 zod: 4.0.10
zod-to-json-schema: 3.24.5(zod@3.24.2) zod-to-json-schema: 3.24.5(zod@4.0.10)
'@ai-sdk/vue@1.2.12(vue@3.5.13(typescript@5.7.3))(zod@3.24.2)': '@ai-sdk/vue@1.2.12(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)':
dependencies: dependencies:
'@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) '@ai-sdk/provider-utils': 2.2.8(zod@4.0.10)
'@ai-sdk/ui-utils': 1.2.11(zod@3.24.2) '@ai-sdk/ui-utils': 1.2.11(zod@4.0.10)
swrv: 1.1.0(vue@3.5.13(typescript@5.7.3)) swrv: 1.1.0(vue@3.5.13(typescript@5.7.3))
optionalDependencies: optionalDependencies:
vue: 3.5.13(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3)
@@ -5468,11 +5484,12 @@ snapshots:
'@babel/helper-string-parser': 7.25.9 '@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9 '@babel/helper-validator-identifier': 7.25.9
'@better-auth/utils@0.2.3': '@better-auth/utils@0.2.5':
dependencies: dependencies:
typescript: 5.8.3
uncrypto: 0.1.3 uncrypto: 0.1.3
'@better-fetch/fetch@1.1.12': {} '@better-fetch/fetch@1.1.18': {}
'@capsizecss/metrics@3.5.0': {} '@capsizecss/metrics@3.5.0': {}
@@ -5920,7 +5937,7 @@ snapshots:
'@noble/ciphers@0.6.0': {} '@noble/ciphers@0.6.0': {}
'@noble/hashes@1.7.1': {} '@noble/hashes@1.8.0': {}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
dependencies: dependencies:
@@ -6262,12 +6279,12 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- magicast - magicast
'@nuxt/ui-pro@3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@3.24.2)': '@nuxt/ui-pro@3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)':
dependencies: dependencies:
'@ai-sdk/vue': 1.2.12(vue@3.5.13(typescript@5.7.3))(zod@3.24.2) '@ai-sdk/vue': 1.2.12(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)
'@nuxt/kit': 3.17.2(magicast@0.3.5) '@nuxt/kit': 3.17.2(magicast@0.3.5)
'@nuxt/schema': 3.17.2 '@nuxt/schema': 3.17.2
'@nuxt/ui': 3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@3.24.2) '@nuxt/ui': 3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)
'@standard-schema/spec': 1.0.0 '@standard-schema/spec': 1.0.0
'@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.7.3)) '@vueuse/core': 13.1.0(vue@3.5.13(typescript@5.7.3))
consola: 3.4.2 consola: 3.4.2
@@ -6285,7 +6302,7 @@ snapshots:
unplugin-auto-import: 19.1.2(@nuxt/kit@3.17.2(magicast@0.3.5))(@vueuse/core@13.1.0(vue@3.5.13(typescript@5.7.3))) unplugin-auto-import: 19.1.2(@nuxt/kit@3.17.2(magicast@0.3.5))(@vueuse/core@13.1.0(vue@3.5.13(typescript@5.7.3)))
unplugin-vue-components: 28.5.0(@babel/parser@7.27.0)(@nuxt/kit@3.17.2(magicast@0.3.5))(vue@3.5.13(typescript@5.7.3)) unplugin-vue-components: 28.5.0(@babel/parser@7.27.0)(@nuxt/kit@3.17.2(magicast@0.3.5))(vue@3.5.13(typescript@5.7.3))
optionalDependencies: optionalDependencies:
zod: 3.24.2 zod: 4.0.10
transitivePeerDependencies: transitivePeerDependencies:
- '@azure/app-configuration' - '@azure/app-configuration'
- '@azure/cosmos' - '@azure/cosmos'
@@ -6326,7 +6343,7 @@ snapshots:
- vue - vue
- vue-router - vue-router
'@nuxt/ui@3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@3.24.2)': '@nuxt/ui@3.1.1(@babel/parser@7.27.0)(axios@1.7.9)(db0@0.3.1(better-sqlite3@11.8.1))(embla-carousel@8.6.0)(ioredis@5.6.0)(magicast@0.3.5)(typescript@5.7.3)(vite@6.2.3(@types/node@22.13.14)(jiti@2.4.2)(lightningcss@1.29.2)(terser@5.39.0)(yaml@2.7.0))(vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))(zod@4.0.10)':
dependencies: dependencies:
'@iconify/vue': 4.3.0(vue@3.5.13(typescript@5.7.3)) '@iconify/vue': 4.3.0(vue@3.5.13(typescript@5.7.3))
'@internationalized/date': 3.8.0 '@internationalized/date': 3.8.0
@@ -6373,7 +6390,7 @@ snapshots:
vue-component-type-helpers: 2.2.10 vue-component-type-helpers: 2.2.10
optionalDependencies: optionalDependencies:
vue-router: 4.5.0(vue@3.5.13(typescript@5.7.3)) vue-router: 4.5.0(vue@3.5.13(typescript@5.7.3))
zod: 3.24.2 zod: 4.0.10
transitivePeerDependencies: transitivePeerDependencies:
- '@azure/app-configuration' - '@azure/app-configuration'
- '@azure/cosmos' - '@azure/cosmos'
@@ -7497,27 +7514,30 @@ snapshots:
basic-ftp@5.0.5: {} basic-ftp@5.0.5: {}
better-auth@1.1.16: better-auth@1.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies: dependencies:
'@better-auth/utils': 0.2.3 '@better-auth/utils': 0.2.5
'@better-fetch/fetch': 1.1.12 '@better-fetch/fetch': 1.1.18
'@noble/ciphers': 0.6.0 '@noble/ciphers': 0.6.0
'@noble/hashes': 1.7.1 '@noble/hashes': 1.8.0
'@simplewebauthn/browser': 13.1.0 '@simplewebauthn/browser': 13.1.0
'@simplewebauthn/server': 13.1.1 '@simplewebauthn/server': 13.1.1
better-call: 0.3.3 better-call: 1.0.12
defu: 6.1.4 defu: 6.1.4
jose: 5.10.0 jose: 5.10.0
kysely: 0.27.6 kysely: 0.28.3
nanostores: 0.11.4 nanostores: 0.11.4
zod: 3.24.2 zod: 4.0.10
optionalDependencies:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
better-call@0.3.3: better-call@1.0.12:
dependencies: dependencies:
'@better-fetch/fetch': 1.1.12 '@better-fetch/fetch': 1.1.18
rou3: 0.5.1 rou3: 0.5.1
set-cookie-parser: 2.7.1
uncrypto: 0.1.3 uncrypto: 0.1.3
zod: 3.24.2
better-sqlite3@11.8.1: better-sqlite3@11.8.1:
dependencies: dependencies:
@@ -8975,7 +8995,7 @@ snapshots:
kolorist@1.8.0: {} kolorist@1.8.0: {}
kysely@0.27.6: {} kysely@0.28.3: {}
launch-editor@2.10.0: launch-editor@2.10.0:
dependencies: dependencies:
@@ -10223,6 +10243,8 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
set-cookie-parser@2.7.1: {}
setprototypeof@1.2.0: {} setprototypeof@1.2.0: {}
shebang-command@2.0.0: shebang-command@2.0.0:
@@ -10534,6 +10556,8 @@ snapshots:
typescript@5.7.3: {} typescript@5.7.3: {}
typescript@5.8.3: {}
ufo@1.5.4: {} ufo@1.5.4: {}
ufo@1.6.1: {} ufo@1.6.1: {}
@@ -11038,8 +11062,8 @@ snapshots:
compress-commons: 6.0.2 compress-commons: 6.0.2
readable-stream: 4.7.0 readable-stream: 4.7.0
zod-to-json-schema@3.24.5(zod@3.24.2): zod-to-json-schema@3.24.5(zod@4.0.10):
dependencies: dependencies:
zod: 3.24.2 zod: 4.0.10
zod@3.24.2: {} zod@4.0.10: {}

View File

@@ -6,6 +6,7 @@ import { resend } from './mail'
export const auth = betterAuth({ export const auth = betterAuth({
database: new Database('./sqlite.db'), database: new Database('./sqlite.db'),
emailAndPassword: { enabled: true, autoSignIn: false }, emailAndPassword: { enabled: true, autoSignIn: false },
trustedOrigins: ["http://localhost:3001"],
plugins: [ plugins: [
jwt({ jwt({
jwt: { jwt: {