From ae39cc111fc79056e7bc9b460c50152bc4728873 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 9 Jan 2026 19:38:54 +0700 Subject: [PATCH 1/2] add log for sign in, sign out, change password, remove upload file --- package.json | 3 +- pnpm-lock.yaml | 47 +- .../20260108130508_audit/migration.sql | 16 + prisma/schema.prisma | 16 + project.inlang/settings.json | 6 +- src/components/Header.tsx | 11 - src/components/form/change-password-form.tsx | 12 +- src/components/form/profile-form.tsx | 27 +- src/components/form/settings-form.tsx | 5 +- src/components/form/signin-form.tsx | 14 +- src/components/sidebar/nav-user.tsx | 12 +- src/data/demo.punk-songs.ts | 13 - src/generated/prisma/browser.ts | 5 + src/generated/prisma/client.ts | 5 + src/generated/prisma/internal/class.ts | 14 +- .../prisma/internal/prismaNamespace.ts | 94 +- .../prisma/internal/prismaNamespaceBrowser.ts | 17 +- src/generated/prisma/models.ts | 1 + src/generated/prisma/models/Audit.ts | 1445 +++++++++++++++++ src/generated/prisma/models/User.ts | 162 ++ src/lib/auth.ts | 68 + src/lib/auth/session.ts | 6 - src/routeTree.gen.ts | 2 +- src/routes/(app)/(auth)/route.tsx | 12 +- src/routes/__root.tsx | 99 +- src/routes/{api/auth.$.ts => api.auth.$.ts} | 0 src/service/audit.api.ts | 15 + src/service/profile.api.ts | 17 - src/service/queries.ts | 2 - src/service/setting.api.ts | 22 +- src/utils/disk-storage.ts | 26 - src/utils/help.ts | 9 + 32 files changed, 1991 insertions(+), 212 deletions(-) create mode 100644 prisma/migrations/20260108130508_audit/migration.sql delete mode 100644 src/data/demo.punk-songs.ts create mode 100644 src/generated/prisma/models/Audit.ts rename src/routes/{api/auth.$.ts => api.auth.$.ts} (100%) create mode 100644 src/service/audit.api.ts delete mode 100644 src/utils/disk-storage.ts create mode 100644 src/utils/help.ts diff --git a/package.json b/package.json index 45eae4f..dc1ce76 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,9 @@ "@tanstack/react-router-ssr-query": "^1.131.7", "@tanstack/react-start": "^1.132.0", "@tanstack/router-plugin": "^1.132.0", - "better-auth": "^1.4.7", + "better-auth": "^1.4.10", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "i18next": "^25.7.3", "next-themes": "^0.4.6", "prisma": "^7.1.0", "radix-ui": "^1.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d77308..bc0ce56 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -54,17 +54,14 @@ importers: specifier: ^1.132.0 version: 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) better-auth: - specifier: ^1.4.7 - version: 1.4.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)) + specifier: ^1.4.10 + version: 1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 clsx: specifier: ^2.1.1 version: 2.1.1 - i18next: - specifier: ^25.7.3 - version: 25.7.3(typescript@5.9.3) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -342,8 +339,8 @@ packages: '@types/react': optional: true - '@better-auth/core@1.4.9': - resolution: {integrity: sha512-JT2q4NDkQzN22KclUEoZ7qU6tl9HUTfK1ctg2oWlT87SEagkwJcnrUwS9VznL+u9ziOIfY27P0f7/jSnmvLcoQ==} + '@better-auth/core@1.4.10': + resolution: {integrity: sha512-AThrfb6CpG80wqkanfrbN2/fGOYzhGladHFf3JhaWt/3/Vtf4h084T6PJLrDE7M/vCCGYvDI1DkvP3P1OB2HAg==} peerDependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 @@ -352,10 +349,10 @@ packages: kysely: ^0.28.5 nanostores: ^1.0.1 - '@better-auth/telemetry@1.4.9': - resolution: {integrity: sha512-Tthy1/Gmx+pYlbvRQPBTKfVei8+pJwvH1NZp+5SbhwA6K2EXIaoonx/K6N/AXYs2aKUpyR4/gzqDesDjL7zd6A==} + '@better-auth/telemetry@1.4.10': + resolution: {integrity: sha512-Dq4XJX6EKsUu0h3jpRagX739p/VMOTcnJYWRrLtDYkqtZFg+sFiFsSWVcfapZoWpRSUGYX9iKwl6nDHn6Ju2oQ==} peerDependencies: - '@better-auth/core': 1.4.9 + '@better-auth/core': 1.4.10 '@better-auth/utils@0.3.0': resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} @@ -2435,8 +2432,8 @@ packages: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true - better-auth@1.4.9: - resolution: {integrity: sha512-usSdjuyTzZwIvM8fjF8YGhPncxV3MAg3dHUO9uPUnf0yklXUSYISiH1+imk6/Z+UBqsscyyPRnbIyjyK97p7YA==} + better-auth@1.4.10: + resolution: {integrity: sha512-0kqwEBJLe8eyFzbUspRG/htOriCf9uMLlnpe34dlIJGdmDfPuQISd4shShvUrvIVhPxsY1dSTXdXPLpqISYOYg==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3320,14 +3317,6 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - i18next@25.7.3: - resolution: {integrity: sha512-2XaT+HpYGuc2uTExq9TVRhLsso+Dxym6PWaKpn36wfBmTI779OQ7iP/XaZHzrnGyzU4SHpFrTYLKfVyBfAhVNA==} - peerDependencies: - typescript: ^5 - peerDependenciesMeta: - typescript: - optional: true - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -5119,7 +5108,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@better-auth/core@1.4.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': + '@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': dependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 @@ -5130,9 +5119,9 @@ snapshots: nanostores: 1.1.0 zod: 4.2.1 - '@better-auth/telemetry@1.4.9(@better-auth/core@1.4.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))': + '@better-auth/telemetry@1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))': dependencies: - '@better-auth/core': 1.4.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 @@ -7340,10 +7329,10 @@ snapshots: baseline-browser-mapping@2.9.11: {} - better-auth@1.4.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)): + better-auth@1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)): dependencies: - '@better-auth/core': 1.4.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) - '@better-auth/telemetry': 1.4.9(@better-auth/core@1.4.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) + '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/telemetry': 1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.1.1 @@ -8249,12 +8238,6 @@ snapshots: human-signals@8.0.1: {} - i18next@25.7.3(typescript@5.9.3): - dependencies: - '@babel/runtime': 7.28.4 - optionalDependencies: - typescript: 5.9.3 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 diff --git a/prisma/migrations/20260108130508_audit/migration.sql b/prisma/migrations/20260108130508_audit/migration.sql new file mode 100644 index 0000000..3fea8ab --- /dev/null +++ b/prisma/migrations/20260108130508_audit/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "audit" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "action" TEXT NOT NULL, + "tableName" TEXT NOT NULL, + "recordId" TEXT NOT NULL, + "oldValue" TEXT, + "newValue" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "audit_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "audit" ADD CONSTRAINT "audit_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index eb0b813..585f92e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -18,6 +18,7 @@ model User { updatedAt DateTime @updatedAt sessions Session[] accounts Account[] + audit Audit[] role String? banned Boolean? @default(false) @@ -142,3 +143,18 @@ model Setting { @@map("setting") } + +model Audit { + id String @id @default(uuid()) + userId String + action String + tableName String + recordId String + oldValue String? + newValue String? + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@map("audit") +} diff --git a/project.inlang/settings.json b/project.inlang/settings.json index 05729a3..89c8bd3 100644 --- a/project.inlang/settings.json +++ b/project.inlang/settings.json @@ -4,13 +4,9 @@ "locales": ["en", "vi"], "modules": [ "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js", - "https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@latest/dist/index.js" + "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js" ], "plugin.inlang.messageFormat": { "pathPattern": "./messages/{locale}.json" - }, - "plugin.inlang.i18next": { - "pathPattern": "./messages/{locale}.json" } } diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 35efaa1..3e1ac3f 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -73,17 +73,6 @@ export default function Header() { )} - {/* setIsOpen(false)} - className="flex-1 flex items-center gap-3 p-3 rounded-lg hover:bg-gray-800 transition-colors mb-2" - activeProps={{ - className: - 'flex-1 flex items-center gap-3 p-3 rounded-lg bg-cyan-600 hover:bg-cyan-700 transition-colors mb-2', - }} - > - Start - SSR Demos - */} ); } diff --git a/src/components/form/change-password-form.tsx b/src/components/form/change-password-form.tsx index 2fcc96e..05061ce 100644 --- a/src/components/form/change-password-form.tsx +++ b/src/components/form/change-password-form.tsx @@ -2,7 +2,6 @@ import { authClient } from '@/lib/auth-client'; import { m } from '@/paraglide/messages'; import { KeyIcon } from '@phosphor-icons/react'; import { useForm } from '@tanstack/react-form'; -import i18next from 'i18next'; import { toast } from 'sonner'; import z from 'zod'; import { Button } from '../ui/button'; @@ -72,9 +71,14 @@ const ChangePasswordForm = () => { }, onError: (ctx) => { console.log(ctx.error.code); - toast.error(i18next.t(`backend_${ctx.error.code}` as any), { - richColors: true, - }); + toast.error( + ( + m[`backend_${ctx.error.code}` as keyof typeof m] as () => string + )(), + { + richColors: true, + }, + ); }, }, ); diff --git a/src/components/form/profile-form.tsx b/src/components/form/profile-form.tsx index 83df190..61f6642 100644 --- a/src/components/form/profile-form.tsx +++ b/src/components/form/profile-form.tsx @@ -1,11 +1,9 @@ import { authClient } from '@/lib/auth-client'; import { m } from '@/paraglide/messages'; -import { uploadProfileImage } from '@/service/profile.api'; import { ProfileInput, profileUpdateSchema } from '@/service/profile.schema'; import { UserCircleIcon } from '@phosphor-icons/react'; import { useForm } from '@tanstack/react-form'; import { useQueryClient } from '@tanstack/react-query'; -import i18next from 'i18next'; import { useRef } from 'react'; import { toast } from 'sonner'; import { useAuth } from '../auth/auth-provider'; @@ -37,21 +35,9 @@ const ProfileForm = () => { }, onSubmit: async ({ value }) => { try { - let imageKey; - if (value.image) { - // upload image - const formData = new FormData(); - formData.set('file', value.image); - const { imageKey: uploadedKey } = await uploadProfileImage({ - data: formData, - }); - imageKey = uploadedKey; - } - await authClient.updateUser( { name: value.name, - image: imageKey, }, { onSuccess: () => { @@ -67,9 +53,16 @@ const ProfileForm = () => { }); }, onError: (ctx) => { - toast.error(i18next.t(`backend.${ctx.error.code}` as any), { - richColors: true, - }); + toast.error( + ( + m[ + `backend_${ctx.error.code}` as keyof typeof m + ] as () => string + )(), + { + richColors: true, + }, + ); }, }, ); diff --git a/src/components/form/settings-form.tsx b/src/components/form/settings-form.tsx index 8e05e37..ba2cd93 100644 --- a/src/components/form/settings-form.tsx +++ b/src/components/form/settings-form.tsx @@ -27,10 +27,7 @@ const SettingsForm = () => { const updateMutation = useMutation({ mutationFn: updateAdminSettings, onSuccess: () => { - // setLocale(variables.data.site_language as Locale); - queryClient.invalidateQueries({ - queryKey: [...settingQueries.all, 'list'], - }); + queryClient.invalidateQueries(settingQueries.listAdmin()); toast.success(m.settings_messages_update_success(), { richColors: true, }); diff --git a/src/components/form/signin-form.tsx b/src/components/form/signin-form.tsx index eb11f36..724f22c 100644 --- a/src/components/form/signin-form.tsx +++ b/src/components/form/signin-form.tsx @@ -3,7 +3,6 @@ import { m } from '@/paraglide/messages'; import { useForm } from '@tanstack/react-form'; import { useQueryClient } from '@tanstack/react-query'; import { createLink, useNavigate } from '@tanstack/react-router'; -import i18next from 'i18next'; import { toast } from 'sonner'; import z from 'zod'; import { Button } from '../ui/button'; @@ -14,7 +13,7 @@ import { Input } from '../ui/input'; const SignInFormSchema = z.object({ email: z .string() - .nonempty(m.common_is_required({ field: m.login_page_form_email })) + .nonempty(m.common_is_required({ field: m.login_page_form_email() })) .email(m.login_page_messages_email_invalid()), password: z.string().nonempty( m.common_is_required({ @@ -52,9 +51,14 @@ const SignInForm = () => { }); }, onError: (ctx) => { - toast.error(i18next.t(`backend.${ctx.error.code}` as any), { - richColors: true, - }); + toast.error( + ( + m[`backend_${ctx.error.code}` as keyof typeof m] as () => string + )(), + { + richColors: true, + }, + ); }, }, ); diff --git a/src/components/sidebar/nav-user.tsx b/src/components/sidebar/nav-user.tsx index f8ceafe..b677b1e 100644 --- a/src/components/sidebar/nav-user.tsx +++ b/src/components/sidebar/nav-user.tsx @@ -9,7 +9,6 @@ import { } from '@phosphor-icons/react'; import { useQueryClient } from '@tanstack/react-query'; import { createLink, Link, useNavigate } from '@tanstack/react-router'; -import i18next from 'i18next'; import { toast } from 'sonner'; import { useAuth } from '../auth/auth-provider'; import AvatarUser from '../avatar/AvatarUser'; @@ -49,9 +48,14 @@ const NavUser = () => { }); }, onError: (ctx) => { - toast.error(i18next.t(`backend_${ctx.error.code}` as any), { - richColors: true, - }); + toast.error( + ( + m[`backend_${ctx.error.code}` as keyof typeof m] as () => string + )(), + { + richColors: true, + }, + ); }, }, }); diff --git a/src/data/demo.punk-songs.ts b/src/data/demo.punk-songs.ts deleted file mode 100644 index bc6086d..0000000 --- a/src/data/demo.punk-songs.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { createServerFn } from '@tanstack/react-start' - -export const getPunkSongs = createServerFn({ - method: 'GET', -}).handler(async () => [ - { id: 1, name: 'Teenage Dirtbag', artist: 'Wheatus' }, - { id: 2, name: 'Smells Like Teen Spirit', artist: 'Nirvana' }, - { id: 3, name: 'The Middle', artist: 'Jimmy Eat World' }, - { id: 4, name: 'My Own Worst Enemy', artist: 'Lit' }, - { id: 5, name: 'Fat Lip', artist: 'Sum 41' }, - { id: 6, name: 'All the Small Things', artist: 'blink-182' }, - { id: 7, name: 'Beverly Hills', artist: 'Weezer' }, -]) diff --git a/src/generated/prisma/browser.ts b/src/generated/prisma/browser.ts index 18a1bea..3cf601e 100644 --- a/src/generated/prisma/browser.ts +++ b/src/generated/prisma/browser.ts @@ -57,3 +57,8 @@ export type Invitation = Prisma.InvitationModel * */ export type Setting = Prisma.SettingModel +/** + * Model Audit + * + */ +export type Audit = Prisma.AuditModel diff --git a/src/generated/prisma/client.ts b/src/generated/prisma/client.ts index e50536b..fe60bf9 100644 --- a/src/generated/prisma/client.ts +++ b/src/generated/prisma/client.ts @@ -79,3 +79,8 @@ export type Invitation = Prisma.InvitationModel * */ export type Setting = Prisma.SettingModel +/** + * Model Audit + * + */ +export type Audit = Prisma.AuditModel diff --git a/src/generated/prisma/internal/class.ts b/src/generated/prisma/internal/class.ts index 9fc3068..e9cc59f 100644 --- a/src/generated/prisma/internal/class.ts +++ b/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.2.0", "engineVersion": "0c8ef2ce45c83248ab3df073180d5eda9e8be7a3", "activeProvider": "postgresql", - "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(uuid())\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n\n role String?\n banned Boolean? @default(false)\n banReason String?\n banExpires DateTime?\n\n members Member[]\n invitations Invitation[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id @default(uuid())\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n impersonatedBy String?\n\n activeOrganizationId String?\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id @default(uuid())\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Organization {\n id String @id @default(uuid())\n name String\n slug String\n logo String?\n createdAt DateTime\n metadata String?\n members Member[]\n invitations Invitation[]\n\n color String? @default(\"#000000\")\n\n @@unique([slug])\n @@map(\"organization\")\n}\n\nmodel Member {\n id String @id @default(uuid())\n organizationId String\n organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role String @default(\"member\")\n createdAt DateTime\n\n @@index([organizationId])\n @@index([userId])\n @@map(\"member\")\n}\n\nmodel Invitation {\n id String @id @default(uuid())\n organizationId String\n organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n email String\n role String?\n status String @default(\"pending\")\n expiresAt DateTime\n createdAt DateTime @default(now())\n inviterId String\n user User @relation(fields: [inviterId], references: [id], onDelete: Cascade)\n\n @@index([organizationId])\n @@index([email])\n @@map(\"invitation\")\n}\n\nmodel Setting {\n id String @id @default(uuid())\n key String @unique\n value String\n description String\n relation String @default(\"admin\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@map(\"setting\")\n}\n", + "inlineSchema": "generator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(uuid())\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n audit Audit[]\n\n role String?\n banned Boolean? @default(false)\n banReason String?\n banExpires DateTime?\n\n members Member[]\n invitations Invitation[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\nmodel Session {\n id String @id @default(uuid())\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n impersonatedBy String?\n\n activeOrganizationId String?\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id @default(uuid())\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel Verification {\n id String @id @default(uuid())\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Organization {\n id String @id @default(uuid())\n name String\n slug String\n logo String?\n createdAt DateTime\n metadata String?\n members Member[]\n invitations Invitation[]\n\n color String? @default(\"#000000\")\n\n @@unique([slug])\n @@map(\"organization\")\n}\n\nmodel Member {\n id String @id @default(uuid())\n organizationId String\n organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n role String @default(\"member\")\n createdAt DateTime\n\n @@index([organizationId])\n @@index([userId])\n @@map(\"member\")\n}\n\nmodel Invitation {\n id String @id @default(uuid())\n organizationId String\n organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)\n email String\n role String?\n status String @default(\"pending\")\n expiresAt DateTime\n createdAt DateTime @default(now())\n inviterId String\n user User @relation(fields: [inviterId], references: [id], onDelete: Cascade)\n\n @@index([organizationId])\n @@index([email])\n @@map(\"invitation\")\n}\n\nmodel Setting {\n id String @id @default(uuid())\n key String @unique\n value String\n description String\n relation String @default(\"admin\")\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@map(\"setting\")\n}\n\nmodel Audit {\n id String @id @default(uuid())\n userId String\n action String\n tableName String\n recordId String\n oldValue String?\n newValue String?\n createdAt DateTime @default(now())\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@map(\"audit\")\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"Member\",\"relationName\":\"MemberToUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"Invitation\",\"relationName\":\"InvitationToUser\"}],\"dbName\":\"user\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"activeOrganizationId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Organization\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"logo\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"Member\",\"relationName\":\"MemberToOrganization\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"Invitation\",\"relationName\":\"InvitationToOrganization\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"organization\"},\"Member\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organizationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"MemberToOrganization\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"MemberToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"member\"},\"Invitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organizationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"InvitationToOrganization\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"inviterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"InvitationToUser\"}],\"dbName\":\"invitation\"},\"Setting\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"relation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"setting\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"audit\",\"kind\":\"object\",\"type\":\"Audit\",\"relationName\":\"AuditToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banned\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"banReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"banExpires\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"Member\",\"relationName\":\"MemberToUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"Invitation\",\"relationName\":\"InvitationToUser\"}],\"dbName\":\"user\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"},{\"name\":\"impersonatedBy\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"activeOrganizationId\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Organization\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"logo\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"Member\",\"relationName\":\"MemberToOrganization\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"Invitation\",\"relationName\":\"InvitationToOrganization\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"organization\"},\"Member\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organizationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"MemberToOrganization\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"MemberToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"member\"},\"Invitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organizationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"InvitationToOrganization\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"inviterId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"InvitationToUser\"}],\"dbName\":\"invitation\"},\"Setting\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"relation\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"setting\"},\"Audit\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tableName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"oldValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"newValue\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AuditToUser\"}],\"dbName\":\"audit\"}},\"enums\":{},\"types\":{}}") async function decodeBase64AsWasm(wasmBase64: string): Promise { const { Buffer } = await import('node:buffer') @@ -253,6 +253,16 @@ export interface PrismaClient< * ``` */ get setting(): Prisma.SettingDelegate; + + /** + * `prisma.audit`: Exposes CRUD operations for the **Audit** model. + * Example usage: + * ```ts + * // Fetch zero or more Audits + * const audits = await prisma.audit.findMany() + * ``` + */ + get audit(): Prisma.AuditDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/src/generated/prisma/internal/prismaNamespace.ts b/src/generated/prisma/internal/prismaNamespace.ts index 3225233..75881c6 100644 --- a/src/generated/prisma/internal/prismaNamespace.ts +++ b/src/generated/prisma/internal/prismaNamespace.ts @@ -391,7 +391,8 @@ export const ModelName = { Organization: 'Organization', Member: 'Member', Invitation: 'Invitation', - Setting: 'Setting' + Setting: 'Setting', + Audit: 'Audit' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -407,7 +408,7 @@ export type TypeMap + fields: Prisma.AuditFieldRefs + operations: { + findUnique: { + args: Prisma.AuditFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.AuditFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.AuditFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.AuditFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.AuditFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.AuditCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.AuditCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.AuditCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.AuditDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.AuditUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.AuditDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.AuditUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.AuditUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.AuditUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.AuditAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.AuditGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.AuditCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } } } & { other: { @@ -1157,6 +1232,20 @@ export const SettingScalarFieldEnum = { export type SettingScalarFieldEnum = (typeof SettingScalarFieldEnum)[keyof typeof SettingScalarFieldEnum] +export const AuditScalarFieldEnum = { + id: 'id', + userId: 'userId', + action: 'action', + tableName: 'tableName', + recordId: 'recordId', + oldValue: 'oldValue', + newValue: 'newValue', + createdAt: 'createdAt' +} as const + +export type AuditScalarFieldEnum = (typeof AuditScalarFieldEnum)[keyof typeof AuditScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -1338,6 +1427,7 @@ export type GlobalOmitConfig = { member?: Prisma.MemberOmit invitation?: Prisma.InvitationOmit setting?: Prisma.SettingOmit + audit?: Prisma.AuditOmit } /* Types for Logging */ diff --git a/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/generated/prisma/internal/prismaNamespaceBrowser.ts index c6cc879..c765336 100644 --- a/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -58,7 +58,8 @@ export const ModelName = { Organization: 'Organization', Member: 'Member', Invitation: 'Invitation', - Setting: 'Setting' + Setting: 'Setting', + Audit: 'Audit' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -192,6 +193,20 @@ export const SettingScalarFieldEnum = { export type SettingScalarFieldEnum = (typeof SettingScalarFieldEnum)[keyof typeof SettingScalarFieldEnum] +export const AuditScalarFieldEnum = { + id: 'id', + userId: 'userId', + action: 'action', + tableName: 'tableName', + recordId: 'recordId', + oldValue: 'oldValue', + newValue: 'newValue', + createdAt: 'createdAt' +} as const + +export type AuditScalarFieldEnum = (typeof AuditScalarFieldEnum)[keyof typeof AuditScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' diff --git a/src/generated/prisma/models.ts b/src/generated/prisma/models.ts index 3613539..d7fa0ad 100644 --- a/src/generated/prisma/models.ts +++ b/src/generated/prisma/models.ts @@ -16,4 +16,5 @@ export type * from './models/Organization.ts' export type * from './models/Member.ts' export type * from './models/Invitation.ts' export type * from './models/Setting.ts' +export type * from './models/Audit.ts' export type * from './commonInputTypes.ts' \ No newline at end of file diff --git a/src/generated/prisma/models/Audit.ts b/src/generated/prisma/models/Audit.ts new file mode 100644 index 0000000..9fc0317 --- /dev/null +++ b/src/generated/prisma/models/Audit.ts @@ -0,0 +1,1445 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `Audit` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model Audit + * + */ +export type AuditModel = runtime.Types.Result.DefaultSelection + +export type AggregateAudit = { + _count: AuditCountAggregateOutputType | null + _min: AuditMinAggregateOutputType | null + _max: AuditMaxAggregateOutputType | null +} + +export type AuditMinAggregateOutputType = { + id: string | null + userId: string | null + action: string | null + tableName: string | null + recordId: string | null + oldValue: string | null + newValue: string | null + createdAt: Date | null +} + +export type AuditMaxAggregateOutputType = { + id: string | null + userId: string | null + action: string | null + tableName: string | null + recordId: string | null + oldValue: string | null + newValue: string | null + createdAt: Date | null +} + +export type AuditCountAggregateOutputType = { + id: number + userId: number + action: number + tableName: number + recordId: number + oldValue: number + newValue: number + createdAt: number + _all: number +} + + +export type AuditMinAggregateInputType = { + id?: true + userId?: true + action?: true + tableName?: true + recordId?: true + oldValue?: true + newValue?: true + createdAt?: true +} + +export type AuditMaxAggregateInputType = { + id?: true + userId?: true + action?: true + tableName?: true + recordId?: true + oldValue?: true + newValue?: true + createdAt?: true +} + +export type AuditCountAggregateInputType = { + id?: true + userId?: true + action?: true + tableName?: true + recordId?: true + oldValue?: true + newValue?: true + createdAt?: true + _all?: true +} + +export type AuditAggregateArgs = { + /** + * Filter which Audit to aggregate. + */ + where?: Prisma.AuditWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Audits to fetch. + */ + orderBy?: Prisma.AuditOrderByWithRelationInput | Prisma.AuditOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.AuditWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Audits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Audits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned Audits + **/ + _count?: true | AuditCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: AuditMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: AuditMaxAggregateInputType +} + +export type GetAuditAggregateType = { + [P in keyof T & keyof AggregateAudit]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type AuditGroupByArgs = { + where?: Prisma.AuditWhereInput + orderBy?: Prisma.AuditOrderByWithAggregationInput | Prisma.AuditOrderByWithAggregationInput[] + by: Prisma.AuditScalarFieldEnum[] | Prisma.AuditScalarFieldEnum + having?: Prisma.AuditScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: AuditCountAggregateInputType | true + _min?: AuditMinAggregateInputType + _max?: AuditMaxAggregateInputType +} + +export type AuditGroupByOutputType = { + id: string + userId: string + action: string + tableName: string + recordId: string + oldValue: string | null + newValue: string | null + createdAt: Date + _count: AuditCountAggregateOutputType | null + _min: AuditMinAggregateOutputType | null + _max: AuditMaxAggregateOutputType | null +} + +type GetAuditGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof AuditGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type AuditWhereInput = { + AND?: Prisma.AuditWhereInput | Prisma.AuditWhereInput[] + OR?: Prisma.AuditWhereInput[] + NOT?: Prisma.AuditWhereInput | Prisma.AuditWhereInput[] + id?: Prisma.StringFilter<"Audit"> | string + userId?: Prisma.StringFilter<"Audit"> | string + action?: Prisma.StringFilter<"Audit"> | string + tableName?: Prisma.StringFilter<"Audit"> | string + recordId?: Prisma.StringFilter<"Audit"> | string + oldValue?: Prisma.StringNullableFilter<"Audit"> | string | null + newValue?: Prisma.StringNullableFilter<"Audit"> | string | null + createdAt?: Prisma.DateTimeFilter<"Audit"> | Date | string + user?: Prisma.XOR +} + +export type AuditOrderByWithRelationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + action?: Prisma.SortOrder + tableName?: Prisma.SortOrder + recordId?: Prisma.SortOrder + oldValue?: Prisma.SortOrderInput | Prisma.SortOrder + newValue?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput +} + +export type AuditWhereUniqueInput = Prisma.AtLeast<{ + id?: string + AND?: Prisma.AuditWhereInput | Prisma.AuditWhereInput[] + OR?: Prisma.AuditWhereInput[] + NOT?: Prisma.AuditWhereInput | Prisma.AuditWhereInput[] + userId?: Prisma.StringFilter<"Audit"> | string + action?: Prisma.StringFilter<"Audit"> | string + tableName?: Prisma.StringFilter<"Audit"> | string + recordId?: Prisma.StringFilter<"Audit"> | string + oldValue?: Prisma.StringNullableFilter<"Audit"> | string | null + newValue?: Prisma.StringNullableFilter<"Audit"> | string | null + createdAt?: Prisma.DateTimeFilter<"Audit"> | Date | string + user?: Prisma.XOR +}, "id"> + +export type AuditOrderByWithAggregationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + action?: Prisma.SortOrder + tableName?: Prisma.SortOrder + recordId?: Prisma.SortOrder + oldValue?: Prisma.SortOrderInput | Prisma.SortOrder + newValue?: Prisma.SortOrderInput | Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.AuditCountOrderByAggregateInput + _max?: Prisma.AuditMaxOrderByAggregateInput + _min?: Prisma.AuditMinOrderByAggregateInput +} + +export type AuditScalarWhereWithAggregatesInput = { + AND?: Prisma.AuditScalarWhereWithAggregatesInput | Prisma.AuditScalarWhereWithAggregatesInput[] + OR?: Prisma.AuditScalarWhereWithAggregatesInput[] + NOT?: Prisma.AuditScalarWhereWithAggregatesInput | Prisma.AuditScalarWhereWithAggregatesInput[] + id?: Prisma.StringWithAggregatesFilter<"Audit"> | string + userId?: Prisma.StringWithAggregatesFilter<"Audit"> | string + action?: Prisma.StringWithAggregatesFilter<"Audit"> | string + tableName?: Prisma.StringWithAggregatesFilter<"Audit"> | string + recordId?: Prisma.StringWithAggregatesFilter<"Audit"> | string + oldValue?: Prisma.StringNullableWithAggregatesFilter<"Audit"> | string | null + newValue?: Prisma.StringNullableWithAggregatesFilter<"Audit"> | string | null + createdAt?: Prisma.DateTimeWithAggregatesFilter<"Audit"> | Date | string +} + +export type AuditCreateInput = { + id?: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutAuditInput +} + +export type AuditUncheckedCreateInput = { + id?: string + userId: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string +} + +export type AuditUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutAuditNestedInput +} + +export type AuditUncheckedUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type AuditCreateManyInput = { + id?: string + userId: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string +} + +export type AuditUpdateManyMutationInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type AuditUncheckedUpdateManyInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + userId?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type AuditListRelationFilter = { + every?: Prisma.AuditWhereInput + some?: Prisma.AuditWhereInput + none?: Prisma.AuditWhereInput +} + +export type AuditOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type AuditCountOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + action?: Prisma.SortOrder + tableName?: Prisma.SortOrder + recordId?: Prisma.SortOrder + oldValue?: Prisma.SortOrder + newValue?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type AuditMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + action?: Prisma.SortOrder + tableName?: Prisma.SortOrder + recordId?: Prisma.SortOrder + oldValue?: Prisma.SortOrder + newValue?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type AuditMinOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + action?: Prisma.SortOrder + tableName?: Prisma.SortOrder + recordId?: Prisma.SortOrder + oldValue?: Prisma.SortOrder + newValue?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type AuditCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.AuditCreateWithoutUserInput[] | Prisma.AuditUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.AuditCreateOrConnectWithoutUserInput | Prisma.AuditCreateOrConnectWithoutUserInput[] + createMany?: Prisma.AuditCreateManyUserInputEnvelope + connect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] +} + +export type AuditUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.AuditCreateWithoutUserInput[] | Prisma.AuditUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.AuditCreateOrConnectWithoutUserInput | Prisma.AuditCreateOrConnectWithoutUserInput[] + createMany?: Prisma.AuditCreateManyUserInputEnvelope + connect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] +} + +export type AuditUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.AuditCreateWithoutUserInput[] | Prisma.AuditUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.AuditCreateOrConnectWithoutUserInput | Prisma.AuditCreateOrConnectWithoutUserInput[] + upsert?: Prisma.AuditUpsertWithWhereUniqueWithoutUserInput | Prisma.AuditUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.AuditCreateManyUserInputEnvelope + set?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + disconnect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + delete?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + connect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + update?: Prisma.AuditUpdateWithWhereUniqueWithoutUserInput | Prisma.AuditUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.AuditUpdateManyWithWhereWithoutUserInput | Prisma.AuditUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.AuditScalarWhereInput | Prisma.AuditScalarWhereInput[] +} + +export type AuditUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.AuditCreateWithoutUserInput[] | Prisma.AuditUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.AuditCreateOrConnectWithoutUserInput | Prisma.AuditCreateOrConnectWithoutUserInput[] + upsert?: Prisma.AuditUpsertWithWhereUniqueWithoutUserInput | Prisma.AuditUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.AuditCreateManyUserInputEnvelope + set?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + disconnect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + delete?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + connect?: Prisma.AuditWhereUniqueInput | Prisma.AuditWhereUniqueInput[] + update?: Prisma.AuditUpdateWithWhereUniqueWithoutUserInput | Prisma.AuditUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.AuditUpdateManyWithWhereWithoutUserInput | Prisma.AuditUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.AuditScalarWhereInput | Prisma.AuditScalarWhereInput[] +} + +export type AuditCreateWithoutUserInput = { + id?: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string +} + +export type AuditUncheckedCreateWithoutUserInput = { + id?: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string +} + +export type AuditCreateOrConnectWithoutUserInput = { + where: Prisma.AuditWhereUniqueInput + create: Prisma.XOR +} + +export type AuditCreateManyUserInputEnvelope = { + data: Prisma.AuditCreateManyUserInput | Prisma.AuditCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type AuditUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.AuditWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type AuditUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.AuditWhereUniqueInput + data: Prisma.XOR +} + +export type AuditUpdateManyWithWhereWithoutUserInput = { + where: Prisma.AuditScalarWhereInput + data: Prisma.XOR +} + +export type AuditScalarWhereInput = { + AND?: Prisma.AuditScalarWhereInput | Prisma.AuditScalarWhereInput[] + OR?: Prisma.AuditScalarWhereInput[] + NOT?: Prisma.AuditScalarWhereInput | Prisma.AuditScalarWhereInput[] + id?: Prisma.StringFilter<"Audit"> | string + userId?: Prisma.StringFilter<"Audit"> | string + action?: Prisma.StringFilter<"Audit"> | string + tableName?: Prisma.StringFilter<"Audit"> | string + recordId?: Prisma.StringFilter<"Audit"> | string + oldValue?: Prisma.StringNullableFilter<"Audit"> | string | null + newValue?: Prisma.StringNullableFilter<"Audit"> | string | null + createdAt?: Prisma.DateTimeFilter<"Audit"> | Date | string +} + +export type AuditCreateManyUserInput = { + id?: string + action: string + tableName: string + recordId: string + oldValue?: string | null + newValue?: string | null + createdAt?: Date | string +} + +export type AuditUpdateWithoutUserInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type AuditUncheckedUpdateWithoutUserInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type AuditUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + tableName?: Prisma.StringFieldUpdateOperationsInput | string + recordId?: Prisma.StringFieldUpdateOperationsInput | string + oldValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + newValue?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type AuditSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + action?: boolean + tableName?: boolean + recordId?: boolean + oldValue?: boolean + newValue?: boolean + createdAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["audit"]> + +export type AuditSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + action?: boolean + tableName?: boolean + recordId?: boolean + oldValue?: boolean + newValue?: boolean + createdAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["audit"]> + +export type AuditSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + action?: boolean + tableName?: boolean + recordId?: boolean + oldValue?: boolean + newValue?: boolean + createdAt?: boolean + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["audit"]> + +export type AuditSelectScalar = { + id?: boolean + userId?: boolean + action?: boolean + tableName?: boolean + recordId?: boolean + oldValue?: boolean + newValue?: boolean + createdAt?: boolean +} + +export type AuditOmit = runtime.Types.Extensions.GetOmit<"id" | "userId" | "action" | "tableName" | "recordId" | "oldValue" | "newValue" | "createdAt", ExtArgs["result"]["audit"]> +export type AuditInclude = { + user?: boolean | Prisma.UserDefaultArgs +} +export type AuditIncludeCreateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} +export type AuditIncludeUpdateManyAndReturn = { + user?: boolean | Prisma.UserDefaultArgs +} + +export type $AuditPayload = { + name: "Audit" + objects: { + user: Prisma.$UserPayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: string + userId: string + action: string + tableName: string + recordId: string + oldValue: string | null + newValue: string | null + createdAt: Date + }, ExtArgs["result"]["audit"]> + composites: {} +} + +export type AuditGetPayload = runtime.Types.Result.GetResult + +export type AuditCountArgs = + Omit & { + select?: AuditCountAggregateInputType | true + } + +export interface AuditDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['Audit'], meta: { name: 'Audit' } } + /** + * Find zero or one Audit that matches the filter. + * @param {AuditFindUniqueArgs} args - Arguments to find a Audit + * @example + * // Get one Audit + * const audit = await prisma.audit.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one Audit that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {AuditFindUniqueOrThrowArgs} args - Arguments to find a Audit + * @example + * // Get one Audit + * const audit = await prisma.audit.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Audit that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditFindFirstArgs} args - Arguments to find a Audit + * @example + * // Get one Audit + * const audit = await prisma.audit.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Audit that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditFindFirstOrThrowArgs} args - Arguments to find a Audit + * @example + * // Get one Audit + * const audit = await prisma.audit.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more Audits that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all Audits + * const audits = await prisma.audit.findMany() + * + * // Get first 10 Audits + * const audits = await prisma.audit.findMany({ take: 10 }) + * + * // Only select the `id` + * const auditWithIdOnly = await prisma.audit.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a Audit. + * @param {AuditCreateArgs} args - Arguments to create a Audit. + * @example + * // Create one Audit + * const Audit = await prisma.audit.create({ + * data: { + * // ... data to create a Audit + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many Audits. + * @param {AuditCreateManyArgs} args - Arguments to create many Audits. + * @example + * // Create many Audits + * const audit = await prisma.audit.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create many Audits and returns the data saved in the database. + * @param {AuditCreateManyAndReturnArgs} args - Arguments to create many Audits. + * @example + * // Create many Audits + * const audit = await prisma.audit.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many Audits and only return the `id` + * const auditWithIdOnly = await prisma.audit.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a Audit. + * @param {AuditDeleteArgs} args - Arguments to delete one Audit. + * @example + * // Delete one Audit + * const Audit = await prisma.audit.delete({ + * where: { + * // ... filter to delete one Audit + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one Audit. + * @param {AuditUpdateArgs} args - Arguments to update one Audit. + * @example + * // Update one Audit + * const audit = await prisma.audit.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more Audits. + * @param {AuditDeleteManyArgs} args - Arguments to filter Audits to delete. + * @example + * // Delete a few Audits + * const { count } = await prisma.audit.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Audits. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many Audits + * const audit = await prisma.audit.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Audits and returns the data updated in the database. + * @param {AuditUpdateManyAndReturnArgs} args - Arguments to update many Audits. + * @example + * // Update many Audits + * const audit = await prisma.audit.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more Audits and only return the `id` + * const auditWithIdOnly = await prisma.audit.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one Audit. + * @param {AuditUpsertArgs} args - Arguments to update or create a Audit. + * @example + * // Update or create a Audit + * const audit = await prisma.audit.upsert({ + * create: { + * // ... data to create a Audit + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the Audit we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__AuditClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of Audits. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditCountArgs} args - Arguments to filter Audits to count. + * @example + * // Count the number of Audits + * const count = await prisma.audit.count({ + * where: { + * // ... the filter for the Audits we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a Audit. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by Audit. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends AuditGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: AuditGroupByArgs['orderBy'] } + : { orderBy?: AuditGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetAuditGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the Audit model + */ +readonly fields: AuditFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for Audit. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__AuditClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the Audit model + */ +export interface AuditFieldRefs { + readonly id: Prisma.FieldRef<"Audit", 'String'> + readonly userId: Prisma.FieldRef<"Audit", 'String'> + readonly action: Prisma.FieldRef<"Audit", 'String'> + readonly tableName: Prisma.FieldRef<"Audit", 'String'> + readonly recordId: Prisma.FieldRef<"Audit", 'String'> + readonly oldValue: Prisma.FieldRef<"Audit", 'String'> + readonly newValue: Prisma.FieldRef<"Audit", 'String'> + readonly createdAt: Prisma.FieldRef<"Audit", 'DateTime'> +} + + +// Custom InputTypes +/** + * Audit findUnique + */ +export type AuditFindUniqueArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter, which Audit to fetch. + */ + where: Prisma.AuditWhereUniqueInput +} + +/** + * Audit findUniqueOrThrow + */ +export type AuditFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter, which Audit to fetch. + */ + where: Prisma.AuditWhereUniqueInput +} + +/** + * Audit findFirst + */ +export type AuditFindFirstArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter, which Audit to fetch. + */ + where?: Prisma.AuditWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Audits to fetch. + */ + orderBy?: Prisma.AuditOrderByWithRelationInput | Prisma.AuditOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Audits. + */ + cursor?: Prisma.AuditWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Audits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Audits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Audits. + */ + distinct?: Prisma.AuditScalarFieldEnum | Prisma.AuditScalarFieldEnum[] +} + +/** + * Audit findFirstOrThrow + */ +export type AuditFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter, which Audit to fetch. + */ + where?: Prisma.AuditWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Audits to fetch. + */ + orderBy?: Prisma.AuditOrderByWithRelationInput | Prisma.AuditOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Audits. + */ + cursor?: Prisma.AuditWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Audits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Audits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Audits. + */ + distinct?: Prisma.AuditScalarFieldEnum | Prisma.AuditScalarFieldEnum[] +} + +/** + * Audit findMany + */ +export type AuditFindManyArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter, which Audits to fetch. + */ + where?: Prisma.AuditWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Audits to fetch. + */ + orderBy?: Prisma.AuditOrderByWithRelationInput | Prisma.AuditOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing Audits. + */ + cursor?: Prisma.AuditWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Audits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Audits. + */ + skip?: number + distinct?: Prisma.AuditScalarFieldEnum | Prisma.AuditScalarFieldEnum[] +} + +/** + * Audit create + */ +export type AuditCreateArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * The data needed to create a Audit. + */ + data: Prisma.XOR +} + +/** + * Audit createMany + */ +export type AuditCreateManyArgs = { + /** + * The data used to create many Audits. + */ + data: Prisma.AuditCreateManyInput | Prisma.AuditCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * Audit createManyAndReturn + */ +export type AuditCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelectCreateManyAndReturn | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * The data used to create many Audits. + */ + data: Prisma.AuditCreateManyInput | Prisma.AuditCreateManyInput[] + skipDuplicates?: boolean + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditIncludeCreateManyAndReturn | null +} + +/** + * Audit update + */ +export type AuditUpdateArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * The data needed to update a Audit. + */ + data: Prisma.XOR + /** + * Choose, which Audit to update. + */ + where: Prisma.AuditWhereUniqueInput +} + +/** + * Audit updateMany + */ +export type AuditUpdateManyArgs = { + /** + * The data used to update Audits. + */ + data: Prisma.XOR + /** + * Filter which Audits to update + */ + where?: Prisma.AuditWhereInput + /** + * Limit how many Audits to update. + */ + limit?: number +} + +/** + * Audit updateManyAndReturn + */ +export type AuditUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * The data used to update Audits. + */ + data: Prisma.XOR + /** + * Filter which Audits to update + */ + where?: Prisma.AuditWhereInput + /** + * Limit how many Audits to update. + */ + limit?: number + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditIncludeUpdateManyAndReturn | null +} + +/** + * Audit upsert + */ +export type AuditUpsertArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * The filter to search for the Audit to update in case it exists. + */ + where: Prisma.AuditWhereUniqueInput + /** + * In case the Audit found by the `where` argument doesn't exist, create a new Audit with this data. + */ + create: Prisma.XOR + /** + * In case the Audit was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * Audit delete + */ +export type AuditDeleteArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + /** + * Filter which Audit to delete. + */ + where: Prisma.AuditWhereUniqueInput +} + +/** + * Audit deleteMany + */ +export type AuditDeleteManyArgs = { + /** + * Filter which Audits to delete + */ + where?: Prisma.AuditWhereInput + /** + * Limit how many Audits to delete. + */ + limit?: number +} + +/** + * Audit without action + */ +export type AuditDefaultArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null +} diff --git a/src/generated/prisma/models/User.ts b/src/generated/prisma/models/User.ts index 7044a8e..2dda63a 100644 --- a/src/generated/prisma/models/User.ts +++ b/src/generated/prisma/models/User.ts @@ -232,6 +232,7 @@ export type UserWhereInput = { banExpires?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null sessions?: Prisma.SessionListRelationFilter accounts?: Prisma.AccountListRelationFilter + audit?: Prisma.AuditListRelationFilter members?: Prisma.MemberListRelationFilter invitations?: Prisma.InvitationListRelationFilter } @@ -250,6 +251,7 @@ export type UserOrderByWithRelationInput = { banExpires?: Prisma.SortOrderInput | Prisma.SortOrder sessions?: Prisma.SessionOrderByRelationAggregateInput accounts?: Prisma.AccountOrderByRelationAggregateInput + audit?: Prisma.AuditOrderByRelationAggregateInput members?: Prisma.MemberOrderByRelationAggregateInput invitations?: Prisma.InvitationOrderByRelationAggregateInput } @@ -271,6 +273,7 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ banExpires?: Prisma.DateTimeNullableFilter<"User"> | Date | string | null sessions?: Prisma.SessionListRelationFilter accounts?: Prisma.AccountListRelationFilter + audit?: Prisma.AuditListRelationFilter members?: Prisma.MemberListRelationFilter invitations?: Prisma.InvitationListRelationFilter }, "id" | "email"> @@ -323,6 +326,7 @@ export type UserCreateInput = { banExpires?: Date | string | null sessions?: Prisma.SessionCreateNestedManyWithoutUserInput accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + audit?: Prisma.AuditCreateNestedManyWithoutUserInput members?: Prisma.MemberCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationCreateNestedManyWithoutUserInput } @@ -341,6 +345,7 @@ export type UserUncheckedCreateInput = { banExpires?: Date | string | null sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + audit?: Prisma.AuditUncheckedCreateNestedManyWithoutUserInput members?: Prisma.MemberUncheckedCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationUncheckedCreateNestedManyWithoutUserInput } @@ -359,6 +364,7 @@ export type UserUpdateInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUpdateManyWithoutUserNestedInput members?: Prisma.MemberUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUpdateManyWithoutUserNestedInput } @@ -377,6 +383,7 @@ export type UserUncheckedUpdateInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUncheckedUpdateManyWithoutUserNestedInput members?: Prisma.MemberUncheckedUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUncheckedUpdateManyWithoutUserNestedInput } @@ -550,6 +557,20 @@ export type UserUpdateOneRequiredWithoutInvitationsNestedInput = { update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutInvitationsInput> } +export type UserCreateNestedOneWithoutAuditInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutAuditInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutAuditNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutAuditInput + upsert?: Prisma.UserUpsertWithoutAuditInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutAuditInput> +} + export type UserCreateWithoutSessionsInput = { id?: string name: string @@ -563,6 +584,7 @@ export type UserCreateWithoutSessionsInput = { banReason?: string | null banExpires?: Date | string | null accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + audit?: Prisma.AuditCreateNestedManyWithoutUserInput members?: Prisma.MemberCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationCreateNestedManyWithoutUserInput } @@ -580,6 +602,7 @@ export type UserUncheckedCreateWithoutSessionsInput = { banReason?: string | null banExpires?: Date | string | null accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + audit?: Prisma.AuditUncheckedCreateNestedManyWithoutUserInput members?: Prisma.MemberUncheckedCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationUncheckedCreateNestedManyWithoutUserInput } @@ -613,6 +636,7 @@ export type UserUpdateWithoutSessionsInput = { banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUpdateManyWithoutUserNestedInput members?: Prisma.MemberUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUpdateManyWithoutUserNestedInput } @@ -630,6 +654,7 @@ export type UserUncheckedUpdateWithoutSessionsInput = { banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUncheckedUpdateManyWithoutUserNestedInput members?: Prisma.MemberUncheckedUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUncheckedUpdateManyWithoutUserNestedInput } @@ -647,6 +672,7 @@ export type UserCreateWithoutAccountsInput = { banReason?: string | null banExpires?: Date | string | null sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + audit?: Prisma.AuditCreateNestedManyWithoutUserInput members?: Prisma.MemberCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationCreateNestedManyWithoutUserInput } @@ -664,6 +690,7 @@ export type UserUncheckedCreateWithoutAccountsInput = { banReason?: string | null banExpires?: Date | string | null sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + audit?: Prisma.AuditUncheckedCreateNestedManyWithoutUserInput members?: Prisma.MemberUncheckedCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationUncheckedCreateNestedManyWithoutUserInput } @@ -697,6 +724,7 @@ export type UserUpdateWithoutAccountsInput = { banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUpdateManyWithoutUserNestedInput members?: Prisma.MemberUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUpdateManyWithoutUserNestedInput } @@ -714,6 +742,7 @@ export type UserUncheckedUpdateWithoutAccountsInput = { banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUncheckedUpdateManyWithoutUserNestedInput members?: Prisma.MemberUncheckedUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUncheckedUpdateManyWithoutUserNestedInput } @@ -732,6 +761,7 @@ export type UserCreateWithoutMembersInput = { banExpires?: Date | string | null sessions?: Prisma.SessionCreateNestedManyWithoutUserInput accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + audit?: Prisma.AuditCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationCreateNestedManyWithoutUserInput } @@ -749,6 +779,7 @@ export type UserUncheckedCreateWithoutMembersInput = { banExpires?: Date | string | null sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + audit?: Prisma.AuditUncheckedCreateNestedManyWithoutUserInput invitations?: Prisma.InvitationUncheckedCreateNestedManyWithoutUserInput } @@ -782,6 +813,7 @@ export type UserUpdateWithoutMembersInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUpdateManyWithoutUserNestedInput } @@ -799,6 +831,7 @@ export type UserUncheckedUpdateWithoutMembersInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUncheckedUpdateManyWithoutUserNestedInput invitations?: Prisma.InvitationUncheckedUpdateManyWithoutUserNestedInput } @@ -816,6 +849,7 @@ export type UserCreateWithoutInvitationsInput = { banExpires?: Date | string | null sessions?: Prisma.SessionCreateNestedManyWithoutUserInput accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + audit?: Prisma.AuditCreateNestedManyWithoutUserInput members?: Prisma.MemberCreateNestedManyWithoutUserInput } @@ -833,6 +867,7 @@ export type UserUncheckedCreateWithoutInvitationsInput = { banExpires?: Date | string | null sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + audit?: Prisma.AuditUncheckedCreateNestedManyWithoutUserInput members?: Prisma.MemberUncheckedCreateNestedManyWithoutUserInput } @@ -866,6 +901,7 @@ export type UserUpdateWithoutInvitationsInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUpdateManyWithoutUserNestedInput members?: Prisma.MemberUpdateManyWithoutUserNestedInput } @@ -883,9 +919,98 @@ export type UserUncheckedUpdateWithoutInvitationsInput = { banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + audit?: Prisma.AuditUncheckedUpdateManyWithoutUserNestedInput members?: Prisma.MemberUncheckedUpdateManyWithoutUserNestedInput } +export type UserCreateWithoutAuditInput = { + id?: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + role?: string | null + banned?: boolean | null + banReason?: string | null + banExpires?: Date | string | null + sessions?: Prisma.SessionCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountCreateNestedManyWithoutUserInput + members?: Prisma.MemberCreateNestedManyWithoutUserInput + invitations?: Prisma.InvitationCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutAuditInput = { + id?: string + name: string + email: string + emailVerified?: boolean + image?: string | null + createdAt?: Date | string + updatedAt?: Date | string + role?: string | null + banned?: boolean | null + banReason?: string | null + banExpires?: Date | string | null + sessions?: Prisma.SessionUncheckedCreateNestedManyWithoutUserInput + accounts?: Prisma.AccountUncheckedCreateNestedManyWithoutUserInput + members?: Prisma.MemberUncheckedCreateNestedManyWithoutUserInput + invitations?: Prisma.InvitationUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutAuditInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutAuditInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutAuditInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutAuditInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.NullableBoolFieldUpdateOperationsInput | boolean | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sessions?: Prisma.SessionUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUpdateManyWithoutUserNestedInput + members?: Prisma.MemberUpdateManyWithoutUserNestedInput + invitations?: Prisma.InvitationUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutAuditInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + emailVerified?: Prisma.BoolFieldUpdateOperationsInput | boolean + image?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + role?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banned?: Prisma.NullableBoolFieldUpdateOperationsInput | boolean | null + banReason?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + banExpires?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sessions?: Prisma.SessionUncheckedUpdateManyWithoutUserNestedInput + accounts?: Prisma.AccountUncheckedUpdateManyWithoutUserNestedInput + members?: Prisma.MemberUncheckedUpdateManyWithoutUserNestedInput + invitations?: Prisma.InvitationUncheckedUpdateManyWithoutUserNestedInput +} + /** * Count Type UserCountOutputType @@ -894,6 +1019,7 @@ export type UserUncheckedUpdateWithoutInvitationsInput = { export type UserCountOutputType = { sessions: number accounts: number + audit: number members: number invitations: number } @@ -901,6 +1027,7 @@ export type UserCountOutputType = { export type UserCountOutputTypeSelect = { sessions?: boolean | UserCountOutputTypeCountSessionsArgs accounts?: boolean | UserCountOutputTypeCountAccountsArgs + audit?: boolean | UserCountOutputTypeCountAuditArgs members?: boolean | UserCountOutputTypeCountMembersArgs invitations?: boolean | UserCountOutputTypeCountInvitationsArgs } @@ -929,6 +1056,13 @@ export type UserCountOutputTypeCountAccountsArgs = { + where?: Prisma.AuditWhereInput +} + /** * UserCountOutputType without action */ @@ -958,6 +1092,7 @@ export type UserSelect accounts?: boolean | Prisma.User$accountsArgs + audit?: boolean | Prisma.User$auditArgs members?: boolean | Prisma.User$membersArgs invitations?: boolean | Prisma.User$invitationsArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs @@ -1009,6 +1144,7 @@ export type UserOmit = { sessions?: boolean | Prisma.User$sessionsArgs accounts?: boolean | Prisma.User$accountsArgs + audit?: boolean | Prisma.User$auditArgs members?: boolean | Prisma.User$membersArgs invitations?: boolean | Prisma.User$invitationsArgs _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs @@ -1021,6 +1157,7 @@ export type $UserPayload[] accounts: Prisma.$AccountPayload[] + audit: Prisma.$AuditPayload[] members: Prisma.$MemberPayload[] invitations: Prisma.$InvitationPayload[] } @@ -1432,6 +1569,7 @@ export interface Prisma__UserClient = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> accounts = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + audit = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> members = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> invitations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** @@ -1909,6 +2047,30 @@ export type User$accountsArgs = { + /** + * Select specific fields to fetch from the Audit + */ + select?: Prisma.AuditSelect | null + /** + * Omit specific fields from the Audit + */ + omit?: Prisma.AuditOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.AuditInclude | null + where?: Prisma.AuditWhereInput + orderBy?: Prisma.AuditOrderByWithRelationInput | Prisma.AuditOrderByWithRelationInput[] + cursor?: Prisma.AuditWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.AuditScalarFieldEnum | Prisma.AuditScalarFieldEnum[] +} + /** * User.members */ diff --git a/src/lib/auth.ts b/src/lib/auth.ts index c557f2b..0bf48a7 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -8,6 +8,7 @@ import { owner, } from '@/lib/auth/organization-permissions'; import { ac, admin, user } from '@/lib/auth/permissions'; +import { createAuditLog } from '@/service/audit.api'; import { betterAuth } from 'better-auth'; import { prismaAdapter } from 'better-auth/adapters/prisma'; import { admin as adminPlugin, organization } from 'better-auth/plugins'; @@ -67,6 +68,73 @@ export const auth = betterAuth({ }); }, }, + update: { + before: async (user, ctx) => { + if (ctx?.context.session && ctx?.path === '/update-user') { + const newUser = JSON.parse(JSON.stringify(user)); + const keys = Object.keys(newUser); + const oldUser = Object.fromEntries( + Object.entries(ctx?.context.session?.user).filter(([key]) => + keys.includes(key), + ), + ); + await createAuditLog({ + action: 'update', + tableName: 'user', + recordId: ctx?.context.session?.user.id, + oldValue: JSON.stringify(oldUser), + newValue: JSON.stringify(newUser), + userId: ctx?.context.session?.user.id, + }); + } + }, + }, + }, + account: { + update: { + after: async (account, context) => { + if (context?.path === '/change-password') { + await createAuditLog({ + action: 'change_password', + tableName: 'account', + recordId: account.id, + oldValue: 'Change Password', + newValue: 'Change Password', + userId: account.userId, + }); + } + }, + }, + }, + session: { + create: { + after: async (session, context) => { + if (context?.path.includes('/sign-in')) { + await createAuditLog({ + action: 'sign_in', + tableName: 'session', + recordId: session.id, + oldValue: '', + newValue: JSON.stringify(session), + userId: session.userId, + }); + } + }, + }, + delete: { + after: async (session, context) => { + if (context?.path === '/sign-out') { + await createAuditLog({ + action: 'sign_out', + tableName: 'session', + recordId: session.id, + oldValue: JSON.stringify(session), + newValue: '', + userId: session.userId, + }); + } + }, + }, }, }, }); diff --git a/src/lib/auth/session.ts b/src/lib/auth/session.ts index 991357b..2f2fd4f 100644 --- a/src/lib/auth/session.ts +++ b/src/lib/auth/session.ts @@ -1,7 +1,6 @@ import { createServerFn } from '@tanstack/react-start'; import { getRequestHeaders } from '@tanstack/react-start/server'; import { auth } from '../auth'; -import { authClient } from '../auth-client'; export type Session = typeof auth.$Infer.Session; @@ -12,8 +11,3 @@ export const getSession = createServerFn({ method: 'GET' }).handler( return session; }, ); - -export const sessionPush = () => { - const session = authClient.getSession(); - return session; -}; diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index 6264f1b..e062a08 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -14,7 +14,7 @@ import { Route as appIndexRouteImport } from './routes/(app)/index' import { Route as authSignUpRouteImport } from './routes/(auth)/sign-up' import { Route as authSignInRouteImport } from './routes/(auth)/sign-in' import { Route as appauthRouteRouteImport } from './routes/(app)/(auth)/route' -import { Route as ApiAuthSplatRouteImport } from './routes/api/auth.$' +import { Route as ApiAuthSplatRouteImport } from './routes/api.auth.$' import { Route as appauthSettingsRouteImport } from './routes/(app)/(auth)/settings' import { Route as appauthDashboardRouteImport } from './routes/(app)/(auth)/dashboard' import { Route as appauthAccountRouteRouteImport } from './routes/(app)/(auth)/account/route' diff --git a/src/routes/(app)/(auth)/route.tsx b/src/routes/(app)/(auth)/route.tsx index 832c820..4d47497 100644 --- a/src/routes/(app)/(auth)/route.tsx +++ b/src/routes/(app)/(auth)/route.tsx @@ -1,11 +1,11 @@ -import { createFileRoute, Outlet, redirect } from '@tanstack/react-router'; +import { createFileRoute, Outlet } from '@tanstack/react-router'; export const Route = createFileRoute('/(app)/(auth)')({ - beforeLoad: async ({ context }) => { - if (!context.userSession) { - throw redirect({ to: '/sign-in' }); - } - }, + // beforeLoad: async ({ context }) => { + // if (!context.userSession) { + // throw redirect({ to: '/sign-in' }); + // } + // }, component: RouteComponent, }); diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 12bb13a..0daae9e 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -1,7 +1,6 @@ import NotFound from '@/components/NotFound'; import { Toaster } from '@/components/ui/sonner'; import { getLocale } from '@/paraglide/runtime'; -import { sessionQueries } from '@/service/queries'; import { CheckIcon, InfoIcon, @@ -20,43 +19,41 @@ import React from 'react'; import TanStackQueryDevtools from '../integrations/tanstack-query/devtools'; import appCss from '../styles.css?url'; -interface MyRouterContext { - queryClient: QueryClient; -} - -export const Route = createRootRouteWithContext()({ - beforeLoad: async ({ context }) => { - const userSession = await context.queryClient.fetchQuery( - sessionQueries.user(), - ); - return { userSession }; +export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()( + { + // beforeLoad: async ({ context }) => { + // const userSession = await context.queryClient.fetchQuery( + // sessionQueries.user(), + // ); + // return { userSession }; + // }, + head: () => ({ + meta: [ + { + charSet: 'utf-8', + }, + { + name: 'viewport', + content: 'width=device-width, initial-scale=1', + }, + { + title: 'Fuware', + }, + { + description: 'Fuware is a platform for managing your business.', + }, + ], + links: [ + { + rel: 'stylesheet', + href: appCss, + }, + ], + }), + shellComponent: RootDocument, + notFoundComponent: () => , }, - head: () => ({ - meta: [ - { - charSet: 'utf-8', - }, - { - name: 'viewport', - content: 'width=device-width, initial-scale=1', - }, - { - title: 'Fuware', - }, - { - description: 'Fuware is a platform for managing your business.', - }, - ], - links: [ - { - rel: 'stylesheet', - href: appCss, - }, - ], - }), - shellComponent: RootDocument, - notFoundComponent: () => , -}); +); function RootDocument({ children }: { children: React.ReactNode }) { return ( @@ -79,20 +76,20 @@ function RootDocument({ children }: { children: React.ReactNode }) { warning: , }} /> - - , - }, - TanStackQueryDevtools, - ]} - /> - + {/* */} + , + }, + TanStackQueryDevtools, + ]} + /> + {/* */} diff --git a/src/routes/api/auth.$.ts b/src/routes/api.auth.$.ts similarity index 100% rename from src/routes/api/auth.$.ts rename to src/routes/api.auth.$.ts diff --git a/src/service/audit.api.ts b/src/service/audit.api.ts new file mode 100644 index 0000000..95f1f7b --- /dev/null +++ b/src/service/audit.api.ts @@ -0,0 +1,15 @@ +import { prisma } from '@/db'; +import { Audit } from '@/generated/prisma/client'; + +export async function createAuditLog(data: Omit) { + try { + await prisma.audit.create({ + data: { + ...data, + }, + }); + } catch (error) { + console.log(error); + throw error; + } +} diff --git a/src/service/profile.api.ts b/src/service/profile.api.ts index d496c80..e69de29 100644 --- a/src/service/profile.api.ts +++ b/src/service/profile.api.ts @@ -1,17 +0,0 @@ -import { authMiddleware } from '@/lib/middleware'; -import { saveFile } from '@/utils/disk-storage'; -import { createServerFn } from '@tanstack/react-start'; -import z from 'zod'; - -export const uploadProfileImage = createServerFn({ method: 'POST' }) - .middleware([authMiddleware]) - .inputValidator(z.instanceof(FormData)) - .handler(async ({ data: formData }) => { - const uuid = crypto.randomUUID(); - const file = formData.get('file') as File; - if (!(file instanceof File)) throw new Error('File not found'); - const imageKey = `${uuid}.${file.type.split('/')[1]}`; - const buffer = Buffer.from(await file.arrayBuffer()); - await saveFile(imageKey, buffer); - return { imageKey }; - }); diff --git a/src/service/queries.ts b/src/service/queries.ts index 54bb7d5..6cb1b49 100644 --- a/src/service/queries.ts +++ b/src/service/queries.ts @@ -1,5 +1,4 @@ import { getSession } from '@/lib/auth/session'; -// import { sessionPush } from '@/lib/auth/session'; import { queryOptions } from '@tanstack/react-query'; import { getAdminSettings, getUserSettings } from './setting.api'; @@ -9,7 +8,6 @@ export const sessionQueries = { queryOptions({ queryKey: [...sessionQueries.all, 'session'], queryFn: () => getSession(), - // queryFn: () => sessionPush(), staleTime: 1000 * 60 * 20, retry: false, }), diff --git a/src/service/setting.api.ts b/src/service/setting.api.ts index 679654f..153c6ab 100644 --- a/src/service/setting.api.ts +++ b/src/service/setting.api.ts @@ -3,7 +3,6 @@ import { Setting } from '@/generated/prisma/client'; import { authMiddleware } from '@/lib/middleware'; import { createServerFn } from '@tanstack/react-start'; import { settingSchema, userSettingSchema } from './setting.schema'; -// import { settingSchema } from './setting.schema'; type AdminSettingReturn = { [key: string]: Setting; @@ -13,6 +12,7 @@ type AdminSettingReturn = { export const getAdminSettings = createServerFn({ method: 'GET' }) .middleware([authMiddleware]) .handler(async () => { + console.log('first'); const settings = await prisma.setting.findMany({ where: { relation: 'admin', @@ -48,6 +48,17 @@ export const updateAdminSettings = createServerFn({ method: 'POST' }) await prisma.$transaction(updates); + // console.log(updates); + + // await createAuditLog({ + // action: 'update', + // tableName: 'setting', + // recordId: '', + // oldValue: '', + // newValue: JSON.stringify(data), + // userId: '', + // }); + return { success: true }; }); @@ -93,6 +104,15 @@ export const updateUserSettings = createServerFn({ method: 'POST' }) }, }); + // await createAuditLog({ + // action: 'update', + // tableName: 'setting', + // recordId: '', + // oldValue: '', + // newValue: '', + // userId: '', + // }); + return { success: true }; } catch (error) { throw error; diff --git a/src/utils/disk-storage.ts b/src/utils/disk-storage.ts deleted file mode 100644 index 6ae31fc..0000000 --- a/src/utils/disk-storage.ts +++ /dev/null @@ -1,26 +0,0 @@ -import fs, { writeFile } from 'fs/promises'; -import path from 'path'; - -const uploadDir = './data/avatar'; - -export async function saveFile(key: string, file: Buffer | File) { - if (!uploadDir) { - throw new Error('Upload directory not found'); - } - - const fileBuffer = - file instanceof File ? Buffer.from(await file.arrayBuffer()) : file; - - const filePath = path.join(uploadDir, key); - - try { - await fs.mkdir(uploadDir, { recursive: true }); - await writeFile(filePath, fileBuffer); - return key; - } catch (error) { - console.error(`Error saving file: ${key}`, error); - throw new Error( - `Failed to save file: ${error instanceof Error ? error.message : 'Unknown error'}`, - ); - } -} diff --git a/src/utils/help.ts b/src/utils/help.ts new file mode 100644 index 0000000..a9c5db9 --- /dev/null +++ b/src/utils/help.ts @@ -0,0 +1,9 @@ +export function jsonSupport(jsonSTR: string) { + try { + const data = JSON.parse(jsonSTR); + + return JSON.stringify(data, undefined, 2); + } catch { + return jsonSTR; + } +} From ac8f22204d15cc5858232bbd1ca148b12799d5b5 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 9 Jan 2026 22:52:00 +0700 Subject: [PATCH 2/2] added log for site settings and user settings --- pnpm-lock.yaml | 1124 +++++++++++++------------- src/components/form/profile-form.tsx | 13 + src/service/profile.api.ts | 17 + src/service/setting.api.ts | 139 ++-- src/utils/disk-storage.ts | 26 + src/utils/help.ts | 18 + 6 files changed, 735 insertions(+), 602 deletions(-) create mode 100644 src/utils/disk-storage.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc0ce56..3c58f8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,37 +25,37 @@ importers: version: 7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3) '@tailwindcss/vite': specifier: ^4.0.6 - version: 4.1.18(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 4.1.18(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) '@tanstack/react-devtools': specifier: ^0.7.0 version: 0.7.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10) '@tanstack/react-form': specifier: ^1.27.7 - version: 1.27.7(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.27.7(@tanstack/react-start@1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-query': specifier: ^5.66.5 - version: 5.90.12(react@19.2.3) + version: 5.90.16(react@19.2.3) '@tanstack/react-query-devtools': specifier: ^5.84.2 - version: 5.91.1(@tanstack/react-query@5.90.12(react@19.2.3))(react@19.2.3) + version: 5.91.2(@tanstack/react-query@5.90.16(react@19.2.3))(react@19.2.3) '@tanstack/react-router': specifier: ^1.132.0 - version: 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-router-devtools': specifier: ^1.132.0 - version: 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.143.4)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10) + version: 1.146.2(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.146.2)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10) '@tanstack/react-router-ssr-query': specifier: ^1.131.7 - version: 1.143.4(@tanstack/query-core@5.90.12)(@tanstack/react-query@5.90.12(react@19.2.3))(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.143.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.146.2(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.3))(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.146.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start': specifier: ^1.132.0 - version: 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) '@tanstack/router-plugin': specifier: ^1.132.0 - version: 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 1.146.3(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) better-auth: specifier: ^1.4.10 - version: 1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)) + version: 1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -79,7 +79,7 @@ importers: version: 19.2.3(react@19.2.3) shadcn: specifier: ^3.6.1 - version: 3.6.2(@types/node@22.19.3)(hono@4.10.6)(typescript@5.9.3) + version: 3.6.3(@types/node@22.19.3)(hono@4.10.6)(typescript@5.9.3) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -94,20 +94,20 @@ importers: version: 1.4.0 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) zod: specifier: ^4.1.11 - version: 4.2.1 + version: 4.3.5 devDependencies: '@inlang/paraglide-js': specifier: 2.7.1 version: 2.7.1 '@tanstack/devtools-vite': specifier: ^0.3.11 - version: 0.3.12(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 0.3.12(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) '@tanstack/eslint-config': specifier: ^0.3.0 - version: 0.3.4(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 0.3.4(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.1 @@ -125,13 +125,13 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': specifier: ^5.0.4 - version: 5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + version: 5.1.2(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) dotenv-cli: specifier: ^10.0.0 version: 10.0.0 jsdom: specifier: ^27.0.0 - version: 27.3.0 + version: 27.4.0 prettier: specifier: ^3.5.3 version: 3.7.4 @@ -143,10 +143,10 @@ importers: version: 5.9.3 vite: specifier: ^7.1.7 - version: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + version: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) vitest: specifier: ^3.0.5 - version: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0) + version: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0) web-vitals: specifier: ^5.1.0 version: 5.1.0 @@ -169,10 +169,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -396,16 +392,16 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.22': - resolution: {integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==} + '@csstools/css-syntax-patches-for-csstree@1.0.23': + resolution: {integrity: sha512-YEmgyklR6l/oKUltidNVYdjSmLSW88vMsKx0pmiS3r71s8ZZRpd8A0Yf0U+6p/RzElmMnPBv27hNWjDQMSZRtQ==} engines: {node: '>=18'} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@dotenvx/dotenvx@1.51.2': - resolution: {integrity: sha512-+693mNflujDZxudSEqSNGpn92QgFhJlBn9q2mDQ9yGWyHuz3hZ8B5g3EXCwdAz4DMJAI+OFCIbfEFZS+YRdrEA==} + '@dotenvx/dotenvx@1.51.4': + resolution: {integrity: sha512-AoziS8lRQ3ew/lY5J4JSlzYSN9Fo0oiyMBY37L3Bwq4mOQJT5GSrdZYLFPt6pH1LApDI3ZJceNyx+rHRACZSeQ==} hasBin: true '@ecies/ciphers@0.2.5': @@ -428,11 +424,11 @@ packages: '@electric-sql/pglite@0.3.2': resolution: {integrity: sha512-zfWWa+V2ViDCY/cmUfRqeWY1yLto+EpxjXnZzenB1TyxsTiXaTWeZFIZw6mac52BsuQm0RjCnisjBtdBaXOI6w==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -593,8 +589,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -631,6 +627,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.8.0': + resolution: {integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@exodus/crypto': ^1.0.0-rc.4 + peerDependenciesMeta: + '@exodus/crypto': + optional: true + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -655,8 +660,8 @@ packages: peerDependencies: hono: ^4 - '@hono/node-server@1.19.7': - resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} + '@hono/node-server@1.19.8': + resolution: {integrity: sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -754,8 +759,8 @@ packages: '@lix-js/server-protocol-schema@0.1.1': resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} - '@modelcontextprotocol/sdk@1.25.1': - resolution: {integrity: sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ==} + '@modelcontextprotocol/sdk@1.25.2': + resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -1593,113 +1598,128 @@ packages: '@rolldown/pluginutils@1.0.0-beta.53': resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rollup/rollup-android-arm-eabi@4.54.0': - resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.54.0': - resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.54.0': - resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.54.0': - resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.54.0': - resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.54.0': - resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': - resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.54.0': - resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.54.0': - resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.54.0': - resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.54.0': - resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.54.0': - resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.54.0': - resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.54.0': - resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.54.0': - resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.54.0': - resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.54.0': - resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.54.0': - resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.54.0': - resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.54.0': - resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.54.0': - resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.54.0': - resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} cpu: [x64] os: [win32] @@ -1750,8 +1770,8 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@stylistic/eslint-plugin@5.6.1': - resolution: {integrity: sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==} + '@stylistic/eslint-plugin@5.7.0': + resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -1884,12 +1904,6 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/directive-functions-plugin@1.142.1': - resolution: {integrity: sha512-k4HhAaitobp+z2pXBkmoWgE8Ollhx7fQXpVL+PQ7HeHZc2PilrQtC3ysxvoPunufrztIxweSE9HAWkZ2AFNaLw==} - engines: {node: '>=12'} - peerDependencies: - vite: '>=6.0.0 || >=7.0.0' - '@tanstack/eslint-config@0.3.4': resolution: {integrity: sha512-5Ou1XWJRCTx5G8WoCbT7+6nQ4iNdsISzBAc4lXpFy2fEOO7xioOSPvcPIv+r9V0drPPETou2tr6oLGZZ909FKg==} engines: {node: '>=18'} @@ -1899,19 +1913,19 @@ packages: '@tanstack/form-core@1.27.7': resolution: {integrity: sha512-nvogpyE98fhb0NDw1Bf2YaCH+L7ZIUgEpqO9TkHucDn6zg3ni521boUpv0i8HKIrmmFwDYjWZoCnrgY4HYWTkw==} - '@tanstack/history@1.141.0': - resolution: {integrity: sha512-LS54XNyxyTs5m/pl1lkwlg7uZM3lvsv2FIIV1rsJgnfwVCnI+n4ZGZ2CcjNT13BPu/3hPP+iHmliBSscJxW5FQ==} + '@tanstack/history@1.145.7': + resolution: {integrity: sha512-gMo/ReTUp0a3IOcZoI3hH6PLDC2R/5ELQ7P2yu9F6aEkA0wSQh+Q4qzMrtcKvF2ut0oE+16xWCGDo/TdYd6cEQ==} engines: {node: '>=12'} '@tanstack/pacer-lite@0.1.1': resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} - '@tanstack/query-core@5.90.12': - resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} + '@tanstack/query-core@5.90.16': + resolution: {integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==} - '@tanstack/query-devtools@5.91.1': - resolution: {integrity: sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg==} + '@tanstack/query-devtools@5.92.0': + resolution: {integrity: sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==} '@tanstack/react-devtools@0.7.11': resolution: {integrity: sha512-a2Lmz8x+JoDrsU6f7uKRcyyY+k8mA/n5mb9h7XJ3Fz/y3+sPV9t7vAW1s5lyNkQyyDt6V1Oim99faLthoJSxMw==} @@ -1931,31 +1945,31 @@ packages: '@tanstack/react-start': optional: true - '@tanstack/react-query-devtools@5.91.1': - resolution: {integrity: sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ==} + '@tanstack/react-query-devtools@5.91.2': + resolution: {integrity: sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==} peerDependencies: - '@tanstack/react-query': ^5.90.10 + '@tanstack/react-query': ^5.90.14 react: ^18 || ^19 - '@tanstack/react-query@5.90.12': - resolution: {integrity: sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==} + '@tanstack/react-query@5.90.16': + resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-devtools@1.143.4': - resolution: {integrity: sha512-+AKGHkC2aDL93XCWDMB9/cf8+N4awGylCK0mk0kJ5BUBVSoZpNVLtZiBFCxRuvZCQtY5PbdYT4xeUA0dbgH9Eg==} + '@tanstack/react-router-devtools@1.146.2': + resolution: {integrity: sha512-svUw0KM9e4SjpFtsNfYsFO5y9KqfZIc7r5cTdsfletx/gOb7cF3bekPPx/JUiAu2RU7vME9R8Rs1hlJ9kraJXA==} engines: {node: '>=12'} peerDependencies: - '@tanstack/react-router': ^1.143.4 - '@tanstack/router-core': ^1.143.4 + '@tanstack/react-router': ^1.146.2 + '@tanstack/router-core': ^1.146.2 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: '@tanstack/router-core': optional: true - '@tanstack/react-router-ssr-query@1.143.4': - resolution: {integrity: sha512-2+JZ2ikGyl7cMftPv+7D54fcrsLUxMXb4QX8a3vVpOaD1ecyc5Qjh7fCPzx6u1OuwIa39UnxYX14Lb/TWGXYhA==} + '@tanstack/react-router-ssr-query@1.146.2': + resolution: {integrity: sha512-pI72c+Ntm8kL1qOSXw4x8WiEZztZbLX1owiN31xIwsGSED063crCxpxuGqGFNxHYfcif5M/B4t42LnfiIJpZJQ==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' @@ -1964,29 +1978,29 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.143.4': - resolution: {integrity: sha512-7Tz7YwJc8RKDQga3yNY03zNc/ey+AIDA1A5ppGYqIM+UR47uGdAKc/4MSpItznqkSUi1Csrw2nVtICSkGanKdQ==} + '@tanstack/react-router@1.146.2': + resolution: {integrity: sha512-Oq/shGk5nCNyK/YhB9SGByeU3wgjNVzpGoDovuOvIacE9hsicZYOv9EnII1fEku8xavqWtN8D9wr21z2CDanjA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.143.4': - resolution: {integrity: sha512-83CnzYZki6zA/WUPAABQ3dVlMcwNCSAJdwwAJ6d3MJbryKROjqT8DnmAqa/eRoIeSkC1GCHgubPOGG1LAfY/QQ==} + '@tanstack/react-start-client@1.146.2': + resolution: {integrity: sha512-zZ1PdU7MEEflqxBpdfSm51SlN/o9zLDAp4hf5zP5t93AxC9RO6I1SWFP5B65GdyVqG4ZE1OyUBOnIuom7E64sw==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.143.4': - resolution: {integrity: sha512-mj5r5f1QTC+80cvoNOCiHrXZz2F4RHjhXmjt7cvukRsKsoWQkqo61IRH3llpJt2Tmrkib0rvnlG6k+DzKJrNrQ==} + '@tanstack/react-start-server@1.146.2': + resolution: {integrity: sha512-F/0ph0xcm60msreOC2aGTkDVXnHHaH3LiMuhHd/DRdmQlOdXC0NPKMw+R6I3fO52UUnKZYOfw6grJcg9YPdm6Q==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.143.4': - resolution: {integrity: sha512-dW1aKcb3UMjFOduzc2BSXoxhjc6iU6pgveE6TDmeK8luPIJH8XhBZZlCSlGSzNrLfZ90EhKiwzw9ObAbKpPyZQ==} + '@tanstack/react-start@1.146.3': + resolution: {integrity: sha512-BU1L0tCE7VT4br1e+CT7YIy0wKNiUu9yMKgqiVfaWU5lMbpvW79f3GpjRL6tMRV6duWKjcB64Ya5PXzpyiINkA==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -1999,31 +2013,31 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.143.4': - resolution: {integrity: sha512-VlSXrYQ/oBoUUGJx6t93KfzGHeBvL6GOmKRouPbHNqKi4ueVnQ2PdRX+s9eZoDAdcVsgmS7YlTCRgIbh2sAQpA==} + '@tanstack/router-core@1.146.2': + resolution: {integrity: sha512-MmTDiT6fpe+WBWYAuhp8oyzULBJX4oblm1kCqHDngf9mK3qcnNm5nkKk4d3Fk80QZmHS4DcRNFaFHKbLUVlZog==} engines: {node: '>=12'} - '@tanstack/router-devtools-core@1.143.4': - resolution: {integrity: sha512-f5uatl8LIlMS4O2uIQ/oh58pF62/N1qKrBPtYvc7B1Tvf16ER8Nr1t8d4a85MiQyyA4kgiqfnYryOfW+diLjwg==} + '@tanstack/router-devtools-core@1.146.2': + resolution: {integrity: sha512-rIo5TEyM6uex1Zr0kHtBZu9Mwo0Aj2A84hk+UaLIBLCRpqaen6tuzjxmgNDSZ4YrgZOmixfowLObdlsuMyXTsQ==} engines: {node: '>=12'} peerDependencies: - '@tanstack/router-core': ^1.143.4 + '@tanstack/router-core': ^1.146.2 csstype: ^3.0.10 solid-js: '>=1.9.5' peerDependenciesMeta: csstype: optional: true - '@tanstack/router-generator@1.143.4': - resolution: {integrity: sha512-QBqJCNoXJQmWkoAR6VqSuA7nBUSf3y5p8t4JpbtLGUgQ7pLu03nUSjcnLqN84BednhpZXnh/Mw3jxnpA//UWCQ==} + '@tanstack/router-generator@1.146.2': + resolution: {integrity: sha512-0eO/iL50OrNLtG613iHLmps8AVJC7WChDz+njFViTiWCf20RMEjeUlKTffdrREx3v/QeaLVuxlBvLkXRqSW0yg==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.143.4': - resolution: {integrity: sha512-gjqkdAHJ8lZ1pOcK2noboyLKtbwIH59H/3/a4OQu30yNmuRnDTN75OrSBMvHvgYnXM3a0qUo9uFCphsRbS9N6g==} + '@tanstack/router-plugin@1.146.3': + resolution: {integrity: sha512-2YCieC5UbFBEf3d1Up6Q2IeGqRjc+qmxbCvVxSONnitK6aDFKpRoxltlhMyeQyeIhFsIyhqxaIADOkO+fMrFRQ==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.143.4 + '@tanstack/react-router': ^1.146.2 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -2039,41 +2053,37 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.143.4': - resolution: {integrity: sha512-76/dJNygkm0uG+AMqK94zXi0wbx1h76KKQ6AZUYT1g2fxwmzK1szsTLwBhGusuNKYz0Ause5MzsbJYJ4Nb3KuA==} + '@tanstack/router-ssr-query-core@1.146.2': + resolution: {integrity: sha512-C9M8uw+TrtpvqTseBzPtCJ8QJkwj7BTaf/pbL4XmfaB0B+3CTl2f+ay/m52j00TR+AFPXPpvoXW+UpV2eOlVwA==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' '@tanstack/router-core': '>=1.127.0' - '@tanstack/router-utils@1.141.0': - resolution: {integrity: sha512-/eFGKCiix1SvjxwgzrmH4pHjMiMxc+GA4nIbgEkG2RdAJqyxLcRhd7RPLG0/LZaJ7d0ad3jrtRqsHLv2152Vbw==} + '@tanstack/router-utils@1.143.11': + resolution: {integrity: sha512-N24G4LpfyK8dOlnP8BvNdkuxg1xQljkyl6PcrdiPSA301pOjatRT1y8wuCCJZKVVD8gkd0MpCZ0VEjRMGILOtA==} engines: {node: '>=12'} - '@tanstack/server-functions-plugin@1.142.1': - resolution: {integrity: sha512-ltTOj6dIDlRV3M8+PzontDYFMnIQ+icUnD+OKzIRfKo6bbvC0qvy8ttuWmVJxmqHy9xsWgkNt4gZrKVjtWXIhQ==} - engines: {node: '>=12'} - - '@tanstack/start-client-core@1.143.4': - resolution: {integrity: sha512-AZNMenaxSUE3LUzVAfOhx3tqbsQ+BVWlQHO5rmqTdHpiayqkCMcmXWwjLawuYBNo7lWxmAsXIDsI3rKyUq7mvg==} + '@tanstack/start-client-core@1.146.2': + resolution: {integrity: sha512-ZACRxwxs4BLVxwUoLOLeyuJwbrjHEnL3QEuxoOPVDsazGPJHiD/0fA6aZoCadh+YFP/U3OoKtjfh7SwxN/SQVA==} engines: {node: '>=22.12.0'} - '@tanstack/start-fn-stubs@1.142.9': - resolution: {integrity: sha512-wQL0l3AowOagUWklcfzmM78UuNOun9ziqu4/GhMw95wBLVAtAdXThMg8yjQfZwNWcNq1ebxISbz1XAjTudvJ1Q==} + '@tanstack/start-fn-stubs@1.143.8': + resolution: {integrity: sha512-2IKUPh/TlxwzwHMiHNeFw95+L2sD4M03Es27SxMR0A60Qc4WclpaD6gpC8FsbuNASM2jBxk2UyeYClJxW1GOAQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.143.4': - resolution: {integrity: sha512-kwqofplhEQUAZ7cLxCNh3+1AP4NkcQqw0JE1rGFIXDCmLBMMmUwOC1V6N7/MtCI3ly626xadAxtq8x7yCVeD4Q==} + '@tanstack/start-plugin-core@1.146.3': + resolution: {integrity: sha512-dzvV0qzHbk42OyEgLpHW0RaBhQMbM5UC98dV6TLzdFIwt/LxvfyGskwyb2Uacc7U9r7uEafDnm0y40CvsP49kg==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.143.4': - resolution: {integrity: sha512-Sn4nYtFQ3jRWHyKt/LePJzBHlj3WyTdUzXd04oDfs9tryl9T7if8SyDj6iXI7SYU+n5cnCAkbYZ4MS8gmFnP5Q==} + '@tanstack/start-server-core@1.146.2': + resolution: {integrity: sha512-ugIEnZn84vR96a+G2ICfE7F5iiV5Tn45Y1omUe+tiXWIngb4tDvYTTFpNTIbD0NqoxfKyvN9YFbJH9OKtApDsQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.143.4': - resolution: {integrity: sha512-XIh9pDOWIZMoJDVBpDsvJ8xYg2qVK+cYVsvuhxqiCOOG/h4NvJfA3MWXl/W39rOzoC+dMZ8qNYMwYZ+GtUMKXg==} + '@tanstack/start-storage-context@1.146.2': + resolution: {integrity: sha512-kX9VzyJPqQR0hUVWbThLxDp8XHkGMmS/oFh9Yj5njXzHGxNm8y0nhEqKG7x+2o/Idxwqaf6mBOSp6FlONbrtEQ==} engines: {node: '>=22.12.0'} '@tanstack/store@0.7.7': @@ -2082,8 +2092,8 @@ packages: '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@tanstack/virtual-file-routes@1.141.0': - resolution: {integrity: sha512-CJrWtr6L9TVzEImm9S7dQINx+xJcYP/aDkIi6gnaWtIgbZs1pnzsE0yJc2noqXZ+yAOqLx3TBGpBEs9tS0P9/A==} + '@tanstack/virtual-file-routes@1.145.4': + resolution: {integrity: sha512-CI75JrfqSluhdGwLssgVeQBaCphgfkMQpi8MCY3UJX1hoGzXa8kHYJcUuIFMOLs1q7zqHy++EVVtMK03osR5wQ==} engines: {node: '>=12'} '@testing-library/dom@10.4.1': @@ -2152,63 +2162,66 @@ packages: '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@typescript-eslint/eslint-plugin@8.50.1': - resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + + '@typescript-eslint/eslint-plugin@8.52.0': + resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.50.1 + '@typescript-eslint/parser': ^8.52.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.50.1': - resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==} + '@typescript-eslint/parser@8.52.0': + resolution: {integrity: sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.50.1': - resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} + '@typescript-eslint/project-service@8.52.0': + resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.50.1': - resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} + '@typescript-eslint/scope-manager@8.52.0': + resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.50.1': - resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} + '@typescript-eslint/tsconfig-utils@8.52.0': + resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.50.1': - resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} + '@typescript-eslint/type-utils@8.52.0': + resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.50.1': - resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} + '@typescript-eslint/types@8.52.0': + resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.50.1': - resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} + '@typescript-eslint/typescript-estree@8.52.0': + resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.50.1': - resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} + '@typescript-eslint/utils@8.52.0': + resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.50.1': - resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} + '@typescript-eslint/visitor-keys@8.52.0': + resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -2428,8 +2441,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.9.13: + resolution: {integrity: sha512-WhtvB2NG2wjr04+h77sg3klAIwrgOqnjS49GGudnUPGFFgg7G17y7Qecqp+2Dr5kUDxNRBca0SK7cG8JwzkWDQ==} hasBin: true better-auth@1.4.10: @@ -2506,8 +2519,8 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - body-parser@2.2.1: - resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} boolbase@1.0.0: @@ -2560,8 +2573,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001761: - resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + caniuse-lite@1.0.30001763: + resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} @@ -2575,8 +2588,8 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} cheerio-select@2.1.0: @@ -2725,8 +2738,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@5.3.5: - resolution: {integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag==} + cssstyle@5.3.7: + resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} csstype@3.2.3: @@ -2992,6 +3005,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3006,13 +3023,17 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -3255,8 +3276,8 @@ packages: resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - h3@2.0.1-rc.6: - resolution: {integrity: sha512-kKLFVFNJlDVTbQjakz1ZTFSHB9+oi9+Khf0v7xQsUKU3iOqu2qmrFzTD56YsDvvj2nBgqVDphGRXB2VRursw4w==} + h3@2.0.1-rc.7: + resolution: {integrity: sha512-qbrRu1OLXmUYnysWOCVrYhtC/m8ZuXu/zCbo3U/KyphJxbPFiC76jHYwVrmEcss9uNAHO5BoUguQ46yEpgI2PA==} engines: {node: '>=20.11.1'} peerDependencies: crossws: ^0.4.1 @@ -3283,9 +3304,9 @@ packages: resolution: {integrity: sha512-BIdolzGpDO9MQ4nu3AUuDwHZZ+KViNm+EZ75Ae55eMXMqLVhDFqEMXxtUe9Qh8hjL+pIna/frs2j6Y2yD5Ua/g==} engines: {node: '>=16.9.0'} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -3321,8 +3342,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.1: - resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -3464,8 +3485,8 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@27.3.0: - resolution: {integrity: sha512-GtldT42B8+jefDUC4yUKAvsaOrH7PDHmZxZXNgF2xMmymjUbRYJvpAybZAKEmXDGTM0mCsz8duOa4vTm5AY2Kg==} + jsdom@27.4.0: + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 @@ -3704,8 +3725,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.12.4: - resolution: {integrity: sha512-rHNiVfTyKhzc0EjoXUBVGteNKBevdjOlVC6GlIRXpy+/3LHEIGRovnB5WPjcvmNODVQ1TNFnoa7wsGbd0V3epg==} + msw@2.12.7: + resolution: {integrity: sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -4039,8 +4060,8 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -4167,8 +4188,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.54.0: - resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4218,8 +4239,8 @@ packages: peerDependencies: seroval: ^1.0 - seroval-plugins@1.4.0: - resolution: {integrity: sha512-zir1aWzoiax6pbBVjoYVd0O1QQXgIL3eVGBMsBsNmM8Ukq90yGaWlfx0AB9dTS8GPqrOrbXn79vmItCUP9U3BQ==} + seroval-plugins@1.4.2: + resolution: {integrity: sha512-X7p4MEDTi+60o2sXZ4bnDBhgsUYDSkQEvzYZuJyFqWg9jcoPsHts5nrg5O956py2wyt28lUrBxk0M0/wU8URpA==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -4228,8 +4249,8 @@ packages: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} - seroval@1.4.1: - resolution: {integrity: sha512-9GOc+8T6LN4aByLN75uRvMbrwY5RDBW6lSlknsY4LEa9ZmWcxKcRe1G/Q3HZXjltxMHTrStnvrwAICxZrhldtg==} + seroval@1.4.2: + resolution: {integrity: sha512-N3HEHRCZYn3cQbsC4B5ldj9j+tHdf4JZoYPlcI4rRYu0Xy4qN8MQf1Z08EibzB0WpgRG5BGK08FTrmM66eSzKQ==} engines: {node: '>=10'} serve-static@2.2.1: @@ -4242,8 +4263,8 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@3.6.2: - resolution: {integrity: sha512-2g48/7UsXTSWMFU9GYww85AN5iVTkErbeycrcleI55R+atqW8HE1M/YDFyQ+0T3Bwsd4e8vycPu9gmwODunDpw==} + shadcn@3.6.3: + resolution: {integrity: sha512-j2xlma8PtYLbhvA612/MPOrDYsEp0DIiU1gC0BEbSBqWR6mBgwiKpA21Juq9tSswgUeIfxoUzZX8c7YwcL3ncA==} hasBin: true shebang-command@2.0.0: @@ -4321,8 +4342,8 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} - srvx@0.9.8: - resolution: {integrity: sha512-RZaxTKJEE/14HYn8COLuUOJAt0U55N9l1Xf6jj+T0GoA01EUH1Xz5JtSUOI+EHn+AEgPCVn7gk6jHJffrr06fQ==} + srvx@0.10.0: + resolution: {integrity: sha512-NqIsR+wQCfkvvwczBh8J8uM4wTZx41K2lLSEp/3oMp917ODVVMtW5Me4epCmQ3gH8D+0b+/t4xxkUKutyhimTA==} engines: {node: '>=20.16.0'} hasBin: true @@ -4396,8 +4417,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} @@ -4468,8 +4489,8 @@ packages: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -4523,8 +4544,8 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - typescript-eslint@8.50.1: - resolution: {integrity: sha512-ytTHO+SoYSbhAH9CrYnMhiLx8To6PSSvqnvXyPUgPETCvB6eBKmTI9w6XMPS3HsBRGkwTVBX+urA8dYQx6bHfQ==} + typescript-eslint@8.52.0: + resolution: {integrity: sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4535,14 +4556,14 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.2: + resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + undici@7.18.2: + resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} engines: {node: '>=20.18.1'} unicorn-magic@0.3.0: @@ -4619,6 +4640,10 @@ packages: typescript: optional: true + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -4636,8 +4661,8 @@ packages: vite: optional: true - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4729,8 +4754,8 @@ packages: web-vitals@5.1.0: resolution: {integrity: sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==} - webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} webpack-virtual-modules@0.6.2: @@ -4739,6 +4764,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -4778,8 +4804,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4790,8 +4816,8 @@ packages: utf-8-validate: optional: true - wsl-utils@0.3.0: - resolution: {integrity: sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} xml-name-validator@5.0.0: @@ -4839,16 +4865,16 @@ packages: zeptomatch@2.0.2: resolution: {integrity: sha512-H33jtSKf8Ijtb5BW6wua3G5DhnFjbFML36eFu+VdOoVY4HD9e7ggjqdM6639B+L87rjnR6Y+XeRzBXZdy52B/g==} - zod-to-json-schema@3.25.0: - resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: zod: ^3.25 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.2.1: - resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + zod@4.3.5: + resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} snapshots: @@ -4879,12 +4905,6 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -5092,7 +5112,7 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) reselect: 5.1.1 - tabbable: 6.3.0 + tabbable: 6.4.0 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 @@ -5108,20 +5128,20 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - '@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': + '@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': dependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@standard-schema/spec': 1.1.0 - better-call: 1.1.7(zod@4.2.1) + better-call: 1.1.7(zod@4.3.5) jose: 6.1.3 kysely: 0.28.9 nanostores: 1.1.0 - zod: 4.2.1 + zod: 4.3.5 - '@better-auth/telemetry@1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))': + '@better-auth/telemetry@1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))': dependencies: - '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 @@ -5162,11 +5182,11 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.22': {} + '@csstools/css-syntax-patches-for-csstree@1.0.23': {} '@csstools/css-tokenizer@3.0.4': {} - '@dotenvx/dotenvx@1.51.2': + '@dotenvx/dotenvx@1.51.4': dependencies: commander: 11.1.0 dotenv: 17.2.3 @@ -5192,13 +5212,13 @@ snapshots: '@electric-sql/pglite@0.3.2': {} - '@emnapi/core@1.7.1': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -5286,7 +5306,7 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 @@ -5332,6 +5352,8 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.8.0': {} + '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 @@ -5355,7 +5377,7 @@ snapshots: dependencies: hono: 4.10.6 - '@hono/node-server@1.19.7(hono@4.10.6)': + '@hono/node-server@1.19.8(hono@4.10.6)': dependencies: hono: 4.10.6 @@ -5463,9 +5485,9 @@ snapshots: '@lix-js/server-protocol-schema@0.1.1': {} - '@modelcontextprotocol/sdk@1.25.1(hono@4.10.6)(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.25.2(hono@4.10.6)(zod@3.25.76)': dependencies: - '@hono/node-server': 1.19.7(hono@4.10.6) + '@hono/node-server': 1.19.8(hono@4.10.6) ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 @@ -5480,7 +5502,7 @@ snapshots: pkce-challenge: 5.0.1 raw-body: 3.0.2 zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - hono - supports-color @@ -5501,8 +5523,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -6399,70 +6421,79 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.53': {} - '@rollup/rollup-android-arm-eabi@4.54.0': + '@rollup/rollup-android-arm-eabi@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.54.0': + '@rollup/rollup-android-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.54.0': + '@rollup/rollup-darwin-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.54.0': + '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.54.0': + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.54.0': + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.54.0': + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.54.0': + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.54.0': + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.54.0': + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.54.0': + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.54.0': + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.54.0': + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.54.0': + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.54.0': + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-openharmony-arm64@4.54.0': + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.54.0': + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.54.0': + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.54.0': + '@rollup/rollup-openharmony-arm64@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.54.0': + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': optional: true '@sec-ant/readable-stream@0.4.1': {} @@ -6509,13 +6540,13 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/types': 8.50.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/types': 8.52.0 eslint: 9.39.2(jiti@2.6.1) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 estraverse: 5.3.0 picomatch: 4.0.3 @@ -6580,12 +6611,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/vite@4.1.18(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) '@tanstack/devtools-client@0.0.3': dependencies: @@ -6597,7 +6628,7 @@ snapshots: '@tanstack/devtools-event-bus@0.3.3': dependencies: - ws: 8.18.3 + ws: 8.19.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6614,7 +6645,7 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.3.12(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/devtools-vite@0.3.12(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -6626,7 +6657,7 @@ snapshots: chalk: 5.6.2 launch-editor: 2.12.0 picomatch: 4.0.3 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - bufferutil - supports-color @@ -6648,29 +6679,15 @@ snapshots: - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.142.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@tanstack/router-utils': 1.141.0 - babel-dead-code-elimination: 1.0.11 - pathe: 2.0.3 - tiny-invariant: 1.3.3 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) - transitivePeerDependencies: - - supports-color - - '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-config@0.3.4(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint/js': 9.39.2 - '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.2(jiti@2.6.1)) + '@stylistic/eslint-plugin': 5.7.0(eslint@9.39.2(jiti@2.6.1)) eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) globals: 16.5.0 - typescript-eslint: 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@2.6.1)) transitivePeerDependencies: - '@typescript-eslint/utils' @@ -6684,13 +6701,13 @@ snapshots: '@tanstack/pacer-lite': 0.1.1 '@tanstack/store': 0.7.7 - '@tanstack/history@1.141.0': {} + '@tanstack/history@1.145.7': {} '@tanstack/pacer-lite@0.1.1': {} - '@tanstack/query-core@5.90.12': {} + '@tanstack/query-core@5.90.16': {} - '@tanstack/query-devtools@5.91.1': {} + '@tanstack/query-devtools@5.92.0': {} '@tanstack/react-devtools@0.7.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)': dependencies: @@ -6705,96 +6722,96 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-form@1.27.7(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-form@1.27.7(@tanstack/react-start@1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/form-core': 1.27.7 '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 optionalDependencies: - '@tanstack/react-start': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@tanstack/react-start': 1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) transitivePeerDependencies: - react-dom - '@tanstack/react-query-devtools@5.91.1(@tanstack/react-query@5.90.12(react@19.2.3))(react@19.2.3)': + '@tanstack/react-query-devtools@5.91.2(@tanstack/react-query@5.90.16(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/query-devtools': 5.91.1 - '@tanstack/react-query': 5.90.12(react@19.2.3) + '@tanstack/query-devtools': 5.92.0 + '@tanstack/react-query': 5.90.16(react@19.2.3) react: 19.2.3 - '@tanstack/react-query@5.90.12(react@19.2.3)': + '@tanstack/react-query@5.90.16(react@19.2.3)': dependencies: - '@tanstack/query-core': 5.90.12 + '@tanstack/query-core': 5.90.16 react: 19.2.3 - '@tanstack/react-router-devtools@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.143.4)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)': + '@tanstack/react-router-devtools@1.146.2(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.146.2)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)': dependencies: - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-devtools-core': 1.143.4(@tanstack/router-core@1.143.4)(csstype@3.2.3)(solid-js@1.9.10) + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-devtools-core': 1.146.2(@tanstack/router-core@1.146.2)(csstype@3.2.3)(solid-js@1.9.10) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@tanstack/router-core': 1.143.4 + '@tanstack/router-core': 1.146.2 transitivePeerDependencies: - csstype - solid-js - '@tanstack/react-router-ssr-query@1.143.4(@tanstack/query-core@5.90.12)(@tanstack/react-query@5.90.12(react@19.2.3))(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.143.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router-ssr-query@1.146.2(@tanstack/query-core@5.90.16)(@tanstack/react-query@5.90.16(react@19.2.3))(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.146.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/query-core': 5.90.12 - '@tanstack/react-query': 5.90.12(react@19.2.3) - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-ssr-query-core': 1.143.4(@tanstack/query-core@5.90.12)(@tanstack/router-core@1.143.4) + '@tanstack/query-core': 5.90.16 + '@tanstack/react-query': 5.90.16(react@19.2.3) + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-ssr-query-core': 1.146.2(@tanstack/query-core@5.90.16)(@tanstack/router-core@1.146.2) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/history': 1.141.0 + '@tanstack/history': 1.145.7 '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.143.4 + '@tanstack/router-core': 1.146.2 isbot: 5.1.32 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-client@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.143.4 - '@tanstack/start-client-core': 1.143.4 + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.146.2 + '@tanstack/start-client-core': 1.146.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-server@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/history': 1.141.0 - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.143.4 - '@tanstack/start-client-core': 1.143.4 - '@tanstack/start-server-core': 1.143.4 + '@tanstack/history': 1.145.7 + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.146.2 + '@tanstack/start-client-core': 1.146.2 + '@tanstack/start-server-core': 1.146.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/react-start@1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-client': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-server': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-utils': 1.141.0 - '@tanstack/start-client-core': 1.143.4 - '@tanstack/start-plugin-core': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@tanstack/start-server-core': 1.143.4 + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-client': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-utils': 1.143.11 + '@tanstack/start-client-core': 1.146.2 + '@tanstack/start-plugin-core': 1.146.3(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@tanstack/start-server-core': 1.146.2 pathe: 2.0.3 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - '@rsbuild/core' - crossws @@ -6809,19 +6826,19 @@ snapshots: react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) - '@tanstack/router-core@1.143.4': + '@tanstack/router-core@1.146.2': dependencies: - '@tanstack/history': 1.141.0 + '@tanstack/history': 1.145.7 '@tanstack/store': 0.8.0 cookie-es: 2.0.0 - seroval: 1.4.1 - seroval-plugins: 1.4.0(seroval@1.4.1) + seroval: 1.4.2 + seroval-plugins: 1.4.2(seroval@1.4.2) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.143.4(@tanstack/router-core@1.143.4)(csstype@3.2.3)(solid-js@1.9.10)': + '@tanstack/router-devtools-core@1.146.2(@tanstack/router-core@1.146.2)(csstype@3.2.3)(solid-js@1.9.10)': dependencies: - '@tanstack/router-core': 1.143.4 + '@tanstack/router-core': 1.146.2 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.10 @@ -6829,11 +6846,11 @@ snapshots: optionalDependencies: csstype: 3.2.3 - '@tanstack/router-generator@1.143.4': + '@tanstack/router-generator@1.146.2': dependencies: - '@tanstack/router-core': 1.143.4 - '@tanstack/router-utils': 1.141.0 - '@tanstack/virtual-file-routes': 1.141.0 + '@tanstack/router-core': 1.146.2 + '@tanstack/router-utils': 1.143.11 + '@tanstack/virtual-file-routes': 1.145.4 prettier: 3.7.4 recast: 0.23.11 source-map: 0.7.6 @@ -6842,7 +6859,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/router-plugin@1.146.3(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -6850,31 +6867,30 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 - '@tanstack/router-core': 1.143.4 - '@tanstack/router-generator': 1.143.4 - '@tanstack/router-utils': 1.141.0 - '@tanstack/virtual-file-routes': 1.141.0 + '@tanstack/router-core': 1.146.2 + '@tanstack/router-generator': 1.146.2 + '@tanstack/router-utils': 1.143.11 + '@tanstack/virtual-file-routes': 1.145.4 babel-dead-code-elimination: 1.0.11 chokidar: 3.6.0 unplugin: 2.3.11 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + '@tanstack/react-router': 1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.143.4(@tanstack/query-core@5.90.12)(@tanstack/router-core@1.143.4)': + '@tanstack/router-ssr-query-core@1.146.2(@tanstack/query-core@5.90.16)(@tanstack/router-core@1.146.2)': dependencies: - '@tanstack/query-core': 5.90.12 - '@tanstack/router-core': 1.143.4 + '@tanstack/query-core': 5.90.16 + '@tanstack/router-core': 1.146.2 - '@tanstack/router-utils@1.141.0': + '@tanstack/router-utils@1.143.11': dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) ansis: 4.2.0 diff: 8.0.2 pathe: 2.0.3 @@ -6882,55 +6898,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/server-functions-plugin@1.142.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/start-client-core@1.146.2': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@tanstack/directive-functions-plugin': 1.142.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - babel-dead-code-elimination: 1.0.11 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - supports-color - - vite - - '@tanstack/start-client-core@1.143.4': - dependencies: - '@tanstack/router-core': 1.143.4 - '@tanstack/start-fn-stubs': 1.142.9 - '@tanstack/start-storage-context': 1.143.4 - seroval: 1.4.1 + '@tanstack/router-core': 1.146.2 + '@tanstack/start-fn-stubs': 1.143.8 + '@tanstack/start-storage-context': 1.146.2 + seroval: 1.4.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/start-fn-stubs@1.142.9': {} + '@tanstack/start-fn-stubs@1.143.8': {} - '@tanstack/start-plugin-core@1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@tanstack/start-plugin-core@1.146.3(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/core': 7.28.5 '@babel/types': 7.28.5 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.143.4 - '@tanstack/router-generator': 1.143.4 - '@tanstack/router-plugin': 1.143.4(@tanstack/react-router@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@tanstack/router-utils': 1.141.0 - '@tanstack/server-functions-plugin': 1.142.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) - '@tanstack/start-client-core': 1.143.4 - '@tanstack/start-server-core': 1.143.4 + '@tanstack/router-core': 1.146.2 + '@tanstack/router-generator': 1.146.2 + '@tanstack/router-plugin': 1.146.3(@tanstack/react-router@1.146.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@tanstack/router-utils': 1.143.11 + '@tanstack/start-client-core': 1.146.2 + '@tanstack/start-server-core': 1.146.2 babel-dead-code-elimination: 1.0.11 cheerio: 1.1.2 exsolve: 1.0.8 pathe: 2.0.3 - srvx: 0.9.8 + srvx: 0.10.0 tinyglobby: 0.2.15 - ufo: 1.6.1 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) - vitefu: 1.1.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + ufo: 1.6.2 + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vitefu: 1.1.1(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) xmlbuilder2: 4.0.3 zod: 3.25.76 transitivePeerDependencies: @@ -6941,27 +6940,27 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.143.4': + '@tanstack/start-server-core@1.146.2': dependencies: - '@tanstack/history': 1.141.0 - '@tanstack/router-core': 1.143.4 - '@tanstack/start-client-core': 1.143.4 - '@tanstack/start-storage-context': 1.143.4 - h3-v2: h3@2.0.1-rc.6 - seroval: 1.4.1 + '@tanstack/history': 1.145.7 + '@tanstack/router-core': 1.146.2 + '@tanstack/start-client-core': 1.146.2 + '@tanstack/start-storage-context': 1.146.2 + h3-v2: h3@2.0.1-rc.7 + seroval: 1.4.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.143.4': + '@tanstack/start-storage-context@1.146.2': dependencies: - '@tanstack/router-core': 1.143.4 + '@tanstack/router-core': 1.146.2 '@tanstack/store@0.7.7': {} '@tanstack/store@0.8.0': {} - '@tanstack/virtual-file-routes@1.141.0': {} + '@tanstack/virtual-file-routes@1.145.4': {} '@testing-library/dom@10.4.1': dependencies: @@ -7043,95 +7042,97 @@ snapshots: '@types/statuses@2.0.6': {} - '@typescript-eslint/eslint-plugin@8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@types/validate-npm-package-name@4.0.2': {} + + '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.1 + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 eslint: 9.39.2(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.1 + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.50.1': + '@typescript-eslint/scope-manager@8.52.0': dependencies: - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/visitor-keys': 8.50.1 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 - '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.50.1': {} + '@typescript-eslint/types@8.52.0': {} - '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/visitor-keys': 8.50.1 + '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.52.0 + '@typescript-eslint/types': 8.52.0 + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.50.1': + '@typescript-eslint/visitor-keys@8.52.0': dependencies: - '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -7193,7 +7194,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitejs/plugin-react@5.1.2(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@vitejs/plugin-react@5.1.2(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -7201,7 +7202,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.53 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -7213,14 +7214,14 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': + '@vitest/mocker@3.2.4(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.12.4(@types/node@22.19.3)(typescript@5.9.3) - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + msw: 2.12.7(@types/node@22.19.3)(typescript@5.9.3) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7327,41 +7328,41 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.9.13: {} - better-auth@1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)): + better-auth@1.4.10(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)))(mysql2@3.15.3)(pg@8.16.3)(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10)(vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)): dependencies: - '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) - '@better-auth/telemetry': 1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.2.1))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) + '@better-auth/core': 1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/telemetry': 1.4.10(@better-auth/core@1.4.10(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.1.1 '@noble/hashes': 2.0.1 - better-call: 1.1.7(zod@4.2.1) + better-call: 1.1.7(zod@4.3.5) defu: 6.1.4 jose: 6.1.3 kysely: 0.28.9 nanostores: 1.1.0 - zod: 4.2.1 + zod: 4.3.5 optionalDependencies: '@prisma/client': 7.2.0(prisma@7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3) - '@tanstack/react-start': 1.143.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@tanstack/react-start': 1.146.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) mysql2: 3.15.3 pg: 8.16.3 prisma: 7.2.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) solid-js: 1.9.10 - vitest: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0) + vitest: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0) - better-call@1.1.7(zod@4.2.1): + better-call@1.1.7(zod@4.3.5): dependencies: '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 rou3: 0.7.12 set-cookie-parser: 2.7.2 optionalDependencies: - zod: 4.2.1 + zod: 4.3.5 bidi-js@1.0.3: dependencies: @@ -7369,15 +7370,15 @@ snapshots: binary-extensions@2.3.0: {} - body-parser@2.2.1: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3 http-errors: 2.0.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.0 + qs: 6.14.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -7400,8 +7401,8 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001761 + baseline-browser-mapping: 2.9.13 + caniuse-lite: 1.0.30001763 electron-to-chromium: 1.5.267 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -7441,12 +7442,12 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001761: {} + caniuse-lite@1.0.30001763: {} chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 loupe: 3.2.1 pathval: 2.0.1 @@ -7458,7 +7459,7 @@ snapshots: chalk@5.6.2: {} - check-error@2.1.1: {} + check-error@2.1.3: {} cheerio-select@2.1.0: dependencies: @@ -7480,7 +7481,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.16.0 + undici: 7.18.2 whatwg-mimetype: 4.0.0 chevrotain@10.5.0: @@ -7613,11 +7614,12 @@ snapshots: cssesc@3.0.0: {} - cssstyle@5.3.5: + cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.1 - '@csstools/css-syntax-patches-for-csstree': 1.0.22 + '@csstools/css-syntax-patches-for-csstree': 1.0.23 css-tree: 3.1.0 + lru-cache: 11.2.4 csstype@3.2.3: {} @@ -7815,14 +7817,14 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 eslint: 9.39.2(jiti@2.6.1) eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@typescript-eslint/types': 8.50.1 + '@typescript-eslint/types': 8.52.0 comment-parser: 1.4.1 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) @@ -7833,13 +7835,13 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color eslint-plugin-n@17.23.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) enhanced-resolve: 5.18.4 eslint: 9.39.2(jiti@2.6.1) eslint-plugin-es-x: 7.8.0(eslint@9.39.2(jiti@2.6.1)) @@ -7861,9 +7863,11 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.0: {} + eslint@9.39.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 @@ -7883,7 +7887,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -7908,9 +7912,15 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@11.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -7970,7 +7980,7 @@ snapshots: express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.1 + body-parser: 2.2.2 content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 @@ -7989,7 +7999,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -8180,10 +8190,10 @@ snapshots: graphql@16.12.0: {} - h3@2.0.1-rc.6: + h3@2.0.1-rc.7: dependencies: rou3: 0.7.12 - srvx: 0.9.8 + srvx: 0.10.0 has-flag@4.0.0: {} @@ -8197,9 +8207,11 @@ snapshots: hono@4.10.6: {} - html-encoding-sniffer@4.0.0: + html-encoding-sniffer@6.0.0: dependencies: - whatwg-encoding: 3.1.1 + '@exodus/bytes': 1.8.0 + transitivePeerDependencies: + - '@exodus/crypto' htmlparser2@10.0.0: dependencies: @@ -8242,7 +8254,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.1: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -8333,14 +8345,15 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@27.3.0: + jsdom@27.4.0: dependencies: '@acemir/cssom': 0.9.30 '@asamuzakjp/dom-selector': 6.7.6 - cssstyle: 5.3.5 + '@exodus/bytes': 1.8.0 + cssstyle: 5.3.7 data-urls: 6.0.0 decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 + html-encoding-sniffer: 6.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 @@ -8349,13 +8362,13 @@ snapshots: symbol-tree: 3.2.4 tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 + webidl-conversions: 8.0.1 whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 - ws: 8.18.3 + ws: 8.19.0 xml-name-validator: 5.0.0 transitivePeerDependencies: + - '@exodus/crypto' - bufferutil - supports-color - utf-8-validate @@ -8531,7 +8544,7 @@ snapshots: ms@2.1.3: {} - msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3): + msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3): dependencies: '@inquirer/confirm': 5.1.21(@types/node@22.19.3) '@mswjs/interceptors': 0.40.0 @@ -8563,7 +8576,7 @@ snapshots: aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 long: 5.3.2 lru.min: 1.1.3 named-placeholders: 1.1.6 @@ -8655,7 +8668,7 @@ snapshots: is-in-ssh: 1.0.0 is-inside-container: 1.0.0 powershell-utils: 0.1.0 - wsl-utils: 0.3.0 + wsl-utils: 0.3.1 optionator@0.9.4: dependencies: @@ -8866,7 +8879,7 @@ snapshots: pure-rand@6.1.0: {} - qs@6.14.0: + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -8941,7 +8954,7 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.1 + iconv-lite: 0.7.2 unpipe: 1.0.0 rc9@2.1.2: @@ -9028,32 +9041,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.54.0: + rollup@4.55.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.54.0 - '@rollup/rollup-android-arm64': 4.54.0 - '@rollup/rollup-darwin-arm64': 4.54.0 - '@rollup/rollup-darwin-x64': 4.54.0 - '@rollup/rollup-freebsd-arm64': 4.54.0 - '@rollup/rollup-freebsd-x64': 4.54.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 - '@rollup/rollup-linux-arm-musleabihf': 4.54.0 - '@rollup/rollup-linux-arm64-gnu': 4.54.0 - '@rollup/rollup-linux-arm64-musl': 4.54.0 - '@rollup/rollup-linux-loong64-gnu': 4.54.0 - '@rollup/rollup-linux-ppc64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-gnu': 4.54.0 - '@rollup/rollup-linux-riscv64-musl': 4.54.0 - '@rollup/rollup-linux-s390x-gnu': 4.54.0 - '@rollup/rollup-linux-x64-gnu': 4.54.0 - '@rollup/rollup-linux-x64-musl': 4.54.0 - '@rollup/rollup-openharmony-arm64': 4.54.0 - '@rollup/rollup-win32-arm64-msvc': 4.54.0 - '@rollup/rollup-win32-ia32-msvc': 4.54.0 - '@rollup/rollup-win32-x64-gnu': 4.54.0 - '@rollup/rollup-win32-x64-msvc': 4.54.0 + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 rou3@0.7.12: {} @@ -9108,13 +9124,13 @@ snapshots: dependencies: seroval: 1.3.2 - seroval-plugins@1.4.0(seroval@1.4.1): + seroval-plugins@1.4.2(seroval@1.4.2): dependencies: - seroval: 1.4.1 + seroval: 1.4.2 seroval@1.3.2: {} - seroval@1.4.1: {} + seroval@1.4.2: {} serve-static@2.2.1: dependencies: @@ -9129,15 +9145,16 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@3.6.2(@types/node@22.19.3)(hono@4.10.6)(typescript@5.9.3): + shadcn@3.6.3(@types/node@22.19.3)(hono@4.10.6)(typescript@5.9.3): dependencies: '@antfu/ni': 25.0.0 '@babel/core': 7.28.5 '@babel/parser': 7.28.5 '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@dotenvx/dotenvx': 1.51.2 - '@modelcontextprotocol/sdk': 1.25.1(hono@4.10.6)(zod@3.25.76) + '@dotenvx/dotenvx': 1.51.4 + '@modelcontextprotocol/sdk': 1.25.2(hono@4.10.6)(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 browserslist: 4.28.1 commander: 14.0.2 cosmiconfig: 9.0.0(typescript@5.9.3) @@ -9150,7 +9167,7 @@ snapshots: fuzzysort: 3.1.0 https-proxy-agent: 7.0.6 kleur: 4.1.5 - msw: 2.12.4(@types/node@22.19.3)(typescript@5.9.3) + msw: 2.12.7(@types/node@22.19.3)(typescript@5.9.3) node-fetch: 3.3.2 open: 11.0.0 ora: 8.2.0 @@ -9161,8 +9178,9 @@ snapshots: stringify-object: 5.0.0 ts-morph: 26.0.0 tsconfig-paths: 4.2.0 + validate-npm-package-name: 7.0.2 zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: - '@cfworker/json-schema' - '@types/node' @@ -9241,7 +9259,7 @@ snapshots: sqlstring@2.3.3: {} - srvx@0.9.8: {} + srvx@0.10.0: {} stable-hash-x@0.2.0: {} @@ -9301,7 +9319,7 @@ snapshots: symbol-tree@3.2.4: {} - tabbable@6.3.0: {} + tabbable@6.4.0: {} tagged-tag@1.0.0: {} @@ -9352,7 +9370,7 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@2.1.0(typescript@5.9.3): + ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -9403,12 +9421,12 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - typescript-eslint@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.50.1(@typescript-eslint/parser@8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -9416,11 +9434,11 @@ snapshots: typescript@5.9.3: {} - ufo@1.6.1: {} + ufo@1.6.2: {} undici-types@6.21.0: {} - undici@7.16.0: {} + undici@7.18.2: {} unicorn-magic@0.3.0: {} @@ -9500,6 +9518,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} vite-node@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): @@ -9508,7 +9528,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - '@types/node' - jiti @@ -9523,24 +9543,24 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) transitivePeerDependencies: - supports-color - typescript - vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): + vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.54.0 + rollup: 4.55.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.19.3 @@ -9549,15 +9569,15 @@ snapshots: lightningcss: 1.30.2 tsx: 4.21.0 - vitefu@1.1.1(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)): + vitefu@1.1.1(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)): optionalDependencies: - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) - vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.3.0)(lightningcss@1.30.2)(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0): + vitest@3.2.4(@types/node@22.19.3)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.12.4(@types/node@22.19.3)(typescript@5.9.3))(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) + '@vitest/mocker': 3.2.4(msw@2.12.7(@types/node@22.19.3)(typescript@5.9.3))(vite@7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -9575,12 +9595,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) vite-node: 3.2.4(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.3 - jsdom: 27.3.0 + jsdom: 27.4.0 transitivePeerDependencies: - jiti - less @@ -9602,7 +9622,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -9615,7 +9635,7 @@ snapshots: web-vitals@5.1.0: {} - webidl-conversions@8.0.0: {} + webidl-conversions@8.0.1: {} webpack-virtual-modules@0.6.2: {} @@ -9628,7 +9648,7 @@ snapshots: whatwg-url@15.1.0: dependencies: tr46: 6.0.0 - webidl-conversions: 8.0.0 + webidl-conversions: 8.0.1 which@2.0.2: dependencies: @@ -9659,9 +9679,9 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.3: {} + ws@8.19.0: {} - wsl-utils@0.3.0: + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.0 powershell-utils: 0.1.0 @@ -9705,10 +9725,10 @@ snapshots: dependencies: grammex: 3.1.12 - zod-to-json-schema@3.25.0(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 zod@3.25.76: {} - zod@4.2.1: {} + zod@4.3.5: {} diff --git a/src/components/form/profile-form.tsx b/src/components/form/profile-form.tsx index 61f6642..caef89d 100644 --- a/src/components/form/profile-form.tsx +++ b/src/components/form/profile-form.tsx @@ -1,5 +1,6 @@ import { authClient } from '@/lib/auth-client'; import { m } from '@/paraglide/messages'; +import { uploadProfileImage } from '@/service/profile.api'; import { ProfileInput, profileUpdateSchema } from '@/service/profile.schema'; import { UserCircleIcon } from '@phosphor-icons/react'; import { useForm } from '@tanstack/react-form'; @@ -35,9 +36,21 @@ const ProfileForm = () => { }, onSubmit: async ({ value }) => { try { + let imageKey; + if (value.image) { + // upload image + const formData = new FormData(); + formData.set('file', value.image); + const { imageKey: uploadedKey } = await uploadProfileImage({ + data: formData, + }); + imageKey = uploadedKey; + } + await authClient.updateUser( { name: value.name, + image: imageKey, }, { onSuccess: () => { diff --git a/src/service/profile.api.ts b/src/service/profile.api.ts index e69de29..d496c80 100644 --- a/src/service/profile.api.ts +++ b/src/service/profile.api.ts @@ -0,0 +1,17 @@ +import { authMiddleware } from '@/lib/middleware'; +import { saveFile } from '@/utils/disk-storage'; +import { createServerFn } from '@tanstack/react-start'; +import z from 'zod'; + +export const uploadProfileImage = createServerFn({ method: 'POST' }) + .middleware([authMiddleware]) + .inputValidator(z.instanceof(FormData)) + .handler(async ({ data: formData }) => { + const uuid = crypto.randomUUID(); + const file = formData.get('file') as File; + if (!(file instanceof File)) throw new Error('File not found'); + const imageKey = `${uuid}.${file.type.split('/')[1]}`; + const buffer = Buffer.from(await file.arrayBuffer()); + await saveFile(imageKey, buffer); + return { imageKey }; + }); diff --git a/src/service/setting.api.ts b/src/service/setting.api.ts index 153c6ab..7fceb04 100644 --- a/src/service/setting.api.ts +++ b/src/service/setting.api.ts @@ -1,65 +1,87 @@ import { prisma } from '@/db'; import { Setting } from '@/generated/prisma/client'; import { authMiddleware } from '@/lib/middleware'; +import { extractDiffObjects } from '@/utils/help'; import { createServerFn } from '@tanstack/react-start'; +import { createAuditLog } from './audit.api'; import { settingSchema, userSettingSchema } from './setting.schema'; type AdminSettingReturn = { - [key: string]: Setting; + [key: string]: Pick | string; }; +async function getAllAdminSettings(valueOnly = false) { + const settings = await prisma.setting.findMany({ + where: { + relation: 'admin', + }, + select: { + id: true, + key: true, + value: true, + }, + }); + + const results: AdminSettingReturn = {}; + + settings.forEach((setting) => { + results[setting.key] = valueOnly ? setting.value : setting; + }); + + return results; +} + // Settings for admin export const getAdminSettings = createServerFn({ method: 'GET' }) .middleware([authMiddleware]) .handler(async () => { - console.log('first'); - const settings = await prisma.setting.findMany({ - where: { - relation: 'admin', - }, - }); - - const results: AdminSettingReturn = {}; - - settings.forEach((setting) => { - results[setting.key] = setting; - }); - - return results; + return await getAllAdminSettings(); }); export const updateAdminSettings = createServerFn({ method: 'POST' }) .inputValidator(settingSchema) .middleware([authMiddleware]) - .handler(async ({ data }) => { - // Update each setting - const updates = Object.entries(data).map(([key, value]) => - prisma.setting.upsert({ - where: { key }, - update: { value }, - create: { - key, - value, - description: key, // or provide proper descriptions - relation: 'admin', - }, - }), - ); + .handler(async ({ data, context }) => { + try { + const oldSetting = await getAllAdminSettings(true); - await prisma.$transaction(updates); + // Update each setting + const updates = Object.entries(data).map(([key, value]) => + prisma.setting.upsert({ + where: { key }, + update: { value }, + create: { + key, + value, + description: key, // or provide proper descriptions + relation: 'admin', + }, + }), + ); - // console.log(updates); + const updated = await prisma.$transaction(updates); - // await createAuditLog({ - // action: 'update', - // tableName: 'setting', - // recordId: '', - // oldValue: '', - // newValue: JSON.stringify(data), - // userId: '', - // }); + const [oldValue, newValue] = extractDiffObjects(oldSetting, data); + const keyEdit = Object.keys(oldValue); + const listId = updated + .filter((s) => keyEdit.includes(s.key)) + .map((s) => s.id) + .join(', '); - return { success: true }; + await createAuditLog({ + action: 'update', + tableName: 'setting', + recordId: listId, + oldValue: JSON.stringify(oldValue), + newValue: JSON.stringify(newValue), + userId: context.user.id, + }); + + return { success: true }; + } catch (error) { + console.log(error); + throw error; + } }); // Setting for user @@ -76,10 +98,15 @@ export const getUserSettings = createServerFn({ method: 'GET' }) relation: 'user', key: context.user.id, }, + select: { + id: true, + key: true, + value: true, + }, }); return { - settings: settings as Setting, + settings, value: JSON.parse(settings.value) as UserSetting, }; } catch (error) { @@ -93,7 +120,17 @@ export const updateUserSettings = createServerFn({ method: 'POST' }) .handler(async ({ data, context }) => { // Update each setting try { - await prisma.setting.upsert({ + const oldSetting = await prisma.setting.findUnique({ + where: { + relation: 'user', + key: context.user.id, + }, + select: { + value: true, + }, + }); + + const updated = await prisma.setting.upsert({ where: { key: context.user.id }, update: { value: JSON.stringify(data) }, create: { @@ -104,14 +141,16 @@ export const updateUserSettings = createServerFn({ method: 'POST' }) }, }); - // await createAuditLog({ - // action: 'update', - // tableName: 'setting', - // recordId: '', - // oldValue: '', - // newValue: '', - // userId: '', - // }); + if (oldSetting) { + await createAuditLog({ + action: 'update', + tableName: 'setting', + recordId: updated.id, + oldValue: oldSetting.value, + newValue: JSON.stringify(data), + userId: context.user.id, + }); + } return { success: true }; } catch (error) { diff --git a/src/utils/disk-storage.ts b/src/utils/disk-storage.ts new file mode 100644 index 0000000..6ae31fc --- /dev/null +++ b/src/utils/disk-storage.ts @@ -0,0 +1,26 @@ +import fs, { writeFile } from 'fs/promises'; +import path from 'path'; + +const uploadDir = './data/avatar'; + +export async function saveFile(key: string, file: Buffer | File) { + if (!uploadDir) { + throw new Error('Upload directory not found'); + } + + const fileBuffer = + file instanceof File ? Buffer.from(await file.arrayBuffer()) : file; + + const filePath = path.join(uploadDir, key); + + try { + await fs.mkdir(uploadDir, { recursive: true }); + await writeFile(filePath, fileBuffer); + return key; + } catch (error) { + console.error(`Error saving file: ${key}`, error); + throw new Error( + `Failed to save file: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); + } +} diff --git a/src/utils/help.ts b/src/utils/help.ts index a9c5db9..7109f64 100644 --- a/src/utils/help.ts +++ b/src/utils/help.ts @@ -7,3 +7,21 @@ export function jsonSupport(jsonSTR: string) { return jsonSTR; } } + +type AnyRecord = Record; + +export function extractDiffObjects( + a: T, + b: T, +): [Partial, Partial] { + return (Object.keys(a) as (keyof T)[]).reduce( + ([accA, accB], key) => { + if (a[key] !== b[key]) { + accA[key] = a[key]; + accB[key] = b[key]; + } + return [accA, accB]; + }, + [{}, {}] as [Partial, Partial], + ); +}