diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index aff1d5b5f..ed881ff27 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -31,6 +31,7 @@ body: label: Version description: What version of Homarr are you running? options: + - 1.32.0 - 1.31.0 - 1.30.1 - 1.30.0 diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 572827714..377002605 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -6,10 +6,6 @@ matchPackagePatterns: ["^@homarr/"], enabled: false, }, - { - matchPackagePatterns: ["^zod$", "^drizzle-zod$", "^zod-form-data$"], - enabled: false, - }, { matchUpdateTypes: ["minor", "patch", "pin", "digest"], automerge: true, diff --git a/.github/workflows/automatic-approval.yml b/.github/workflows/automatic-approval.yml index 5893a5d7d..72e6aaea2 100644 --- a/.github/workflows/automatic-approval.yml +++ b/.github/workflows/automatic-approval.yml @@ -9,7 +9,7 @@ jobs: if: github.actor_id == 158783068 || github.actor_id == 190541745 || github.actor_id == 210161987 # Id of renovate bot and crowdin bot see https://api.github.com/users/homarr-renovate%5Bbot%5D and https://api.github.com/users/homarr-crowdin%5Bbot%5D and https://api.github.com/users/homarr-update-contributors%5Bbot%5D steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Obtain token id: obtainToken uses: tibdex/github-app-token@v2 diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 92efa0d03..0f504353c 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -22,7 +22,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup @@ -37,7 +37,7 @@ jobs: format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup @@ -48,7 +48,7 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup @@ -59,7 +59,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup @@ -77,7 +77,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup - name: Build docker image @@ -100,7 +100,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup uses: ./tooling/github/setup - name: Copy env diff --git a/.github/workflows/crowdin-schedule-download.yml b/.github/workflows/crowdin-schedule-download.yml index 2891536a4..f5814f120 100644 --- a/.github/workflows/crowdin-schedule-download.yml +++ b/.github/workflows/crowdin-schedule-download.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Obtain token id: obtainToken diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml index 9a9972095..6212ba64c 100644 --- a/.github/workflows/crowdin-upload.yml +++ b/.github/workflows/crowdin-upload.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Upload Crowdin translations uses: crowdin/github-action@v2 diff --git a/.github/workflows/deployment-docker-image.yml b/.github/workflows/deployment-docker-image.yml index e76f7b6e6..b5e562a13 100644 --- a/.github/workflows/deployment-docker-image.yml +++ b/.github/workflows/deployment-docker-image.yml @@ -53,7 +53,7 @@ jobs: with: private_key: ${{ secrets.RENOVATE_MERGE_PRIVATE_KEY }} app_id: ${{ secrets.RENOVATE_MERGE_APP_ID }} - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 if: env.SKIP_RELEASE == 'false' with: persist-credentials: false @@ -110,7 +110,7 @@ jobs: outputs: digest: ${{ steps.build.outputs.digest }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ needs.release.outputs.git_ref }} @@ -149,7 +149,7 @@ jobs: outputs: digest: ${{ steps.build.outputs.digest }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: ${{ needs.release.outputs.git_ref }} diff --git a/.github/workflows/deployment-weekly-release.yml b/.github/workflows/deployment-weekly-release.yml index dc5fa0a2e..a0fdcc723 100644 --- a/.github/workflows/deployment-weekly-release.yml +++ b/.github/workflows/deployment-weekly-release.yml @@ -27,7 +27,7 @@ jobs: with: args: "Automatic release has been triggered: [run ${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - name: Get Next Version diff --git a/.github/workflows/update-contributors.yml b/.github/workflows/update-contributors.yml index adfd68ad5..86f7c95d5 100644 --- a/.github/workflows/update-contributors.yml +++ b/.github/workflows/update-contributors.yml @@ -27,7 +27,7 @@ jobs: app_id: ${{ vars.HOMARR_UPDATE_CONTRIBUTORS_APP_ID }} - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} diff --git a/.github/workflows/update-integration-list.yml b/.github/workflows/update-integration-list.yml index beedfd390..dc90ce5c3 100644 --- a/.github/workflows/update-integration-list.yml +++ b/.github/workflows/update-integration-list.yml @@ -25,7 +25,7 @@ jobs: private_key: ${{ secrets.HOMARR_UPDATE_CONTRIBUTORS_PRIVATE_KEY }} app_id: ${{ vars.HOMARR_UPDATE_CONTRIBUTORS_APP_ID }} - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} - name: Setup diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index e4c7157a5..c689679eb 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -58,9 +58,9 @@ "@mantine/tiptap": "^8.2.4", "@million/lint": "1.0.14", "@tabler/icons-react": "^3.34.1", - "@tanstack/react-query": "^5.84.2", - "@tanstack/react-query-devtools": "^5.84.2", - "@tanstack/react-query-next-experimental": "^5.84.2", + "@tanstack/react-query": "^5.85.3", + "@tanstack/react-query-devtools": "^5.85.3", + "@tanstack/react-query-next-experimental": "^5.85.3", "@trpc/client": "^11.4.4", "@trpc/next": "^11.4.4", "@trpc/react-query": "^11.4.4", @@ -74,7 +74,7 @@ "dotenv": "^17.2.1", "flag-icons": "^7.5.0", "glob": "^11.0.3", - "jotai": "^2.13.0", + "jotai": "^2.13.1", "mantine-react-table": "2.0.0-beta.9", "next": "15.4.6", "postcss-preset-mantine": "^1.18.0", @@ -87,20 +87,20 @@ "superjson": "2.2.2", "swagger-ui-react": "^5.27.1", "use-deep-compare-effect": "^1.8.1", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/chroma-js": "3.1.1", - "@types/node": "^22.17.1", + "@types/node": "^22.17.2", "@types/prismjs": "^1.26.5", - "@types/react": "19.1.9", + "@types/react": "19.1.10", "@types/react-dom": "19.1.7", "@types/swagger-ui-react": "^5.18.0", "concurrently": "^9.2.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "node-loader": "^2.1.0", "prettier": "^3.6.2", "typescript": "^5.9.2" diff --git a/apps/nextjs/src/app/[locale]/auth/invite/[id]/_registration-form.tsx b/apps/nextjs/src/app/[locale]/auth/invite/[id]/_registration-form.tsx index 034001c28..f8d559ead 100644 --- a/apps/nextjs/src/app/[locale]/auth/invite/[id]/_registration-form.tsx +++ b/apps/nextjs/src/app/[locale]/auth/invite/[id]/_registration-form.tsx @@ -2,7 +2,7 @@ import { useRouter } from "next/navigation"; import { Button, PasswordInput, Stack, TextInput } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { useZodForm } from "@homarr/form"; diff --git a/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx b/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx index 8523eb043..ed86ea0f4 100644 --- a/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx +++ b/apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx @@ -5,7 +5,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Anchor, Button, Card, Code, Collapse, Divider, PasswordInput, Stack, Text, TextInput } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; -import { z } from "zod"; +import { z } from "zod/v4"; import { signIn } from "@homarr/auth/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx index 976a8848a..d423c2fce 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx @@ -2,7 +2,7 @@ import { Button, Card, Stack, TextInput } from "@mantine/core"; import { IconArrowRight } from "@tabler/icons-react"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx index f83612f1a..b5839b743 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx @@ -3,7 +3,7 @@ import { startTransition } from "react"; import { Button, Card, Group, Stack, Switch, Text } from "@mantine/core"; import { IconArrowRight } from "@tabler/icons-react"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx index 5e43cbc32..daf73f7b3 100644 --- a/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx +++ b/apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, PasswordInput, Stack, TextInput } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { signIn } from "@homarr/auth/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/_app-edit-form.tsx b/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/_app-edit-form.tsx index 2dc13dc27..0f14be6b4 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/_app-edit-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/_app-edit-form.tsx @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { useRouter } from "next/navigation"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx index b3dc291fc..761fd4495 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { redirect } from "next/navigation"; import { ActionIcon, ActionIconGroup, Anchor, Avatar, Card, Group, Stack, Text, Title } from "@mantine/core"; import { IconBox, IconPencil } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/_integration-edit-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/_integration-edit-form.tsx index 7427c7633..3b97e65f1 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/_integration-edit-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/_integration-edit-form.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Button, Fieldset, Group, Stack, TextInput } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 06c66619a..3bb768e5e 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -16,7 +16,7 @@ import { TextInput, } from "@mantine/core"; import { IconInfoCircle } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx index deb544491..1938a569e 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx @@ -1,6 +1,6 @@ import { notFound } from "next/navigation"; import { Container, Group, Stack, Title } from "@mantine/core"; -import { z } from "zod"; +import { z } from "zod/v4"; import { auth } from "@homarr/auth/next"; import type { IntegrationKind } from "@homarr/definitions"; diff --git a/apps/nextjs/src/app/[locale]/manage/medias/page.tsx b/apps/nextjs/src/app/[locale]/manage/medias/page.tsx index 569168cab..9bdbf22c7 100644 --- a/apps/nextjs/src/app/[locale]/manage/medias/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/medias/page.tsx @@ -16,7 +16,7 @@ import { Tooltip, } from "@mantine/core"; import { IconExternalLink } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx index e34f78dc5..c41b653ed 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx @@ -4,7 +4,7 @@ import Link from "next/link"; import type { SegmentedControlItem } from "@mantine/core"; import { Button, Fieldset, Grid, Group, SegmentedControl, Stack, Textarea, TextInput } from "@mantine/core"; import { WidgetIntegrationSelect } from "node_modules/@homarr/widgets/src/widget-integration-select"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { searchEngineTypes } from "@homarr/definitions"; diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/_search-engine-edit-form.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/_search-engine-edit-form.tsx index dbd2b949d..419a9b40a 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/_search-engine-edit-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/_search-engine-edit-form.tsx @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { useRouter } from "next/navigation"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/new/_search-engine-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/new/_search-engine-new-form.tsx index 5bd5a6ae1..a8ff77056 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/new/_search-engine-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/new/_search-engine-new-form.tsx @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { useRouter } from "next/navigation"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx b/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx index 7634d78be..a3faa2811 100644 --- a/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/search-engines/page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import { redirect } from "next/navigation"; import { ActionIcon, ActionIconGroup, Anchor, Avatar, Card, Group, Stack, Text, Title } from "@mantine/core"; import { IconPencil, IconSearch } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; diff --git a/apps/nextjs/src/app/[locale]/manage/tools/tasks/_components/jobs-list.tsx b/apps/nextjs/src/app/[locale]/manage/tools/tasks/_components/jobs-list.tsx deleted file mode 100644 index 763550829..000000000 --- a/apps/nextjs/src/app/[locale]/manage/tools/tasks/_components/jobs-list.tsx +++ /dev/null @@ -1,284 +0,0 @@ -"use client"; - -import React, { useState, useTransition } from "react"; -import { ActionIcon, Badge, Button, Card, Group, Select, Stack, Text } from "@mantine/core"; -import { useMap } from "@mantine/hooks"; -import { IconPlayerPlay, IconPower, IconSettings } from "@tabler/icons-react"; - -import type { RouterOutputs } from "@homarr/api"; -import { clientApi } from "@homarr/api/client"; -import { getMantineColor, useTimeAgo } from "@homarr/common"; -import type { TaskStatus } from "@homarr/cron-job-status"; -import { useForm } from "@homarr/form"; -import { createModal, useModalAction } from "@homarr/modals"; -import { TranslationFunction } from "@homarr/translation"; -import { useI18n, useScopedI18n } from "@homarr/translation/client"; -import { IconPowerOff } from "@homarr/ui/icons"; - -interface JobsListProps { - initialJobs: RouterOutputs["cronJobs"]["getJobs"]; -} - -type JobName = RouterOutputs["cronJobs"]["getJobs"][number]["name"]; - -export const JobsList = ({ initialJobs }: JobsListProps) => { - const [jobs] = clientApi.cronJobs.getJobs.useSuspenseQuery(undefined, { - initialData: initialJobs, - refetchOnMount: false, - }); - - const jobStatusMap = useMap(initialJobs.map(({ name }) => [name, null] as const)); - - clientApi.cronJobs.subscribeToStatusUpdates.useSubscription(undefined, { - onData: (data) => { - jobStatusMap.set(data.name, data); - }, - }); - - return ( - - {jobs.map((job) => { - const status = jobStatusMap.get(job.name); - - return ; - })} - - ); -}; - -const cronExpressions = [ - { - value: "*/5 * * * * *", - label: (t) => t("management.page.tool.tasks.interval.seconds", { interval: 5 }), - }, - { - value: "*/10 * * * * *", - label: (t) => t("management.page.tool.tasks.interval.seconds", { interval: 10 }), - }, - { - value: "*/20 * * * * *", - label: (t) => t("management.page.tool.tasks.interval.seconds", { interval: 20 }), - }, - { - value: "* * * * *", - label: (t) => t("management.page.tool.tasks.interval.minutes", { interval: 1 }), - }, - { - value: "*/5 * * * *", - label: (t) => t("management.page.tool.tasks.interval.minutes", { interval: 5 }), - }, - { - value: "*/10 * * * *", - label: (t) => t("management.page.tool.tasks.interval.minutes", { interval: 10 }), - }, - { - value: "*/15 * * * *", - label: (t) => t("management.page.tool.tasks.interval.minutes", { interval: 15 }), - }, - { - value: "0 * * * *", - label: (t) => t("management.page.tool.tasks.interval.hours", { interval: 1 }), - }, - { - value: "0 0 * * */1", - label: (t) => t("management.page.tool.tasks.interval.midnight"), - }, - { - value: "0 0 * * 1", - label: (t) => t("management.page.tool.tasks.interval.weeklyMonday"), - }, -] satisfies { value: string; label: (t: TranslationFunction) => string }[]; - -interface JobCardProps { - job: RouterOutputs["cronJobs"]["getJobs"][number]; - status: TaskStatus | null; -} - -const JobCard = ({ job, status }: JobCardProps) => { - const t = useI18n(); - const tTasks = useScopedI18n("management.page.tool.tasks"); - const triggerMutation = clientApi.cronJobs.triggerJob.useMutation(); - const handleJobTrigger = React.useCallback( - async (name: JobName) => { - if (status?.status === "running") return; - await triggerMutation.mutateAsync(name); - }, - [triggerMutation, status], - ); - - const { openModal } = useModalAction(TaskConfigurationModal); - const [isEnabled, setEnabled] = useState(job.isEnabled); - const disableMutation = clientApi.cronJobs.disableJob.useMutation(); - const enableMutation = clientApi.cronJobs.enableJob.useMutation(); - - const [activeStatePending, startActiveTransition] = useTransition(); - const handleActiveChange = () => - startActiveTransition(async () => { - if (isEnabled) { - await disableMutation.mutateAsync(job.name, { - onSuccess() { - setEnabled(false); - }, - }); - } else { - await enableMutation.mutateAsync(job.name, { - onSuccess() { - setEnabled(true); - }, - }); - } - }); - - return ( - - - - - {tTasks(`job.${job.name}.label`)} - - {status?.lastExecutionStatus === "error" && {tTasks("status.error")}} - - - {status && ( - <> - - - • - - - {cronExpressions.find((expression) => expression.value === job.cron)?.label(t) ?? job.cron} - - - )} - - - - - {!job.preventManualExecution && ( - handleJobTrigger(job.name)} - disabled={status?.status === "running"} - loading={triggerMutation.isPending} - variant="default" - size="xl" - radius="xl" - > - - - )} - - {isEnabled ? ( - - ) : ( - - )} - - - openModal( - { job }, - { - title: tTasks("settings.title", { - jobName: tTasks(`job.${job.name}.label`), - }), - }, - ) - } - variant={"default"} - size={"xl"} - radius={"xl"} - > - - - - - - ); -}; - -interface StatusBadgeProps { - isEnabled: boolean; - status: TaskStatus | null; -} - -const StatusBadge = ({ isEnabled, status }: StatusBadgeProps) => { - const t = useScopedI18n("management.page.tool.tasks"); - if (!isEnabled) return {t("status.disabled")}; - - if (!status) return null; - - if (status.status === "running") return {t("status.running")}; - return {t("status.idle")}; -}; - -const TimeAgo = ({ timestamp }: { timestamp: string }) => { - const timeAgo = useTimeAgo(new Date(timestamp)); - - return ( - - {timeAgo} - - ); -}; - -const TaskConfigurationModal = createModal<{ - job: RouterOutputs["cronJobs"]["getJobs"][number]; -}>(({ actions, innerProps }) => { - const t = useI18n(); - const form = useForm({ - initialValues: { - cron: innerProps.job.cron, - }, - }); - const { mutateAsync, isPending } = clientApi.cronJobs.updateJobInterval.useMutation(); - const utils = clientApi.useUtils(); - - return ( -
{ - utils.cronJobs.getJobs.setData(undefined, (data) => - data?.map((job) => - job.name === innerProps.job.name - ? { - ...job, - cron: values.cron, - } - : job, - ), - ); - await mutateAsync( - { - name: innerProps.job.name, - cron: values.cron, - }, - { - onSuccess() { - actions.closeModal(); - }, - async onSettled() { - await utils.cronJobs.getJobs.invalidate(); - }, - }, - ); - })} - > - - ({ + value, + label: label(t), + }))} + size="sm" + disabled={loadingStates.get(row.original.name)?.interval ?? false} + style={{ minWidth: 180 }} + /> + ); + }, + }, + { + accessorKey: "lastExecutionTime", + header: tTasks("field.lastExecution.label"), + size: 150, + Cell({ row }) { + const status = jobStatusMap.get(row.original.name); + if (!status?.lastExecutionTimestamp) { + return ( + + — + + ); + } + return ; + }, + }, + { + id: "actions", + header: tTasks("field.actions.label"), + size: 120, + enableSorting: false, + Cell({ row }) { + const status = jobStatusMap.get(row.original.name); + + const handleToggleEnabled = () => { + const currentStates = loadingStates.get(row.original.name) ?? { + toggle: false, + trigger: false, + interval: false, + }; + loadingStates.set(row.original.name, { + ...currentStates, + toggle: true, + }); + try { + if (row.original.isEnabled) { + disableMutation.mutate(row.original.name); + } else { + enableMutation.mutate(row.original.name); + } + } finally { + const updatedStates = loadingStates.get(row.original.name) ?? { + toggle: false, + trigger: false, + interval: false, + }; + loadingStates.set(row.original.name, { + ...updatedStates, + toggle: false, + }); + } + }; + + const handleTrigger = () => { + if (status?.status === "running") return; + + const currentStates = loadingStates.get(row.original.name) ?? { + toggle: false, + trigger: false, + interval: false, + }; + loadingStates.set(row.original.name, { + ...currentStates, + trigger: true, + }); + try { + triggerMutation.mutate(row.original.name); + } finally { + const updatedStates = loadingStates.get(row.original.name) ?? { + toggle: false, + trigger: false, + interval: false, + }; + loadingStates.set(row.original.name, { + ...updatedStates, + trigger: false, + }); + } + }; + + return ( + + {!row.original.preventManualExecution && ( + + + + )} + + {row.original.isEnabled ? : } + + + ); + }, + }, +]; + +interface TasksTableProps { + initialJobs: RouterOutputs["cronJobs"]["getJobs"]; +} + +export const TasksTable = ({ initialJobs }: TasksTableProps) => { + const t = useI18n(); + const tTasks = useScopedI18n("management.page.tool.tasks"); + + const { data: jobs } = clientApi.cronJobs.getJobs.useQuery(undefined, { + initialData: initialJobs, + refetchOnMount: false, + }); + + const jobStatusMap = useMap(initialJobs.map(({ name }) => [name, null] as const)); + + const loadingStates = useMap(); + + clientApi.cronJobs.subscribeToStatusUpdates.useSubscription(undefined, { + onData: (data) => { + jobStatusMap.set(data.name, data); + }, + }); + + const triggerMutation = clientApi.cronJobs.triggerJob.useMutation({ + onError() { + showErrorNotification({ + title: t("common.error"), + message: tTasks("trigger.error.message"), + }); + }, + onSuccess() { + showSuccessNotification({ + title: t("common.success"), + message: tTasks("trigger.success.message"), + }); + }, + }); + const updateIntervalMutation = clientApi.cronJobs.updateJobInterval.useMutation({ + onError() { + showErrorNotification({ + title: t("common.error"), + message: tTasks("interval.update.error.message"), + }); + }, + onSuccess: async () => { + await utils.cronJobs.getJobs.invalidate(); + showSuccessNotification({ + title: t("common.success"), + message: tTasks("interval.update.success.message"), + }); + }, + }); + const enableMutation = clientApi.cronJobs.enableJob.useMutation({ + onError() { + showErrorNotification({ + title: t("common.error"), + message: tTasks("toggle.error.message"), + }); + }, + onSuccess: async () => { + await utils.cronJobs.getJobs.invalidate(); + showSuccessNotification({ + title: t("common.success"), + message: tTasks("enable.success.message"), + }); + }, + }); + const disableMutation = clientApi.cronJobs.disableJob.useMutation({ + onError() { + showErrorNotification({ + title: t("common.error"), + message: tTasks("toggle.error.message"), + }); + }, + onSuccess: async () => { + await utils.cronJobs.getJobs.invalidate(); + showSuccessNotification({ + title: t("common.success"), + message: tTasks("disable.success.message"), + }); + }, + }); + + // Utils for refresh functionality + const utils = clientApi.useUtils(); + const handleRefreshAsync = async () => { + try { + await utils.cronJobs.getJobs.invalidate(); + showSuccessNotification({ + title: t("common.success"), + message: tTasks("refresh.success.message"), + }); + } catch { + showErrorNotification({ + title: t("common.error"), + message: tTasks("refresh.error.message"), + }); + } + }; + + const table = useTranslatedMantineReactTable({ + data: jobs, + enableDensityToggle: false, + enableColumnActions: false, + enableColumnFilters: false, + enablePagination: false, + enableRowSelection: false, + enableTableFooter: false, + enableBottomToolbar: false, + enableRowActions: false, + enableColumnOrdering: false, + enableSorting: false, + enableSortingRemoval: false, + positionGlobalFilter: "right", + mantineSearchTextInputProps: { + placeholder: tTasks("table.search", { count: String(jobs.length) }), + style: { minWidth: 300 }, + }, + initialState: { density: "xs", showGlobalFilter: true }, + renderTopToolbarCustomActions: () => ( + + ), + columns: createColumns( + t, + tTasks, + jobStatusMap, + triggerMutation, + updateIntervalMutation, + enableMutation, + disableMutation, + loadingStates, + ), + }); + + return ; +}; + +interface StatusBadgeProps { + isEnabled: boolean; + status: TaskStatus | null; +} + +const StatusBadge = ({ isEnabled, status }: StatusBadgeProps) => { + const tTasks = useScopedI18n("management.page.tool.tasks"); + + if (!isEnabled) { + return ( + + {tTasks("status.disabled")} + + ); + } + + if (!status) return null; + + if (status.status === "running") { + return ( + + {tTasks("status.running")} + + ); + } + + return ( + + {tTasks("status.idle")} + + ); +}; + +const TimeAgo = ({ timestamp }: { timestamp: string }) => { + const timeAgo = useTimeAgo(new Date(timestamp)); + + return ( + + {timeAgo} + + ); +}; diff --git a/apps/nextjs/src/app/[locale]/manage/tools/tasks/page.tsx b/apps/nextjs/src/app/[locale]/manage/tools/tasks/page.tsx index 94def6599..d3977bb5d 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/tasks/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/tasks/page.tsx @@ -1,12 +1,13 @@ import { notFound } from "next/navigation"; -import { Box, Title } from "@mantine/core"; +import { Stack, Title } from "@mantine/core"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; import { getScopedI18n } from "@homarr/translation/server"; +import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; import { createMetaTitle } from "~/metadata"; -import { JobsList } from "./_components/jobs-list"; +import { TasksTable } from "./_components/tasks-table"; export async function generateMetadata() { const session = await auth(); @@ -27,10 +28,15 @@ export default async function TasksPage() { } const jobs = await api.cronJobs.getJobs(); + const tTasks = await getScopedI18n("management.page.tool.tasks"); + return ( - - Tasks - - + <> + + + {tTasks("title")} + + + ); } diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx index 52854e744..bdad9cfea 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, Group, Stack } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx index 739f6da2b..5bf23a5fb 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, Group, Select, Stack, Switch } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_first-day-of-week.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_first-day-of-week.tsx index 5492023ee..e2b1a859d 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_first-day-of-week.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_first-day-of-week.tsx @@ -4,7 +4,7 @@ import { Button, Group, Radio, Stack } from "@mantine/core"; import type { DayOfWeek } from "@mantine/dates"; import dayjs from "dayjs"; import localeData from "dayjs/plugin/localeData"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx index 5ddcc09f0..d218ac39a 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, Group, Stack, Switch } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx b/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx index 97eeb9ff0..dc4f1a7c3 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/create/_components/create-user-stepper.tsx @@ -17,7 +17,7 @@ import { } from "@mantine/core"; import { useListState } from "@mantine/hooks"; import { IconPlus, IconUserCheck } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { everyoneGroup, groupPermissions } from "@homarr/definitions"; diff --git a/apps/nextjs/src/components/board/items/item-move-modal.tsx b/apps/nextjs/src/components/board/items/item-move-modal.tsx index 7257fcb49..c1e03ba7c 100644 --- a/apps/nextjs/src/components/board/items/item-move-modal.tsx +++ b/apps/nextjs/src/components/board/items/item-move-modal.tsx @@ -1,6 +1,6 @@ import { useCallback, useRef } from "react"; import { Button, Grid, Group, NumberInput, Stack } from "@mantine/core"; -import { z } from "zod"; +import { z } from "zod/v4"; import { useZodForm } from "@homarr/form"; import type { GridStack } from "@homarr/gridstack"; diff --git a/apps/nextjs/src/components/board/modals/board-rename-modal.tsx b/apps/nextjs/src/components/board/modals/board-rename-modal.tsx index c2f2e08e0..69dd12543 100644 --- a/apps/nextjs/src/components/board/modals/board-rename-modal.tsx +++ b/apps/nextjs/src/components/board/modals/board-rename-modal.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, Group, Stack, TextInput } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { useZodForm } from "@homarr/form"; diff --git a/apps/nextjs/src/components/board/sections/category/category-edit-modal.tsx b/apps/nextjs/src/components/board/sections/category/category-edit-modal.tsx index 55e4780e9..1f990eec0 100644 --- a/apps/nextjs/src/components/board/sections/category/category-edit-modal.tsx +++ b/apps/nextjs/src/components/board/sections/category/category-edit-modal.tsx @@ -1,5 +1,5 @@ import { Button, Group, Stack, TextInput } from "@mantine/core"; -import { z } from "zod"; +import { z } from "zod/v4"; import { useZodForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; diff --git a/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts b/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts index 553172905..230e28334 100644 --- a/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts +++ b/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts @@ -1,5 +1,5 @@ import { useCallback } from "react"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { useUpdateBoard } from "@homarr/boards/updater"; import type { dynamicSectionOptionsSchema } from "@homarr/validation/shared"; diff --git a/apps/nextjs/src/components/board/sections/dynamic/dynamic-edit-modal.tsx b/apps/nextjs/src/components/board/sections/dynamic/dynamic-edit-modal.tsx index e01052b36..b15c700a9 100644 --- a/apps/nextjs/src/components/board/sections/dynamic/dynamic-edit-modal.tsx +++ b/apps/nextjs/src/components/board/sections/dynamic/dynamic-edit-modal.tsx @@ -1,7 +1,7 @@ "use client"; import { Button, CloseButton, ColorInput, Group, Stack, TextInput, useMantineTheme } from "@mantine/core"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { useZodForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; diff --git a/apps/tasks/package.json b/apps/tasks/package.json index 758193c30..2b83e824c 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -37,7 +37,7 @@ "@homarr/widgets": "workspace:^0.1.0", "dayjs": "^1.11.13", "dotenv": "^17.2.1", - "fastify": "^5.4.0", + "fastify": "^5.5.0", "superjson": "2.2.2", "undici": "7.13.0" }, @@ -45,12 +45,12 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node": "^22.17.1", + "@types/node": "^22.17.2", "dotenv-cli": "^10.0.0", - "esbuild": "^0.25.8", - "eslint": "^9.32.0", + "esbuild": "^0.25.9", + "eslint": "^9.33.0", "prettier": "^3.6.2", - "tsx": "4.20.3", + "tsx": "4.20.4", "typescript": "^5.9.2" } } diff --git a/apps/websocket/package.json b/apps/websocket/package.json index 5539c318c..50770caba 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -26,7 +26,7 @@ "@homarr/redis": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "dotenv": "^17.2.1", - "tsx": "4.20.3", + "tsx": "4.20.4", "ws": "^8.18.3" }, "devDependencies": { @@ -34,8 +34,8 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/ws": "^8.18.1", - "esbuild": "^0.25.8", - "eslint": "^9.32.0", + "esbuild": "^0.25.9", + "eslint": "^9.33.0", "prettier": "^3.6.2", "typescript": "^5.9.2" } diff --git a/package.json b/package.json index ba65f6883..6161c7230 100644 --- a/package.json +++ b/package.json @@ -36,12 +36,12 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/git": "^10.0.1", - "@semantic-release/github": "^11.0.3", + "@semantic-release/github": "^11.0.4", "@semantic-release/npm": "^12.0.2", "@semantic-release/release-notes-generator": "^14.0.3", "@testcontainers/redis": "^11.5.1", - "@turbo/gen": "^2.5.5", - "@vitejs/plugin-react": "^4.7.0", + "@turbo/gen": "^2.5.6", + "@vitejs/plugin-react": "^5.0.0", "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", "conventional-changelog-conventionalcommits": "^9.1.0", @@ -50,7 +50,7 @@ "prettier": "^3.6.2", "semantic-release": "^24.2.7", "testcontainers": "^11.5.1", - "turbo": "^2.5.5", + "turbo": "^2.5.6", "typescript": "^5.9.2", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4" @@ -74,14 +74,14 @@ "overrides": { "proxmox-api>undici": "7.13.0" }, + "patchedDependencies": { + "@types/node-unifi": "patches/@types__node-unifi.patch" + }, "allowUnusedPatches": true, "ignoredBuiltDependencies": [ "@scarf/scarf", "core-js-pure", "protobufjs" - ], - "patchedDependencies": { - "@types/node-unifi": "patches/@types__node-unifi.patch" - } + ] } } diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 98a1437e9..56a70af9e 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -32,7 +32,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/api/package.json b/packages/api/package.json index 7f7d90bc4..419622ea8 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,6 +24,7 @@ "@homarr/auth": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", + "@homarr/core": "workspace:^0.1.0", "@homarr/cron-job-api": "workspace:^0.1.0", "@homarr/cron-job-status": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", @@ -41,7 +42,7 @@ "@homarr/server-settings": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@kubernetes/client-node": "^1.3.0", - "@tanstack/react-query": "^5.84.2", + "@tanstack/react-query": "^5.85.3", "@trpc/client": "^11.4.4", "@trpc/react-query": "^11.4.4", "@trpc/server": "^11.4.4", @@ -51,14 +52,14 @@ "react": "19.1.1", "react-dom": "19.1.1", "superjson": "2.2.2", - "trpc-to-openapi": "^2.4.0", - "zod": "^3.25.76" + "trpc-to-openapi": "^3.0.0", + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "prettier": "^3.6.2", "typescript": "^5.9.2" } diff --git a/packages/api/src/env.ts b/packages/api/src/env.ts index 61512165d..7cc81cc57 100644 --- a/packages/api/src/env.ts +++ b/packages/api/src/env.ts @@ -1,7 +1,6 @@ -import { createEnv } from "@t3-oss/env-nextjs"; -import { z } from "zod"; +import { z } from "zod/v4"; -import { shouldSkipEnvValidation } from "@homarr/common/env-validation"; +import { createEnv } from "@homarr/core/infrastructure/env"; export const env = createEnv({ server: { @@ -10,6 +9,4 @@ export const env = createEnv({ runtimeEnv: { KUBERNETES_SERVICE_ACCOUNT_NAME: process.env.KUBERNETES_SERVICE_ACCOUNT_NAME, }, - skipValidation: shouldSkipEnvValidation(), - emptyStringAsUndefined: true, }); diff --git a/packages/api/src/middlewares/integration.ts b/packages/api/src/middlewares/integration.ts index 07f1f9407..3e58553c8 100644 --- a/packages/api/src/middlewares/integration.ts +++ b/packages/api/src/middlewares/integration.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Session } from "@homarr/auth"; import { hasQueryAccessToIntegrationsAsync } from "@homarr/auth/server"; diff --git a/packages/api/src/middlewares/item.ts b/packages/api/src/middlewares/item.ts index 173d6000f..375e21607 100644 --- a/packages/api/src/middlewares/item.ts +++ b/packages/api/src/middlewares/item.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { and, eq } from "@homarr/db"; import { items } from "@homarr/db/schema"; diff --git a/packages/api/src/router/apiKeys.ts b/packages/api/src/router/apiKeys.ts index 86a820c31..cdf8b5bea 100644 --- a/packages/api/src/router/apiKeys.ts +++ b/packages/api/src/router/apiKeys.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { createSaltAsync, hashPasswordAsync } from "@homarr/auth"; import { createId } from "@homarr/common"; diff --git a/packages/api/src/router/app.ts b/packages/api/src/router/app.ts index 3f832689e..4fda819a4 100644 --- a/packages/api/src/router/app.ts +++ b/packages/api/src/router/app.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId } from "@homarr/common"; import { asc, eq, inArray, like } from "@homarr/db"; diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index 3891a62cf..8d118018b 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -1,6 +1,6 @@ import { TRPCError } from "@trpc/server"; import superjson from "superjson"; -import { z } from "zod"; +import { z } from "zod/v4"; import { constructBoardPermissions } from "@homarr/auth/shared"; import { createId } from "@homarr/common"; @@ -1623,7 +1623,7 @@ const getFullBoardWithWhereAsync = async (db: Database, where: SQL, use const forKind = (kind: T) => z.object({ kind: z.literal(kind), - options: z.record(z.unknown()), + options: z.record(z.string(), z.unknown()), }); const outputItemSchema = zodUnionFromArray(widgetKinds.map((kind) => forKind(kind))).and(sharedItemSchema); diff --git a/packages/api/src/router/certificates/certificate-router.ts b/packages/api/src/router/certificates/certificate-router.ts index f69076f35..4c7cfc862 100644 --- a/packages/api/src/router/certificates/certificate-router.ts +++ b/packages/api/src/router/certificates/certificate-router.ts @@ -1,13 +1,13 @@ import { X509Certificate } from "node:crypto"; import { TRPCError } from "@trpc/server"; -import { z } from "zod"; import { zfd } from "zod-form-data"; +import { z } from "zod/v4"; import { addCustomRootCertificateAsync, removeCustomRootCertificateAsync } from "@homarr/certificates/server"; import { and, eq } from "@homarr/db"; import { trustedCertificateHostnames } from "@homarr/db/schema"; import { logger } from "@homarr/log"; -import { certificateValidFileNameSchema, superRefineCertificateFile } from "@homarr/validation/certificates"; +import { certificateValidFileNameSchema, checkCertificateFile } from "@homarr/validation/certificates"; import { createTRPCRouter, permissionRequiredProcedure } from "../../trpc"; @@ -16,7 +16,7 @@ export const certificateRouter = createTRPCRouter({ .requiresPermission("admin") .input( zfd.formData({ - file: zfd.file().superRefine(superRefineCertificateFile), + file: zfd.file().check(checkCertificateFile), }), ) .mutation(async ({ input }) => { diff --git a/packages/api/src/router/docker/docker-router.ts b/packages/api/src/router/docker/docker-router.ts index abbcebe22..6a0ea49a0 100644 --- a/packages/api/src/router/docker/docker-router.ts +++ b/packages/api/src/router/docker/docker-router.ts @@ -1,6 +1,6 @@ import { TRPCError } from "@trpc/server"; import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Container, ContainerState, Docker, Port } from "@homarr/docker"; import { DockerSingleton } from "@homarr/docker"; diff --git a/packages/api/src/router/group.ts b/packages/api/src/router/group.ts index e717fca6f..13fb4fdd3 100644 --- a/packages/api/src/router/group.ts +++ b/packages/api/src/router/group.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId } from "@homarr/common"; import type { Database } from "@homarr/db"; diff --git a/packages/api/src/router/import/import-router.ts b/packages/api/src/router/import/import-router.ts index 4ffc5ca1a..96c5fd039 100644 --- a/packages/api/src/router/import/import-router.ts +++ b/packages/api/src/router/import/import-router.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { analyseOldmarrImportForRouterAsync, analyseOldmarrImportInputSchema } from "@homarr/old-import/analyse"; import { diff --git a/packages/api/src/router/info.ts b/packages/api/src/router/info.ts index cedf7a435..3c205963c 100644 --- a/packages/api/src/router/info.ts +++ b/packages/api/src/router/info.ts @@ -1,4 +1,4 @@ -import z from "zod"; +import z from "zod/v4"; import packageJson from "../../../../package.json"; import { createTRPCRouter, protectedProcedure } from "../trpc"; diff --git a/packages/api/src/router/integration/integration-router.ts b/packages/api/src/router/integration/integration-router.ts index 9cfc7cdb1..4546eeb16 100644 --- a/packages/api/src/router/integration/integration-router.ts +++ b/packages/api/src/router/integration/integration-router.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId, objectEntries } from "@homarr/common"; import { decryptSecret, encryptSecret } from "@homarr/common/server"; diff --git a/packages/api/src/router/invite.ts b/packages/api/src/router/invite.ts index a88e7fb10..1b767748d 100644 --- a/packages/api/src/router/invite.ts +++ b/packages/api/src/router/invite.ts @@ -1,6 +1,6 @@ import { randomBytes } from "crypto"; import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId } from "@homarr/common"; import { asc, eq } from "@homarr/db"; diff --git a/packages/api/src/router/location.ts b/packages/api/src/router/location.ts index 5ecae7db6..7379078ed 100644 --- a/packages/api/src/router/location.ts +++ b/packages/api/src/router/location.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTimeout } from "@homarr/common"; diff --git a/packages/api/src/router/log.ts b/packages/api/src/router/log.ts index 8377972ea..315f51de4 100644 --- a/packages/api/src/router/log.ts +++ b/packages/api/src/router/log.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import z from "zod"; +import z from "zod/v4"; import { logger } from "@homarr/log"; import { logLevels } from "@homarr/log/constants"; diff --git a/packages/api/src/router/medias/media-router.ts b/packages/api/src/router/medias/media-router.ts index 47823b312..ee7cfe3c4 100644 --- a/packages/api/src/router/medias/media-router.ts +++ b/packages/api/src/router/medias/media-router.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId } from "@homarr/common"; import type { InferInsertModel } from "@homarr/db"; diff --git a/packages/api/src/router/onboard/onboard-router.ts b/packages/api/src/router/onboard/onboard-router.ts index b68fbd44f..14909b5b3 100644 --- a/packages/api/src/router/onboard/onboard-router.ts +++ b/packages/api/src/router/onboard/onboard-router.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { onboarding } from "@homarr/db/schema"; import { onboardingSteps } from "@homarr/definitions"; diff --git a/packages/api/src/router/search-engine/search-engine-router.ts b/packages/api/src/router/search-engine/search-engine-router.ts index 2a330c103..6e983d38e 100644 --- a/packages/api/src/router/search-engine/search-engine-router.ts +++ b/packages/api/src/router/search-engine/search-engine-router.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId } from "@homarr/common"; import { asc, eq, like } from "@homarr/db"; diff --git a/packages/api/src/router/section/section-router.ts b/packages/api/src/router/section/section-router.ts index c903efde2..81613f581 100644 --- a/packages/api/src/router/section/section-router.ts +++ b/packages/api/src/router/section/section-router.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { and, eq } from "@homarr/db"; import { sectionCollapseStates, sections } from "@homarr/db/schema"; diff --git a/packages/api/src/router/serverSettings.ts b/packages/api/src/router/serverSettings.ts index c7035aa1f..3a31a51b0 100644 --- a/packages/api/src/router/serverSettings.ts +++ b/packages/api/src/router/serverSettings.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { getServerSettingByKeyAsync, getServerSettingsAsync, updateServerSettingByKeyAsync } from "@homarr/db/queries"; import type { ServerSettings } from "@homarr/server-settings"; diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index 7cbe40a82..8ee07b62e 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createSaltAsync, hashPasswordAsync } from "@homarr/auth"; import { createId } from "@homarr/common"; diff --git a/packages/api/src/router/user/change-search-preferences.ts b/packages/api/src/router/user/change-search-preferences.ts index 927418331..7f2793b9e 100644 --- a/packages/api/src/router/user/change-search-preferences.ts +++ b/packages/api/src/router/user/change-search-preferences.ts @@ -1,5 +1,5 @@ import { TRPCError } from "@trpc/server"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Session } from "@homarr/auth"; import type { Modify } from "@homarr/common/types"; diff --git a/packages/api/src/router/widgets/app.ts b/packages/api/src/router/widgets/app.ts index fa2ed05b4..7a65225a6 100644 --- a/packages/api/src/router/widgets/app.ts +++ b/packages/api/src/router/widgets/app.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import { sendPingRequestAsync } from "@homarr/ping"; import { pingChannel, pingUrlChannel } from "@homarr/redis"; diff --git a/packages/api/src/router/widgets/calendar.ts b/packages/api/src/router/widgets/calendar.ts index a4a7b993a..871ec6239 100644 --- a/packages/api/src/router/widgets/calendar.ts +++ b/packages/api/src/router/widgets/calendar.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { radarrReleaseTypes } from "@homarr/integrations/types"; diff --git a/packages/api/src/router/widgets/dns-hole.ts b/packages/api/src/router/widgets/dns-hole.ts index 2fa585a31..46b868435 100644 --- a/packages/api/src/router/widgets/dns-hole.ts +++ b/packages/api/src/router/widgets/dns-hole.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Modify } from "@homarr/common/types"; import type { Integration } from "@homarr/db/schema"; diff --git a/packages/api/src/router/widgets/downloads.ts b/packages/api/src/router/widgets/downloads.ts index 4a3b0dab5..f5ed6fdb9 100644 --- a/packages/api/src/router/widgets/downloads.ts +++ b/packages/api/src/router/widgets/downloads.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Modify } from "@homarr/common/types"; import type { Integration } from "@homarr/db/schema"; diff --git a/packages/api/src/router/widgets/media-requests.ts b/packages/api/src/router/widgets/media-requests.ts index 69fe09fce..d13854e88 100644 --- a/packages/api/src/router/widgets/media-requests.ts +++ b/packages/api/src/router/widgets/media-requests.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { createIntegrationAsync } from "@homarr/integrations"; diff --git a/packages/api/src/router/widgets/media-server.ts b/packages/api/src/router/widgets/media-server.ts index 9ab3025c3..0e497c8ff 100644 --- a/packages/api/src/router/widgets/media-server.ts +++ b/packages/api/src/router/widgets/media-server.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import type { StreamSession } from "@homarr/integrations"; diff --git a/packages/api/src/router/widgets/minecraft.ts b/packages/api/src/router/widgets/minecraft.ts index ab1d4c7fb..7f646c3bc 100644 --- a/packages/api/src/router/widgets/minecraft.ts +++ b/packages/api/src/router/widgets/minecraft.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { MinecraftServerStatus } from "@homarr/request-handler/minecraft-server-status"; import { minecraftServerStatusRequestHandler } from "@homarr/request-handler/minecraft-server-status"; diff --git a/packages/api/src/router/widgets/notebook.ts b/packages/api/src/router/widgets/notebook.ts index 86bf61e3a..2f7229601 100644 --- a/packages/api/src/router/widgets/notebook.ts +++ b/packages/api/src/router/widgets/notebook.ts @@ -1,6 +1,6 @@ import { TRPCError } from "@trpc/server"; import SuperJSON from "superjson"; -import { z } from "zod"; +import { z } from "zod/v4"; import { eq } from "@homarr/db"; import { boards, items } from "@homarr/db/schema"; diff --git a/packages/api/src/router/widgets/releases.ts b/packages/api/src/router/widgets/releases.ts index 6402586c6..1cd1a4f89 100644 --- a/packages/api/src/router/widgets/releases.ts +++ b/packages/api/src/router/widgets/releases.ts @@ -1,5 +1,5 @@ import { escapeForRegEx } from "@tiptap/react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { releasesRequestHandler } from "@homarr/request-handler/releases"; diff --git a/packages/api/src/router/widgets/rssFeed.ts b/packages/api/src/router/widgets/rssFeed.ts index 415319318..b66662c2e 100644 --- a/packages/api/src/router/widgets/rssFeed.ts +++ b/packages/api/src/router/widgets/rssFeed.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { rssFeedsRequestHandler } from "@homarr/request-handler/rss-feeds"; diff --git a/packages/api/src/router/widgets/smart-home.ts b/packages/api/src/router/widgets/smart-home.ts index 65b44535b..2dc9add89 100644 --- a/packages/api/src/router/widgets/smart-home.ts +++ b/packages/api/src/router/widgets/smart-home.ts @@ -1,5 +1,5 @@ import { observable } from "@trpc/server/observable"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { createIntegrationAsync } from "@homarr/integrations"; diff --git a/packages/api/src/router/widgets/stocks.ts b/packages/api/src/router/widgets/stocks.ts index f9b583570..d7b4ed13a 100644 --- a/packages/api/src/router/widgets/stocks.ts +++ b/packages/api/src/router/widgets/stocks.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchStockPriceHandler } from "@homarr/request-handler/stock-price"; diff --git a/packages/api/src/router/widgets/weather.ts b/packages/api/src/router/widgets/weather.ts index 94555c666..35a1b1b63 100644 --- a/packages/api/src/router/widgets/weather.ts +++ b/packages/api/src/router/widgets/weather.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTimeout } from "@homarr/common"; diff --git a/packages/api/src/schema-merger.ts b/packages/api/src/schema-merger.ts index eae12cf89..1385bf656 100644 --- a/packages/api/src/schema-merger.ts +++ b/packages/api/src/schema-merger.ts @@ -1,21 +1,20 @@ -import { z } from "zod"; -import type { AnyZodObject, ZodIntersection, ZodObject } from "zod"; +import { z } from "zod/v4"; +import type { ZodIntersection, ZodObject } from "zod/v4"; -export function convertIntersectionToZodObject>( +export function convertIntersectionToZodObject>( intersection: TIntersection, ) { - const { _def } = intersection; + const left = intersection.def.left; + const right = intersection.def.right; // Merge the shapes - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - const mergedShape = { ..._def.left.shape, ..._def.right.shape }; + const mergedShape = { ...left.def.shape, ...right.def.shape }; // Return a new ZodObject return z.object(mergedShape) as unknown as TIntersection extends ZodIntersection - ? TLeft extends AnyZodObject - ? TRight extends AnyZodObject - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - ZodObject & z.infer> + ? TLeft extends ZodObject + ? TRight extends ZodObject + ? ZodObject : never : never : never; diff --git a/packages/api/src/test/schema-merger.spec.ts b/packages/api/src/test/schema-merger.spec.ts new file mode 100644 index 000000000..28bbf8f12 --- /dev/null +++ b/packages/api/src/test/schema-merger.spec.ts @@ -0,0 +1,23 @@ +import { describe, expect, test } from "vitest"; +import z from "zod/v4"; + +import { convertIntersectionToZodObject } from "../schema-merger"; + +describe("convertIntersectionToZodObject should convert zod intersection to zod object", () => { + test("should merge two ZodObjects with different properties", () => { + const objectA = z.object({ + id: z.string(), + }); + const objectB = z.object({ + name: z.string(), + }); + + const intersection = objectA.and(objectB); + + const result = convertIntersectionToZodObject(intersection); + + expect(result.def.type).toBe("object"); + expect(result.shape).toHaveProperty("id"); + expect(result.shape).toHaveProperty("name"); + }); +}); diff --git a/packages/api/src/trpc.ts b/packages/api/src/trpc.ts index 93c2b57be..fd5f47442 100644 --- a/packages/api/src/trpc.ts +++ b/packages/api/src/trpc.ts @@ -9,7 +9,7 @@ import { initTRPC, TRPCError } from "@trpc/server"; import superjson from "superjson"; import type { OpenApiMeta } from "trpc-to-openapi"; -import { ZodError } from "zod"; +import { ZodError } from "zod/v4"; import type { Session } from "@homarr/auth"; import { FlattenError } from "@homarr/common"; diff --git a/packages/auth/env.ts b/packages/auth/env.ts index 12089d9c8..4a41e8594 100644 --- a/packages/auth/env.ts +++ b/packages/auth/env.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { createBooleanSchema, createDurationSchema, createEnv } from "@homarr/core/infrastructure/env"; import { supportedAuthProviders } from "@homarr/definitions"; @@ -19,7 +19,7 @@ const authProvidersSchema = z return false; }), ) - .default("credentials"); + .default(["credentials"]); const authProviders = authProvidersSchema.safeParse(process.env.AUTH_PROVIDERS).data ?? []; diff --git a/packages/auth/package.json b/packages/auth/package.json index 99c1baa95..58509d831 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -39,7 +39,7 @@ "next-auth": "5.0.0-beta.29", "react": "19.1.1", "react-dom": "19.1.1", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -47,7 +47,7 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/bcrypt": "6.0.0", "@types/cookies": "0.9.1", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "prettier": "^3.6.2", "typescript": "^5.9.2" } diff --git a/packages/auth/providers/credentials/authorization/basic-authorization.ts b/packages/auth/providers/credentials/authorization/basic-authorization.ts index 596716c1b..544441a9d 100644 --- a/packages/auth/providers/credentials/authorization/basic-authorization.ts +++ b/packages/auth/providers/credentials/authorization/basic-authorization.ts @@ -1,5 +1,5 @@ import bcrypt from "bcrypt"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import type { Database } from "@homarr/db"; import { and, eq } from "@homarr/db"; diff --git a/packages/auth/providers/credentials/authorization/ldap-authorization.ts b/packages/auth/providers/credentials/authorization/ldap-authorization.ts index c0d153c88..9f441aa9a 100644 --- a/packages/auth/providers/credentials/authorization/ldap-authorization.ts +++ b/packages/auth/providers/credentials/authorization/ldap-authorization.ts @@ -1,5 +1,5 @@ import { CredentialsSignin } from "@auth/core/errors"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createId, extractErrorMessage } from "@homarr/common"; import type { Database, InferInsertModel } from "@homarr/db"; diff --git a/packages/auth/test/session.spec.ts b/packages/auth/test/session.spec.ts index e15703ea4..cc0efa96a 100644 --- a/packages/auth/test/session.spec.ts +++ b/packages/auth/test/session.spec.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import { z } from "zod"; +import { z } from "zod/v4"; import { expireDateAfter, generateSessionToken } from "../session"; diff --git a/packages/boards/package.json b/packages/boards/package.json index 9feba8d9b..cc5ac7090 100644 --- a/packages/boards/package.json +++ b/packages/boards/package.json @@ -32,7 +32,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/certificates/package.json b/packages/certificates/package.json index 91b5b5a2b..70578b5a4 100644 --- a/packages/certificates/package.json +++ b/packages/certificates/package.json @@ -30,7 +30,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index c5448a3fd..ef62e1c04 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -34,8 +34,8 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "esbuild": "^0.25.8", - "eslint": "^9.32.0", + "esbuild": "^0.25.9", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/cli/src/commands/recreate-admin.ts b/packages/cli/src/commands/recreate-admin.ts index a00bad351..8c2b9fd8d 100644 --- a/packages/cli/src/commands/recreate-admin.ts +++ b/packages/cli/src/commands/recreate-admin.ts @@ -25,7 +25,7 @@ export const recreateAdmin = command({ if (!result.success) { console.error("Invalid username:"); - console.error(result.error.errors.map((error) => `- ${error.message}`).join("\n")); + console.error(result.error.issues.map((error) => `- ${error.message}`).join("\n")); return; } diff --git a/packages/common/env.ts b/packages/common/env.ts index f9e734e0a..2a7cd43d5 100644 --- a/packages/common/env.ts +++ b/packages/common/env.ts @@ -1,5 +1,5 @@ import { randomBytes } from "crypto"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createEnv } from "@homarr/core/infrastructure/env"; @@ -12,7 +12,7 @@ export const env = createEnv({ server: { SECRET_ENCRYPTION_KEY: z .string({ - required_error: `SECRET_ENCRYPTION_KEY is required${errorSuffix}`, + error: `SECRET_ENCRYPTION_KEY is required${errorSuffix}`, }) .min(64, { message: `SECRET_ENCRYPTION_KEY has to be 64 characters${errorSuffix}`, diff --git a/packages/common/package.json b/packages/common/package.json index 6a5602092..45e9aa1f6 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -9,8 +9,7 @@ "./types": "./src/types.ts", "./server": "./src/server.ts", "./client": "./src/client.ts", - "./env": "./env.ts", - "./env-validation": "./src/env-validation.ts" + "./env": "./env.ts" }, "typesVersions": { "*": { @@ -35,14 +34,14 @@ "react": "19.1.1", "react-dom": "19.1.1", "undici": "7.13.0", - "zod": "^3.25.76", + "zod": "^4.0.14", "zod-validation-error": "^3.5.3" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/common/src/env-validation.ts b/packages/common/src/env-validation.ts deleted file mode 100644 index ff884bc0a..000000000 --- a/packages/common/src/env-validation.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { z } from "zod"; - -const trueStrings = ["1", "yes", "t", "true"]; -const falseStrings = ["0", "no", "f", "false"]; - -export const createBooleanSchema = (defaultValue: boolean) => - z - .string() - .default(defaultValue.toString()) - .transform((value, ctx) => { - const normalized = value.trim().toLowerCase(); - if (trueStrings.includes(normalized)) return true; - if (falseStrings.includes(normalized)) return false; - - throw new Error(`Invalid boolean value for ${ctx.path.join(".")}`); - }); - -export const createDurationSchema = (defaultValue: `${number}${"s" | "m" | "h" | "d"}`) => - z - .string() - .regex(/^\d+[smhd]?$/) - .default(defaultValue) - .transform((duration) => { - const lastChar = duration[duration.length - 1] as "s" | "m" | "h" | "d"; - if (!isNaN(Number(lastChar))) { - return Number(defaultValue); - } - - const multipliers = { - s: 1, - m: 60, - h: 60 * 60, - d: 60 * 60 * 24, - }; - const numberDuration = Number(duration.slice(0, -1)); - const multiplier = multipliers[lastChar]; - - return numberDuration * multiplier; - }); - -export const shouldSkipEnvValidation = () => - Boolean(process.env.CI) || Boolean(process.env.SKIP_ENV_VALIDATION) || process.env.npm_lifecycle_event === "lint"; diff --git a/packages/common/src/errors/parse/handlers/zod-parse-error-handler.ts b/packages/common/src/errors/parse/handlers/zod-parse-error-handler.ts index c695f1809..9f581ba99 100644 --- a/packages/common/src/errors/parse/handlers/zod-parse-error-handler.ts +++ b/packages/common/src/errors/parse/handlers/zod-parse-error-handler.ts @@ -1,5 +1,5 @@ -import { ZodError } from "zod"; import { fromError } from "zod-validation-error"; +import { ZodError } from "zod/v4"; import { logger } from "@homarr/log"; diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts index e6b0621ff..8784e190f 100644 --- a/packages/common/src/types.ts +++ b/packages/common/src/types.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type { z } from "zod/v4"; export type MaybePromise = T | Promise; @@ -19,7 +19,7 @@ export type Inverse = { type Invertible = Record; -export type inferSearchParamsFromSchema = inferSearchParamsFromSchemaInner< +export type inferSearchParamsFromSchema = inferSearchParamsFromSchemaInner< z.infer >; diff --git a/packages/core/package.json b/packages/core/package.json index 2464293b3..f947211c6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -26,13 +26,13 @@ "dependencies": { "@t3-oss/env-nextjs": "^0.13.8", "ioredis": "5.7.0", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/core/src/infrastructure/env/schemas.ts b/packages/core/src/infrastructure/env/schemas.ts index da700f6ad..595dd37ca 100644 --- a/packages/core/src/infrastructure/env/schemas.ts +++ b/packages/core/src/infrastructure/env/schemas.ts @@ -1,19 +1,16 @@ -import { z } from "zod"; +import { z } from "zod/v4"; const trueStrings = ["1", "yes", "t", "true"]; const falseStrings = ["0", "no", "f", "false"]; export const createBooleanSchema = (defaultValue: boolean) => z - .string() - .default(defaultValue.toString()) - .transform((value, ctx) => { - const normalized = value.trim().toLowerCase(); - if (trueStrings.includes(normalized)) return true; - if (falseStrings.includes(normalized)) return false; - - throw new Error(`Invalid boolean value for ${ctx.path.join(".")}`); - }); + .stringbool({ + truthy: trueStrings, + falsy: falseStrings, + case: "insensitive", + }) + .default(defaultValue); export const createDurationSchema = (defaultValue: `${number}${"s" | "m" | "h" | "d"}`) => z diff --git a/packages/cron-job-api/package.json b/packages/cron-job-api/package.json index 6d127b139..74106452a 100644 --- a/packages/cron-job-api/package.json +++ b/packages/cron-job-api/package.json @@ -29,21 +29,21 @@ "@homarr/core": "workspace:^0.1.0", "@homarr/cron-jobs": "workspace:^0.1.0", "@homarr/log": "workspace:^0.1.0", - "@tanstack/react-query": "^5.84.2", + "@tanstack/react-query": "^5.85.3", "@trpc/client": "^11.4.4", "@trpc/server": "^11.4.4", "@trpc/tanstack-react-query": "^11.4.4", "node-cron": "^4.2.1", "react": "19.1.1", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/node-cron": "^3.0.11", - "@types/react": "19.1.9", - "eslint": "^9.32.0", + "@types/react": "19.1.10", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/cron-job-status/package.json b/packages/cron-job-status/package.json index 632f4e6b6..4a5b97e57 100644 --- a/packages/cron-job-status/package.json +++ b/packages/cron-job-status/package.json @@ -29,7 +29,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/cron-jobs-core/package.json b/packages/cron-jobs-core/package.json index 3acd05533..cf91c58d4 100644 --- a/packages/cron-jobs-core/package.json +++ b/packages/cron-jobs-core/package.json @@ -33,7 +33,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/node-cron": "^3.0.11", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index c10da47b9..5befe06d4 100644 --- a/packages/cron-jobs/package.json +++ b/packages/cron-jobs/package.json @@ -44,7 +44,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/db/env.ts b/packages/db/env.ts index bb7ad0388..f02c35b8e 100644 --- a/packages/db/env.ts +++ b/packages/db/env.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { env as commonEnv } from "@homarr/common/env"; import { createEnv } from "@homarr/core/infrastructure/env"; @@ -42,7 +42,7 @@ export const env = createEnv({ .regex(/\d+/) .transform(Number) .refine((number) => number >= 1) - .default("3306"), + .default(3306), DB_USER: z.string(), DB_PASSWORD: z.string(), DB_NAME: z.string(), diff --git a/packages/db/migrations/mysql/0034_increase-blob-size.sql b/packages/db/migrations/mysql/0034_increase-blob-size.sql new file mode 100644 index 000000000..8c5515305 --- /dev/null +++ b/packages/db/migrations/mysql/0034_increase-blob-size.sql @@ -0,0 +1 @@ +ALTER TABLE `media` MODIFY COLUMN `content` LONGBLOB NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/mysql/meta/0034_snapshot.json b/packages/db/migrations/mysql/meta/0034_snapshot.json new file mode 100644 index 000000000..7c16a4ca8 --- /dev/null +++ b/packages/db/migrations/mysql/meta/0034_snapshot.json @@ -0,0 +1,2093 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "c51b64c9-399a-4f5d-b4b3-728f6cb5c17f", + "prevId": "106b2351-70d1-4c07-9fd8-68dc1fb58eab", + "tables": { + "account": { + "name": "account", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "session_state": { + "name": "session_state", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "userId_idx": { + "name": "userId_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_provider_account_id_pk": { + "name": "account_provider_provider_account_id_pk", + "columns": ["provider", "provider_account_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "api_key": { + "name": "api_key", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "apiKey_user_id_user_id_fk": { + "name": "apiKey_user_id_user_id_fk", + "tableFrom": "apiKey", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "apiKey_id": { + "name": "apiKey_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "app": { + "name": "app", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "href": { + "name": "href", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ping_url": { + "name": "ping_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "app_id": { + "name": "app_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "boardGroupPermission": { + "name": "boardGroupPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardGroupPermission_board_id_board_id_fk": { + "name": "boardGroupPermission_board_id_board_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardGroupPermission_group_id_group_id_fk": { + "name": "boardGroupPermission_group_id_group_id_fk", + "tableFrom": "boardGroupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardGroupPermission_board_id_group_id_permission_pk": { + "name": "boardGroupPermission_board_id_group_id_permission_pk", + "columns": ["board_id", "group_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "boardUserPermission": { + "name": "boardUserPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "boardUserPermission_board_id_board_id_fk": { + "name": "boardUserPermission_board_id_board_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "boardUserPermission_user_id_user_id_fk": { + "name": "boardUserPermission_user_id_user_id_fk", + "tableFrom": "boardUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "boardUserPermission_board_id_user_id_permission_pk": { + "name": "boardUserPermission_board_id_user_id_permission_pk", + "columns": ["board_id", "user_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "board": { + "name": "board", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "page_title": { + "name": "page_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "meta_title": { + "name": "meta_title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "logo_image_url": { + "name": "logo_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "favicon_image_url": { + "name": "favicon_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_url": { + "name": "background_image_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "background_image_attachment": { + "name": "background_image_attachment", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('fixed')" + }, + "background_image_repeat": { + "name": "background_image_repeat", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('no-repeat')" + }, + "background_image_size": { + "name": "background_image_size", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('cover')" + }, + "primary_color": { + "name": "primary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('#fa5252')" + }, + "secondary_color": { + "name": "secondary_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('#fd7e14')" + }, + "opacity": { + "name": "opacity", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "custom_css": { + "name": "custom_css", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "icon_color": { + "name": "icon_color", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "item_radius": { + "name": "item_radius", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('lg')" + }, + "disable_status": { + "name": "disable_status", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "board_creator_id_user_id_fk": { + "name": "board_creator_id_user_id_fk", + "tableFrom": "board", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "board_id": { + "name": "board_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "board_name_unique": { + "name": "board_name_unique", + "columns": ["name"] + } + }, + "checkConstraint": {} + }, + "cron_job_configuration": { + "name": "cron_job_configuration", + "columns": { + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "cron_expression": { + "name": "cron_expression", + "type": "varchar(32)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "cron_job_configuration_name": { + "name": "cron_job_configuration_name", + "columns": ["name"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "groupMember": { + "name": "groupMember", + "columns": { + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupMember_group_id_group_id_fk": { + "name": "groupMember_group_id_group_id_fk", + "tableFrom": "groupMember", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "groupMember_user_id_user_id_fk": { + "name": "groupMember_user_id_user_id_fk", + "tableFrom": "groupMember", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "groupMember_group_id_user_id_pk": { + "name": "groupMember_group_id_user_id_pk", + "columns": ["group_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupPermission_group_id_group_id_fk": { + "name": "groupPermission_group_id_group_id_fk", + "tableFrom": "groupPermission", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "group": { + "name": "group", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "home_board_id": { + "name": "home_board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mobile_home_board_id": { + "name": "mobile_home_board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "position": { + "name": "position", + "type": "smallint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "group_owner_id_user_id_fk": { + "name": "group_owner_id_user_id_fk", + "tableFrom": "group", + "tableTo": "user", + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "group_home_board_id_board_id_fk": { + "name": "group_home_board_id_board_id_fk", + "tableFrom": "group", + "tableTo": "board", + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "group_mobile_home_board_id_board_id_fk": { + "name": "group_mobile_home_board_id_board_id_fk", + "tableFrom": "group", + "tableTo": "board", + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "group_id": { + "name": "group_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "group_name_unique": { + "name": "group_name_unique", + "columns": ["name"] + } + }, + "checkConstraint": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(150)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "iconRepository_id": { + "name": "iconRepository_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "icon": { + "name": "icon", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(250)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_repository_id": { + "name": "icon_repository_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "icon_icon_repository_id_iconRepository_id_fk": { + "name": "icon_icon_repository_id_iconRepository_id_fk", + "tableFrom": "icon", + "tableTo": "iconRepository", + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "icon_id": { + "name": "icon_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationGroupPermissions": { + "name": "integrationGroupPermissions", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationGroupPermissions_integration_id_integration_id_fk": { + "name": "integrationGroupPermissions_integration_id_integration_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationGroupPermissions_group_id_group_id_fk": { + "name": "integrationGroupPermissions_group_id_group_id_fk", + "tableFrom": "integrationGroupPermissions", + "tableTo": "group", + "columnsFrom": ["group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integration_group_permission__pk": { + "name": "integration_group_permission__pk", + "columns": ["integration_id", "group_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integration_item": { + "name": "integration_item", + "columns": { + "item_id": { + "name": "item_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integration_item_item_id_item_id_fk": { + "name": "integration_item_item_id_item_id_fk", + "tableFrom": "integration_item", + "tableTo": "item", + "columnsFrom": ["item_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integration_item_integration_id_integration_id_fk": { + "name": "integration_item_integration_id_integration_id_fk", + "tableFrom": "integration_item", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integration_item_item_id_integration_id_pk": { + "name": "integration_item_item_id_integration_id_pk", + "columns": ["item_id", "integration_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationSecret": { + "name": "integrationSecret", + "columns": { + "kind": { + "name": "kind", + "type": "varchar(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration_secret__kind_idx": { + "name": "integration_secret__kind_idx", + "columns": ["kind"], + "isUnique": false + }, + "integration_secret__updated_at_idx": { + "name": "integration_secret__updated_at_idx", + "columns": ["updated_at"], + "isUnique": false + } + }, + "foreignKeys": { + "integrationSecret_integration_id_integration_id_fk": { + "name": "integrationSecret_integration_id_integration_id_fk", + "tableFrom": "integrationSecret", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationSecret_integration_id_kind_pk": { + "name": "integrationSecret_integration_id_kind_pk", + "columns": ["integration_id", "kind"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integrationUserPermission": { + "name": "integrationUserPermission", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "integrationUserPermission_integration_id_integration_id_fk": { + "name": "integrationUserPermission_integration_id_integration_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "integrationUserPermission_user_id_user_id_fk": { + "name": "integrationUserPermission_user_id_user_id_fk", + "tableFrom": "integrationUserPermission", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "integrationUserPermission_integration_id_user_id_permission_pk": { + "name": "integrationUserPermission_integration_id_user_id_permission_pk", + "columns": ["integration_id", "user_id", "permission"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "integration": { + "name": "integration", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration__kind_idx": { + "name": "integration__kind_idx", + "columns": ["kind"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "integration_id": { + "name": "integration_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "invite": { + "name": "invite", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiration_date": { + "name": "expiration_date", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "invite_creator_id_user_id_fk": { + "name": "invite_creator_id_user_id_fk", + "tableFrom": "invite", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "invite_id": { + "name": "invite_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "invite_token_unique": { + "name": "invite_token_unique", + "columns": ["token"] + } + }, + "checkConstraint": {} + }, + "item_layout": { + "name": "item_layout", + "columns": { + "item_id": { + "name": "item_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "layout_id": { + "name": "layout_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "item_layout_item_id_item_id_fk": { + "name": "item_layout_item_id_item_id_fk", + "tableFrom": "item_layout", + "tableTo": "item", + "columnsFrom": ["item_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_layout_section_id_section_id_fk": { + "name": "item_layout_section_id_section_id_fk", + "tableFrom": "item_layout", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "item_layout_layout_id_layout_id_fk": { + "name": "item_layout_layout_id_layout_id_fk", + "tableFrom": "item_layout", + "tableTo": "layout", + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "item_layout_item_id_section_id_layout_id_pk": { + "name": "item_layout_item_id_section_id_layout_id_pk", + "columns": ["item_id", "section_id", "layout_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "options": { + "name": "options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + }, + "advanced_options": { + "name": "advanced_options", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + } + }, + "indexes": {}, + "foreignKeys": { + "item_board_id_board_id_fk": { + "name": "item_board_id_board_id_fk", + "tableFrom": "item", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "item_id": { + "name": "item_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "layout": { + "name": "layout", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(32)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "column_count": { + "name": "column_count", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "breakpoint": { + "name": "breakpoint", + "type": "smallint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": { + "layout_board_id_board_id_fk": { + "name": "layout_board_id_board_id_fk", + "tableFrom": "layout", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "layout_id": { + "name": "layout_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "media": { + "name": "media", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "LONGBLOB", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size": { + "name": "size", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "creator_id": { + "name": "creator_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "media_creator_id_user_id_fk": { + "name": "media_creator_id_user_id_fk", + "tableFrom": "media", + "tableTo": "user", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "media_id": { + "name": "media_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "onboarding": { + "name": "onboarding", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "step": { + "name": "step", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "previous_step": { + "name": "previous_step", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "onboarding_id": { + "name": "onboarding_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "search_engine": { + "name": "search_engine", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "short": { + "name": "short", + "type": "varchar(8)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url_template": { + "name": "url_template", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'generic'" + }, + "integration_id": { + "name": "integration_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "search_engine_integration_id_integration_id_fk": { + "name": "search_engine_integration_id_integration_id_fk", + "tableFrom": "search_engine", + "tableTo": "integration", + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "search_engine_id": { + "name": "search_engine_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "search_engine_short_unique": { + "name": "search_engine_short_unique", + "columns": ["short"] + } + }, + "checkConstraint": {} + }, + "section_collapse_state": { + "name": "section_collapse_state", + "columns": { + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collapsed": { + "name": "collapsed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "section_collapse_state_user_id_user_id_fk": { + "name": "section_collapse_state_user_id_user_id_fk", + "tableFrom": "section_collapse_state", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "section_collapse_state_section_id_section_id_fk": { + "name": "section_collapse_state_section_id_section_id_fk", + "tableFrom": "section_collapse_state", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "section_collapse_state_user_id_section_id_pk": { + "name": "section_collapse_state_user_id_section_id_pk", + "columns": ["user_id", "section_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "section_layout": { + "name": "section_layout", + "columns": { + "section_id": { + "name": "section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "layout_id": { + "name": "layout_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "section_layout_section_id_section_id_fk": { + "name": "section_layout_section_id_section_id_fk", + "tableFrom": "section_layout", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "section_layout_layout_id_layout_id_fk": { + "name": "section_layout_layout_id_layout_id_fk", + "tableFrom": "section_layout", + "tableTo": "layout", + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "section_layout_parent_section_id_section_id_fk": { + "name": "section_layout_parent_section_id_section_id_fk", + "tableFrom": "section_layout", + "tableTo": "section", + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "section_layout_section_id_layout_id_pk": { + "name": "section_layout_section_id_layout_id_pk", + "columns": ["section_id", "layout_id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "section": { + "name": "section", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "options": { + "name": "options", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "('{\"json\": {}}')" + } + }, + "indexes": {}, + "foreignKeys": { + "section_board_id_board_id_fk": { + "name": "section_board_id_board_id_fk", + "tableFrom": "section", + "tableTo": "board", + "columnsFrom": ["board_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "section_id": { + "name": "section_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "setting_key": { + "name": "setting_key", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"json\": {}}')" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "serverSetting_setting_key": { + "name": "serverSetting_setting_key", + "columns": ["setting_key"] + } + }, + "uniqueConstraints": { + "serverSetting_settingKey_unique": { + "name": "serverSetting_settingKey_unique", + "columns": ["setting_key"] + } + }, + "checkConstraint": {} + }, + "session": { + "name": "session", + "columns": { + "session_token": { + "name": "session_token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "session_session_token": { + "name": "session_session_token", + "columns": ["session_token"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "trusted_certificate_hostname": { + "name": "trusted_certificate_hostname", + "columns": { + "hostname": { + "name": "hostname", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "thumbprint": { + "name": "thumbprint", + "type": "varchar(128)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "certificate": { + "name": "certificate", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "trusted_certificate_hostname_hostname_thumbprint_pk": { + "name": "trusted_certificate_hostname_hostname_thumbprint_pk", + "columns": ["hostname", "thumbprint"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'credentials'" + }, + "home_board_id": { + "name": "home_board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mobile_home_board_id": { + "name": "mobile_home_board_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "default_search_engine_id": { + "name": "default_search_engine_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "open_search_in_new_tab": { + "name": "open_search_in_new_tab", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "color_scheme": { + "name": "color_scheme", + "type": "varchar(5)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'dark'" + }, + "first_day_of_week": { + "name": "first_day_of_week", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "ping_icons_enabled": { + "name": "ping_icons_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_home_board_id_board_id_fk": { + "name": "user_home_board_id_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "user_mobile_home_board_id_board_id_fk": { + "name": "user_mobile_home_board_id_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "user_default_search_engine_id_search_engine_id_fk": { + "name": "user_default_search_engine_id_search_engine_id_fk", + "tableFrom": "user", + "tableTo": "search_engine", + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_id": { + "name": "user_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "verificationToken": { + "name": "verificationToken", + "columns": { + "identifier": { + "name": "identifier", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "name": "verificationToken_identifier_token_pk", + "columns": ["identifier", "token"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/db/migrations/mysql/meta/_journal.json b/packages/db/migrations/mysql/meta/_journal.json index b417e9ff5..02ac58ea2 100644 --- a/packages/db/migrations/mysql/meta/_journal.json +++ b/packages/db/migrations/mysql/meta/_journal.json @@ -239,6 +239,13 @@ "when": 1750013953833, "tag": "0033_add_cron_job_configuration", "breakpoints": true + }, + { + "idx": 34, + "version": "5", + "when": 1754929897145, + "tag": "0034_increase-blob-size", + "breakpoints": true } ] } diff --git a/packages/db/package.json b/packages/db/package.json index f057fcdc3..9988dc725 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -51,7 +51,7 @@ "dotenv": "^17.2.1", "drizzle-kit": "^0.31.4", "drizzle-orm": "^0.44.4", - "drizzle-zod": "^0.7.1", + "drizzle-zod": "^0.8.2", "mysql2": "3.14.3", "superjson": "2.2.2" }, @@ -61,10 +61,10 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/better-sqlite3": "7.6.13", "dotenv-cli": "^10.0.0", - "esbuild": "^0.25.8", - "eslint": "^9.32.0", + "esbuild": "^0.25.9", + "eslint": "^9.33.0", "prettier": "^3.6.2", - "tsx": "4.20.3", + "tsx": "4.20.4", "typescript": "^5.9.2" } } diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts index cbbba81c5..a5607c7b5 100644 --- a/packages/db/schema/mysql.ts +++ b/packages/db/schema/mysql.ts @@ -42,7 +42,7 @@ import type { const customBlob = customType<{ data: Buffer }>({ dataType() { - return "BLOB"; + return "LONGBLOB"; // Has max size of 4GB }, }); diff --git a/packages/definitions/package.json b/packages/definitions/package.json index 6a0e004fa..c9f22c028 100644 --- a/packages/definitions/package.json +++ b/packages/definitions/package.json @@ -25,14 +25,14 @@ "dependencies": { "@homarr/common": "workspace:^0.1.0", "fast-xml-parser": "^5.2.5", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", - "tsx": "4.20.3", + "eslint": "^9.33.0", + "tsx": "4.20.4", "typescript": "^5.9.2" } } diff --git a/packages/definitions/src/docs/codegen.ts b/packages/definitions/src/docs/codegen.ts index e8087efb8..f39cf3f28 100644 --- a/packages/definitions/src/docs/codegen.ts +++ b/packages/definitions/src/docs/codegen.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path, { dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { XMLParser } from "fast-xml-parser"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createDocumentationLink } from "./index"; diff --git a/packages/definitions/src/docs/homarr-docs-sitemap.ts b/packages/definitions/src/docs/homarr-docs-sitemap.ts index 7a544dcaf..59ea973b4 100644 --- a/packages/definitions/src/docs/homarr-docs-sitemap.ts +++ b/packages/definitions/src/docs/homarr-docs-sitemap.ts @@ -221,6 +221,7 @@ export type HomarrDocumentationPath = | "/docs/widgets/smart-home-entity-state" | "/docs/widgets/smart-home-execute-automation" | "/docs/widgets/stock-price" + | "/docs/widgets/system-resources" | "/docs/widgets/video" | "/docs/widgets/weather" | "" diff --git a/packages/docker/package.json b/packages/docker/package.json index 51f07d96d..34172ca0f 100644 --- a/packages/docker/package.json +++ b/packages/docker/package.json @@ -33,7 +33,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/dockerode": "^3.3.42", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/docker/src/env.ts b/packages/docker/src/env.ts index a0ba6c5e2..e858d3e69 100644 --- a/packages/docker/src/env.ts +++ b/packages/docker/src/env.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { createBooleanSchema, createEnv } from "@homarr/core/infrastructure/env"; diff --git a/packages/form/package.json b/packages/form/package.json index 41d5019b1..77241981a 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -27,13 +27,14 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@mantine/form": "^8.2.4", - "zod": "^3.25.76" + "mantine-form-zod-resolver": "^1.2.1", + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/form/src/index.ts b/packages/form/src/index.ts index 59192a2a6..f1d34f193 100644 --- a/packages/form/src/index.ts +++ b/packages/form/src/index.ts @@ -1,29 +1,39 @@ -import { useForm, zodResolver } from "@mantine/form"; -import { z } from "zod"; -import type { AnyZodObject, ZodDiscriminatedUnion, ZodEffects, ZodIntersection } from "zod"; +import { useForm } from "@mantine/form"; +import { zod4Resolver } from "mantine-form-zod-resolver"; +import type { ZodDiscriminatedUnion, ZodIntersection, ZodObject, ZodPipe } from "zod/v4"; +import { z } from "zod/v4"; import { useI18n } from "@homarr/translation/client"; import { zodErrorMap } from "@homarr/validation/form/i18n"; +type inferPossibleSchema< + TSchema extends + | ZodObject + | ZodPipe + | ZodIntersection, ZodObject>, +> = z.infer extends Record ? z.infer : never; + export const useZodForm = < TSchema extends - | AnyZodObject - | ZodEffects - | ZodIntersection, AnyZodObject>, + | ZodObject + | ZodPipe + | ZodIntersection, ZodObject>, >( schema: TSchema, options: Omit< - Exclude>>[0], undefined>, + Exclude>>[0], undefined>, "validate" | "validateInputOnBlur" | "validateInputOnChange" >, ) => { const t = useI18n(); - z.setErrorMap(zodErrorMap(t)); - return useForm>({ + z.config({ + customError: zodErrorMap(t), + }); + return useForm>({ ...options, validateInputOnBlur: true, validateInputOnChange: true, - validate: zodResolver(schema), + validate: zod4Resolver(schema), }); }; diff --git a/packages/form/src/messages.ts b/packages/form/src/messages.ts deleted file mode 100644 index bfbbc4c4f..000000000 --- a/packages/form/src/messages.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { ErrorMapCtx, z, ZodTooBigIssue, ZodTooSmallIssue } from "zod"; -import { ZodIssueCode } from "zod"; - -import type { TranslationObject } from "@homarr/translation"; - -const handleStringError = (issue: z.ZodInvalidStringIssue) => { - if (typeof issue.validation === "object") { - // Check if object contains startsWith / endsWith key to determine the error type. If not, it's an includes error. (see type of issue.validation) - if ("startsWith" in issue.validation) { - return { - key: "errors.string.startsWith", - params: { - startsWith: issue.validation.startsWith, - }, - } as const; - } else if ("endsWith" in issue.validation) { - return { - key: "errors.string.endsWith", - params: { - endsWith: issue.validation.endsWith, - }, - } as const; - } - - return { - key: "errors.invalid_string.includes", - params: { - includes: issue.validation.includes, - }, - } as const; - } - - return { - message: issue.message, - }; -}; - -const handleTooSmallError = (issue: ZodTooSmallIssue) => { - if (issue.type !== "string" && issue.type !== "number") { - return { - message: issue.message, - }; - } - - return { - key: `errors.tooSmall.${issue.type}`, - params: { - minimum: issue.minimum, - count: issue.minimum, - }, - } as const; -}; - -const handleTooBigError = (issue: ZodTooBigIssue) => { - if (issue.type !== "string" && issue.type !== "number") { - return { - message: issue.message, - }; - } - - return { - key: `errors.tooBig.${issue.type}`, - params: { - maximum: issue.maximum, - count: issue.maximum, - }, - } as const; -}; - -export const handleZodError = (issue: z.ZodIssueOptionalMessage, ctx: ErrorMapCtx) => { - if (ctx.defaultError === "Required") { - return { - key: "errors.required", - params: {}, - } as const; - } - if (issue.code === ZodIssueCode.invalid_string) { - return handleStringError(issue); - } - if (issue.code === ZodIssueCode.too_small) { - return handleTooSmallError(issue); - } - if (issue.code === ZodIssueCode.too_big) { - return handleTooBigError(issue); - } - if (issue.code === ZodIssueCode.custom && issue.params?.i18n) { - const { i18n } = issue.params as CustomErrorParams; - return { - key: `errors.custom.${i18n.key}`, - } as const; - } - - return { - message: issue.message, - }; -}; - -export interface CustomErrorParams { - i18n: { - key: keyof TranslationObject["common"]["zod"]["errors"]["custom"]; - params?: Record; - }; -} diff --git a/packages/forms-collection/package.json b/packages/forms-collection/package.json index f7bb63a41..403020796 100644 --- a/packages/forms-collection/package.json +++ b/packages/forms-collection/package.json @@ -31,13 +31,13 @@ "@homarr/validation": "workspace:^0.1.0", "@mantine/core": "^8.2.4", "react": "19.1.1", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/forms-collection/src/new-app/_app-new-form.tsx b/packages/forms-collection/src/new-app/_app-new-form.tsx index a8ef5d70d..06e96ada1 100644 --- a/packages/forms-collection/src/new-app/_app-new-form.tsx +++ b/packages/forms-collection/src/new-app/_app-new-form.tsx @@ -2,7 +2,7 @@ import { useCallback } from "react"; import { useRouter } from "next/navigation"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; diff --git a/packages/forms-collection/src/new-app/_form.tsx b/packages/forms-collection/src/new-app/_form.tsx index 559b2160a..a23f8c5e6 100644 --- a/packages/forms-collection/src/new-app/_form.tsx +++ b/packages/forms-collection/src/new-app/_form.tsx @@ -5,7 +5,7 @@ import { useEffect, useRef } from "react"; import Link from "next/link"; import { Button, Checkbox, Collapse, Group, Stack, Textarea, TextInput } from "@mantine/core"; import { useDebouncedValue, useDisclosure } from "@mantine/hooks"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import { useZodForm } from "@homarr/form"; diff --git a/packages/icons/package.json b/packages/icons/package.json index 9c1823133..d0a858a55 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -31,7 +31,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/image-proxy/package.json b/packages/image-proxy/package.json index 7657f8797..302642337 100644 --- a/packages/image-proxy/package.json +++ b/packages/image-proxy/package.json @@ -33,7 +33,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/bcrypt": "6.0.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/integrations/package.json b/packages/integrations/package.json index ddfd9d869..7df7c9230 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -47,7 +47,7 @@ "tsdav": "^2.1.5", "undici": "7.13.0", "xml2js": "^0.6.2", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -55,7 +55,7 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/node-unifi": "^2.5.1", "@types/xml2js": "^0.4.14", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/integrations/src/adguard-home/adguard-home-types.ts b/packages/integrations/src/adguard-home/adguard-home-types.ts index bcd7abd29..493bc2099 100644 --- a/packages/integrations/src/adguard-home/adguard-home-types.ts +++ b/packages/integrations/src/adguard-home/adguard-home-types.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const statsResponseSchema = z.object({ time_units: z.enum(["hours", "days"]), diff --git a/packages/integrations/src/codeberg/codeberg-schemas.ts b/packages/integrations/src/codeberg/codeberg-schemas.ts index 1a6dafb39..ff6e62a01 100644 --- a/packages/integrations/src/codeberg/codeberg-schemas.ts +++ b/packages/integrations/src/codeberg/codeberg-schemas.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const releasesResponseSchema = z.array( z.object({ diff --git a/packages/integrations/src/dashdot/dashdot-integration.ts b/packages/integrations/src/dashdot/dashdot-integration.ts index e4898bf02..bf58feb40 100644 --- a/packages/integrations/src/dashdot/dashdot-integration.ts +++ b/packages/integrations/src/dashdot/dashdot-integration.ts @@ -3,7 +3,7 @@ import { humanFileSize } from "@homarr/common"; import "@homarr/redis"; import dayjs from "dayjs"; -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; @@ -81,8 +81,18 @@ export class DashDotIntegration extends Integration implements ISystemHealthMoni private async getCurrentCpuLoadAsync() { const channel = this.getChannel(); - const cpu = await fetchWithTrustedCertificatesAsync(this.url("/load/cpu")); - const data = await cpuLoadPerCoreApiList.parseAsync(await cpu.json()); + const response = await fetchWithTrustedCertificatesAsync(this.url("/load/cpu")); + const result = await response.text(); + + // we convert it to text as the response is either valid json or empty if cpu widget is disabled. + if (result.length === 0) { + return { + sumLoad: 0, + averageTemperature: 0, + }; + } + + const data = await cpuLoadPerCoreApiList.parseAsync(JSON.parse(result)); await channel.pushAsync(data); return { sumLoad: this.getAverageOfCpu(data), @@ -104,12 +114,27 @@ export class DashDotIntegration extends Integration implements ISystemHealthMoni private async getCurrentStorageLoadAsync() { const storageLoad = await fetchWithTrustedCertificatesAsync(this.url("/load/storage")); - return (await storageLoad.json()) as number[]; + // we convert it to text as the response is either valid json or empty if storage widget is disabled. + const result = await storageLoad.text(); + if (result.length === 0) { + return []; + } + + return JSON.parse(result) as number[]; } private async getCurrentMemoryLoadAsync() { const memoryLoad = await fetchWithTrustedCertificatesAsync(this.url("/load/ram")); - const data = await memoryLoadApi.parseAsync(await memoryLoad.json()); + const result = (await memoryLoad.json()) as object; + + // somehow the response here is not empty and rather an empty json object if the ram widget is disabled. + if (Object.keys(result).length === 0) { + return { + loadInBytes: 0, + }; + } + + const data = await memoryLoadApi.parseAsync(result); return { loadInBytes: data.load, }; @@ -117,7 +142,12 @@ export class DashDotIntegration extends Integration implements ISystemHealthMoni private async getCurrentNetworkLoadAsync() { const response = await fetchWithTrustedCertificatesAsync(this.url("/load/network")); - return await networkLoadApi.parseAsync(await response.json()); + const result = await response.text(); + + // we convert it to text as the response is either valid json or empty if network widget is disabled. + if (result.length === 0) return null; + + return await networkLoadApi.parseAsync(JSON.parse(result)); } private getChannel() { diff --git a/packages/integrations/src/docker-hub/docker-hub-schemas.ts b/packages/integrations/src/docker-hub/docker-hub-schemas.ts index 02b184383..674ae5532 100644 --- a/packages/integrations/src/docker-hub/docker-hub-schemas.ts +++ b/packages/integrations/src/docker-hub/docker-hub-schemas.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const accessTokenResponseSchema = z.object({ access_token: z.string(), diff --git a/packages/integrations/src/download-client/sabnzbd/sabnzbd-schema.ts b/packages/integrations/src/download-client/sabnzbd/sabnzbd-schema.ts index b1a327d09..c1bc9a249 100644 --- a/packages/integrations/src/download-client/sabnzbd/sabnzbd-schema.ts +++ b/packages/integrations/src/download-client/sabnzbd/sabnzbd-schema.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const queueSchema = z.object({ queue: z.object({ diff --git a/packages/integrations/src/emby/emby-integration.ts b/packages/integrations/src/emby/emby-integration.ts index 2b354cbe1..dff55513e 100644 --- a/packages/integrations/src/emby/emby-integration.ts +++ b/packages/integrations/src/emby/emby-integration.ts @@ -1,5 +1,5 @@ import { BaseItemKind } from "@jellyfin/sdk/lib/generated-client/models"; -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { ResponseError } from "@homarr/common/server"; diff --git a/packages/integrations/src/homeassistant/homeassistant-types.ts b/packages/integrations/src/homeassistant/homeassistant-types.ts index e4276159a..da1043b91 100644 --- a/packages/integrations/src/homeassistant/homeassistant-types.ts +++ b/packages/integrations/src/homeassistant/homeassistant-types.ts @@ -1,7 +1,8 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const entityStateSchema = z.object({ attributes: z.record( + z.string(), z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(z.union([z.string(), z.number()]))]), ), entity_id: z.string(), diff --git a/packages/integrations/src/interfaces/downloads/download-client-items.ts b/packages/integrations/src/interfaces/downloads/download-client-items.ts index 69ebfe88b..2fed74538 100644 --- a/packages/integrations/src/interfaces/downloads/download-client-items.ts +++ b/packages/integrations/src/interfaces/downloads/download-client-items.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import type { Integration } from "@homarr/db/schema"; diff --git a/packages/integrations/src/linuxserverio/linuxserverio-schemas.ts b/packages/integrations/src/linuxserverio/linuxserverio-schemas.ts index bf9842a50..3e3653697 100644 --- a/packages/integrations/src/linuxserverio/linuxserverio-schemas.ts +++ b/packages/integrations/src/linuxserverio/linuxserverio-schemas.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const releasesResponseSchema = z.object({ data: z.object({ diff --git a/packages/integrations/src/media-organizer/lidarr/lidarr-integration.ts b/packages/integrations/src/media-organizer/lidarr/lidarr-integration.ts index bec3fde58..6348f9ec1 100644 --- a/packages/integrations/src/media-organizer/lidarr/lidarr-integration.ts +++ b/packages/integrations/src/media-organizer/lidarr/lidarr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { logger } from "@homarr/log"; diff --git a/packages/integrations/src/media-organizer/radarr/radarr-integration.ts b/packages/integrations/src/media-organizer/radarr/radarr-integration.ts index 681ade5a0..8dc6aff87 100644 --- a/packages/integrations/src/media-organizer/radarr/radarr-integration.ts +++ b/packages/integrations/src/media-organizer/radarr/radarr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import type { AtLeastOneOf } from "@homarr/common/types"; diff --git a/packages/integrations/src/media-organizer/readarr/readarr-integration.ts b/packages/integrations/src/media-organizer/readarr/readarr-integration.ts index bd288db61..a9d8154cd 100644 --- a/packages/integrations/src/media-organizer/readarr/readarr-integration.ts +++ b/packages/integrations/src/media-organizer/readarr/readarr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { logger } from "@homarr/log"; diff --git a/packages/integrations/src/media-organizer/sonarr/sonarr-integration.ts b/packages/integrations/src/media-organizer/sonarr/sonarr-integration.ts index e82ff9094..a3f623881 100644 --- a/packages/integrations/src/media-organizer/sonarr/sonarr-integration.ts +++ b/packages/integrations/src/media-organizer/sonarr/sonarr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { logger } from "@homarr/log"; diff --git a/packages/integrations/src/media-transcoding/tdarr-validation-schemas.ts b/packages/integrations/src/media-transcoding/tdarr-validation-schemas.ts index 43729623a..4f43e60de 100644 --- a/packages/integrations/src/media-transcoding/tdarr-validation-schemas.ts +++ b/packages/integrations/src/media-transcoding/tdarr-validation-schemas.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const getStatisticsSchema = z.object({ pieStats: z.object({ diff --git a/packages/integrations/src/npm/npm-schemas.ts b/packages/integrations/src/npm/npm-schemas.ts index 290cea8ed..5d21734e2 100644 --- a/packages/integrations/src/npm/npm-schemas.ts +++ b/packages/integrations/src/npm/npm-schemas.ts @@ -1,12 +1,17 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const releasesResponseSchema = z.object({ - time: z.record(z.string().transform((value) => new Date(value))).transform((version) => - Object.entries(version).map(([key, value]) => ({ - latestRelease: key, - latestReleaseAt: value, - })), - ), - versions: z.record(z.object({ description: z.string() })), + time: z + .record( + z.string(), + z.string().transform((value) => new Date(value)), + ) + .transform((version) => + Object.entries(version).map(([key, value]) => ({ + latestRelease: key, + latestReleaseAt: value, + })), + ), + versions: z.record(z.string(), z.object({ description: z.string() })), name: z.string(), }); diff --git a/packages/integrations/src/ntfy/ntfy-schema.ts b/packages/integrations/src/ntfy/ntfy-schema.ts index 2c00557b4..d516e8a79 100644 --- a/packages/integrations/src/ntfy/ntfy-schema.ts +++ b/packages/integrations/src/ntfy/ntfy-schema.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; // There are more properties, see: https://docs.ntfy.sh/subscribe/api/#json-message-format // Not all properties are required for this use case. diff --git a/packages/integrations/src/openmediavault/openmediavault-types.ts b/packages/integrations/src/openmediavault/openmediavault-types.ts index dd1b1b5f4..d2396d08e 100644 --- a/packages/integrations/src/openmediavault/openmediavault-types.ts +++ b/packages/integrations/src/openmediavault/openmediavault-types.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; // Schema for system information export const systemInformationSchema = z.object({ diff --git a/packages/integrations/src/opnsense/opnsense-integration.ts b/packages/integrations/src/opnsense/opnsense-integration.ts index 2f11dfcc4..0c1841d55 100644 --- a/packages/integrations/src/opnsense/opnsense-integration.ts +++ b/packages/integrations/src/opnsense/opnsense-integration.ts @@ -105,7 +105,7 @@ export class OPNsenseIntegration extends Integration implements FirewallSummaryI public async getFirewallMemoryAsync(): Promise { const responseMemory = await fetchWithTrustedCertificatesAsync( - this.url("/api/diagnostics/system/systemResources"), + this.url("/api/diagnostics/system/system_resources"), { headers: { Authorization: this.getAuthHeaders(), diff --git a/packages/integrations/src/opnsense/opnsense-types.ts b/packages/integrations/src/opnsense/opnsense-types.ts index 24d112302..a91493886 100644 --- a/packages/integrations/src/opnsense/opnsense-types.ts +++ b/packages/integrations/src/opnsense/opnsense-types.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; // API documentation : https://docs.opnsense.org/development/api.html#core-api @@ -21,7 +21,7 @@ const interfaceSchema = z.object({ }); export const opnsenseInterfacesSchema = z.object({ - interfaces: z.record(interfaceSchema), + interfaces: z.record(z.string(), interfaceSchema), time: z.number(), }); diff --git a/packages/integrations/src/overseerr/overseerr-integration.ts b/packages/integrations/src/overseerr/overseerr-integration.ts index 66c1841fc..6a881a155 100644 --- a/packages/integrations/src/overseerr/overseerr-integration.ts +++ b/packages/integrations/src/overseerr/overseerr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { logger } from "@homarr/log"; diff --git a/packages/integrations/src/pi-hole/v5/pi-hole-schemas-v5.ts b/packages/integrations/src/pi-hole/v5/pi-hole-schemas-v5.ts index 35c204f9e..dee8b7b41 100644 --- a/packages/integrations/src/pi-hole/v5/pi-hole-schemas-v5.ts +++ b/packages/integrations/src/pi-hole/v5/pi-hole-schemas-v5.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const summaryResponseSchema = z.object({ status: z.enum(["enabled", "disabled"]), diff --git a/packages/integrations/src/pi-hole/v6/pi-hole-integration-v6.ts b/packages/integrations/src/pi-hole/v6/pi-hole-integration-v6.ts index 5e38648f1..2332d47bc 100644 --- a/packages/integrations/src/pi-hole/v6/pi-hole-integration-v6.ts +++ b/packages/integrations/src/pi-hole/v6/pi-hole-integration-v6.ts @@ -1,5 +1,5 @@ import type { fetch as undiciFetch, Response as UndiciResponse } from "undici"; -import type { z } from "zod"; +import type { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { ResponseError } from "@homarr/common/server"; diff --git a/packages/integrations/src/pi-hole/v6/pi-hole-schemas-v6.ts b/packages/integrations/src/pi-hole/v6/pi-hole-schemas-v6.ts index 283a8a71f..3be133aa9 100644 --- a/packages/integrations/src/pi-hole/v6/pi-hole-schemas-v6.ts +++ b/packages/integrations/src/pi-hole/v6/pi-hole-schemas-v6.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const sessionResponseSchema = z.object({ session: z.object({ diff --git a/packages/integrations/src/plex/plex-integration.ts b/packages/integrations/src/plex/plex-integration.ts index 553216c4f..1c842c02b 100644 --- a/packages/integrations/src/plex/plex-integration.ts +++ b/packages/integrations/src/plex/plex-integration.ts @@ -1,5 +1,5 @@ import { parseStringPromise } from "xml2js"; -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; import { ParseError } from "@homarr/common/server"; diff --git a/packages/integrations/src/prowlarr/prowlarr-integration.ts b/packages/integrations/src/prowlarr/prowlarr-integration.ts index 729d41f41..22b3bbab2 100644 --- a/packages/integrations/src/prowlarr/prowlarr-integration.ts +++ b/packages/integrations/src/prowlarr/prowlarr-integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTrustedCertificatesAsync } from "@homarr/certificates/server"; diff --git a/packages/integrations/src/prowlarr/prowlarr-types.ts b/packages/integrations/src/prowlarr/prowlarr-types.ts index dc10feca8..0bc4785c5 100644 --- a/packages/integrations/src/prowlarr/prowlarr-types.ts +++ b/packages/integrations/src/prowlarr/prowlarr-types.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const indexerResponseSchema = z.object({ id: z.number(), diff --git a/packages/integrations/src/quay/quay-schemas.ts b/packages/integrations/src/quay/quay-schemas.ts index 2de28c018..e24fe2d83 100644 --- a/packages/integrations/src/quay/quay-schemas.ts +++ b/packages/integrations/src/quay/quay-schemas.ts @@ -1,8 +1,9 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const releasesResponseSchema = z.object({ description: z.string().optional(), tags: z.record( + z.string(), z.object({ name: z.string(), last_modified: z.string(), diff --git a/packages/log/package.json b/packages/log/package.json index eab4666f6..c19ddf0dd 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -27,13 +27,13 @@ "@homarr/core": "workspace:^0.1.0", "superjson": "2.2.2", "winston": "3.17.0", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/log/src/env.ts b/packages/log/src/env.ts index cd6ea02d4..28d463bd6 100644 --- a/packages/log/src/env.ts +++ b/packages/log/src/env.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { createEnv } from "@homarr/core/infrastructure/env"; diff --git a/packages/modals-collection/package.json b/packages/modals-collection/package.json index 786c33b69..3799ff445 100644 --- a/packages/modals-collection/package.json +++ b/packages/modals-collection/package.json @@ -39,13 +39,13 @@ "next": "15.4.6", "react": "19.1.1", "react-dom": "19.1.1", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx index 547840ccd..1acac44ea 100644 --- a/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx +++ b/packages/modals-collection/src/apps/quick-add-app/quick-add-app-modal.tsx @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import type { MaybePromise } from "@homarr/common/types"; diff --git a/packages/modals-collection/src/boards/add-board-modal.tsx b/packages/modals-collection/src/boards/add-board-modal.tsx index 2b6c70cf4..919335b9b 100644 --- a/packages/modals-collection/src/boards/add-board-modal.tsx +++ b/packages/modals-collection/src/boards/add-board-modal.tsx @@ -28,10 +28,6 @@ export const AddBoardModal = createModal(({ actions }) => { const boardNameStatus = useBoardNameStatus(form.values.name); - const columnCountChecks = boardColumnCountSchema._def.checks; - const minColumnCount = columnCountChecks.find((check) => check.kind === "min")?.value; - const maxColumnCount = columnCountChecks.find((check) => check.kind === "max")?.value; - return ( { @@ -69,7 +65,12 @@ export const AddBoardModal = createModal(({ actions }) => { } /> - + { const [fileValid, setFileValid] = useState(true); const form = useZodForm( z.object({ - file: z.instanceof(File).nullable().superRefine(superRefineJsonImportFile), + file: z.file().check(checkJsonImportFile), configuration: oldmarrImportConfigurationSchema, }), { @@ -43,6 +43,8 @@ export const ImportBoardModal = createModal(({ actions }) => { return; } + // Before validation it can still be null + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!values.file) { return; } @@ -51,7 +53,7 @@ export const ImportBoardModal = createModal(({ actions }) => { const result = oldmarrConfigSchema.safeParse(JSON.parse(content)); if (!result.success) { - console.error(result.error.errors); + console.error(result.error.issues); setFileValid(false); return; } @@ -97,9 +99,7 @@ export const ImportBoardModal = createModal(({ actions }) => { } void handleSubmitAsync({ - // It's checked for null in the superrefine - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - file: values.file!, + file: values.file, configuration: values.configuration, }); })} diff --git a/packages/modals-collection/src/certificates/add-certificate-modal.tsx b/packages/modals-collection/src/certificates/add-certificate-modal.tsx index 9ec4e4533..100ee13cd 100644 --- a/packages/modals-collection/src/certificates/add-certificate-modal.tsx +++ b/packages/modals-collection/src/certificates/add-certificate-modal.tsx @@ -1,6 +1,6 @@ import { Button, FileInput, Group, Stack } from "@mantine/core"; import { IconCertificate } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { clientApi } from "@homarr/api/client"; import type { MaybePromise } from "@homarr/common/types"; @@ -8,7 +8,7 @@ import { useZodForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; import { useI18n } from "@homarr/translation/client"; -import { superRefineCertificateFile } from "@homarr/validation/certificates"; +import { checkCertificateFile } from "@homarr/validation/certificates"; interface InnerProps { onSuccess?: () => MaybePromise; @@ -18,7 +18,7 @@ export const AddCertificateModal = createModal(({ actions, innerProp const t = useI18n(); const form = useZodForm( z.object({ - file: z.instanceof(File).nullable().superRefine(superRefineCertificateFile), + file: z.file().check(checkCertificateFile), }), { initialValues: { @@ -33,8 +33,7 @@ export const AddCertificateModal = createModal(({ actions, innerProp { const formData = new FormData(); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - formData.set("file", values.file!); + formData.set("file", values.file); await mutateAsync(formData, { async onSuccess() { showSuccessNotification({ diff --git a/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx b/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx index 6748f7979..fc8567ccb 100644 --- a/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx +++ b/packages/modals-collection/src/docker/add-docker-app-to-homarr.tsx @@ -1,5 +1,5 @@ import { Avatar, Button, Group, List, LoadingOverlay, Stack, Text, TextInput } from "@mantine/core"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; diff --git a/packages/modals/package.json b/packages/modals/package.json index 8b575bf2b..aa7df33dc 100644 --- a/packages/modals/package.json +++ b/packages/modals/package.json @@ -32,7 +32,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 5ed6ed90b..5139c9340 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -31,7 +31,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/old-import/package.json b/packages/old-import/package.json index b10785881..89e991fe8 100644 --- a/packages/old-import/package.json +++ b/packages/old-import/package.json @@ -44,15 +44,15 @@ "react": "19.1.1", "react-dom": "19.1.1", "superjson": "2.2.2", - "zod": "^3.25.76", - "zod-form-data": "^2.0.7" + "zod": "^4.0.14", + "zod-form-data": "^3.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/adm-zip": "0.5.7", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/old-import/src/analyse/analyse-oldmarr-import.ts b/packages/old-import/src/analyse/analyse-oldmarr-import.ts index 1edaf11f1..5888d07f2 100644 --- a/packages/old-import/src/analyse/analyse-oldmarr-import.ts +++ b/packages/old-import/src/analyse/analyse-oldmarr-import.ts @@ -1,5 +1,5 @@ import AdmZip from "adm-zip"; -import { z } from "zod"; +import { z } from "zod/v4"; import { logger } from "@homarr/log"; import { oldmarrConfigSchema } from "@homarr/old-schema"; diff --git a/packages/old-import/src/components/initial/token-modal.tsx b/packages/old-import/src/components/initial/token-modal.tsx index a612f029c..d519d312f 100644 --- a/packages/old-import/src/components/initial/token-modal.tsx +++ b/packages/old-import/src/components/initial/token-modal.tsx @@ -1,5 +1,5 @@ import { Button, Group, PasswordInput, Stack } from "@mantine/core"; -import { z } from "zod"; +import { z } from "zod/v4"; import { useZodForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; diff --git a/packages/old-import/src/import/import-initial-oldmarr.ts b/packages/old-import/src/import/import-initial-oldmarr.ts index fdf1a79da..a42bbba83 100644 --- a/packages/old-import/src/import/import-initial-oldmarr.ts +++ b/packages/old-import/src/import/import-initial-oldmarr.ts @@ -1,4 +1,4 @@ -import type { z } from "zod"; +import type { z } from "zod/v4"; import { Stopwatch } from "@homarr/common"; import { handleTransactionsAsync } from "@homarr/db"; diff --git a/packages/old-import/src/import/input.ts b/packages/old-import/src/import/input.ts index f60cdd0f7..681227dbb 100644 --- a/packages/old-import/src/import/input.ts +++ b/packages/old-import/src/import/input.ts @@ -1,6 +1,6 @@ import SuperJSON from "superjson"; -import { z } from "zod"; import { zfd } from "zod-form-data"; +import { z } from "zod/v4"; import { initialOldmarrImportSettings } from "../settings"; diff --git a/packages/old-import/src/settings.ts b/packages/old-import/src/settings.ts index a4944562b..e1bbae154 100644 --- a/packages/old-import/src/settings.ts +++ b/packages/old-import/src/settings.ts @@ -1,5 +1,5 @@ -import { z } from "zod"; import { zfd } from "zod-form-data"; +import { z } from "zod/v4"; import { boardNameSchema } from "@homarr/validation/board"; import { createCustomErrorParams } from "@homarr/validation/form/i18n"; @@ -23,39 +23,33 @@ export const initialOldmarrImportSettings = oldmarrImportConfigurationSchema.pic export type InitialOldmarrImportSettings = z.infer; -export const superRefineJsonImportFile = (value: File | null, context: z.RefinementCtx) => { - if (!value) { - return context.addIssue({ - code: "invalid_type", - expected: "object", - received: "null", - }); - } - - if (value.type !== "application/json") { - return context.addIssue({ +export const checkJsonImportFile: z.core.CheckFn = (context) => { + if (context.value.type !== "application/json") { + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "invalidFileType", params: { expected: "JSON" }, }), + input: context.value.type, }); + return; } - if (value.size > 1024 * 1024) { - return context.addIssue({ + if (context.value.size > 1024 * 1024) { + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "fileTooLarge", params: { maxSize: "1 MB" }, }), + input: context.value.size, }); + return; } - - return null; }; export const importJsonFileSchema = zfd.formData({ - file: zfd.file().superRefine(superRefineJsonImportFile), + file: zfd.file().check(checkJsonImportFile), configuration: zfd.json(oldmarrImportConfigurationSchema), }); diff --git a/packages/old-import/src/shared.ts b/packages/old-import/src/shared.ts index 4276a510c..e752b57f8 100644 --- a/packages/old-import/src/shared.ts +++ b/packages/old-import/src/shared.ts @@ -1,2 +1,2 @@ -export { importJsonFileSchema, superRefineJsonImportFile, oldmarrImportConfigurationSchema } from "./settings"; +export { importJsonFileSchema, checkJsonImportFile, oldmarrImportConfigurationSchema } from "./settings"; export type { OldmarrImportConfiguration } from "./settings"; diff --git a/packages/old-import/src/user-schema.ts b/packages/old-import/src/user-schema.ts index f7a84c917..84e544ea3 100644 --- a/packages/old-import/src/user-schema.ts +++ b/packages/old-import/src/user-schema.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; const regexEncryptedSchema = z.string().regex(/^[a-f0-9]+\.[a-f0-9]+$/g); diff --git a/packages/old-schema/package.json b/packages/old-schema/package.json index a4c04b729..bd8bb5543 100644 --- a/packages/old-schema/package.json +++ b/packages/old-schema/package.json @@ -23,13 +23,13 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/common": "workspace:^0.1.0", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/old-schema/src/app.ts b/packages/old-schema/src/app.ts index 87bedef25..088ccca0a 100644 --- a/packages/old-schema/src/app.ts +++ b/packages/old-schema/src/app.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { tileBaseSchema } from "./tile"; diff --git a/packages/old-schema/src/config.ts b/packages/old-schema/src/config.ts index d120d31c7..f9fec28a8 100644 --- a/packages/old-schema/src/config.ts +++ b/packages/old-schema/src/config.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { oldmarrAppSchema } from "./app"; import { settingsSchema } from "./setting"; diff --git a/packages/old-schema/src/setting.ts b/packages/old-schema/src/setting.ts index f9374a6f2..171ea3b43 100644 --- a/packages/old-schema/src/setting.ts +++ b/packages/old-schema/src/setting.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; const baseSearchEngineSchema = z.object({ properties: z.object({ diff --git a/packages/old-schema/src/tile.ts b/packages/old-schema/src/tile.ts index fc0740765..0d835c3ac 100644 --- a/packages/old-schema/src/tile.ts +++ b/packages/old-schema/src/tile.ts @@ -1,8 +1,8 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { objectKeys } from "@homarr/common"; -const createAreaSchema = ( +const createAreaSchema = ( type: TType, propertiesSchema: TPropertiesSchema, ) => @@ -58,7 +58,7 @@ export const tileBaseSchema = z.object({ export type SizedShape = z.infer; -export const boardSizes = objectKeys(shapeSchema._def.shape()); +export const boardSizes = objectKeys(shapeSchema.def.shape); export type BoardSize = (typeof boardSizes)[number]; export const getBoardSizeName = (size: BoardSize) => { diff --git a/packages/old-schema/src/widget.ts b/packages/old-schema/src/widget.ts index 96a7396ea..dfff00751 100644 --- a/packages/old-schema/src/widget.ts +++ b/packages/old-schema/src/widget.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { tileBaseSchema } from "./tile"; @@ -33,7 +33,7 @@ export const oldmarrWidgetSchema = z .object({ id: z.string(), type: z.enum(oldmarrWidgetKinds), - properties: z.record(z.unknown()), + properties: z.record(z.string(), z.unknown()), }) .and(tileBaseSchema); diff --git a/packages/ping/package.json b/packages/ping/package.json index 4c046adbe..86ddbce28 100644 --- a/packages/ping/package.json +++ b/packages/ping/package.json @@ -30,7 +30,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/redis/package.json b/packages/redis/package.json index 99d695f9b..fc5686995 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -34,7 +34,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/request-handler/package.json b/packages/request-handler/package.json index 48f3b7de9..af4b5ed12 100644 --- a/packages/request-handler/package.json +++ b/packages/request-handler/package.json @@ -38,7 +38,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/request-handler/src/minecraft-server-status.ts b/packages/request-handler/src/minecraft-server-status.ts index 22eaf7a38..4cff54ed8 100644 --- a/packages/request-handler/src/minecraft-server-status.ts +++ b/packages/request-handler/src/minecraft-server-status.ts @@ -1,5 +1,5 @@ import dayjs from "dayjs"; -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTimeout } from "@homarr/common"; diff --git a/packages/request-handler/src/releases.ts b/packages/request-handler/src/releases.ts index 8eeee1b0e..74158c05f 100644 --- a/packages/request-handler/src/releases.ts +++ b/packages/request-handler/src/releases.ts @@ -2,8 +2,8 @@ import dayjs from "dayjs"; import type { IntegrationKindByCategory } from "@homarr/definitions"; import { getIconUrl } from "@homarr/definitions"; -import { createIntegrationAsync } from "@homarr/integrations"; import type { ReleasesResponse } from "@homarr/integrations"; +import { createIntegrationAsync } from "@homarr/integrations"; import { createCachedIntegrationRequestHandler } from "./lib/cached-integration-request-handler"; diff --git a/packages/request-handler/src/rss-feeds.ts b/packages/request-handler/src/rss-feeds.ts index 7a565cb5f..1efdcc151 100644 --- a/packages/request-handler/src/rss-feeds.ts +++ b/packages/request-handler/src/rss-feeds.ts @@ -1,7 +1,7 @@ import type { FeedData, FeedEntry } from "@extractus/feed-extractor"; import { extract } from "@extractus/feed-extractor"; import dayjs from "dayjs"; -import { z } from "zod"; +import { z } from "zod/v4"; import type { Modify } from "@homarr/common/types"; import { logger } from "@homarr/log"; diff --git a/packages/request-handler/src/stock-price.ts b/packages/request-handler/src/stock-price.ts index 8219881d9..335e1a78e 100644 --- a/packages/request-handler/src/stock-price.ts +++ b/packages/request-handler/src/stock-price.ts @@ -1,5 +1,5 @@ import dayjs from "dayjs"; -import { z } from "zod"; +import { z } from "zod/v4"; import { fetchWithTimeout } from "@homarr/common"; diff --git a/packages/server-settings/package.json b/packages/server-settings/package.json index a15729112..7d79a74f7 100644 --- a/packages/server-settings/package.json +++ b/packages/server-settings/package.json @@ -29,7 +29,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/settings/package.json b/packages/settings/package.json index 51bd610c4..7b63ee319 100644 --- a/packages/settings/package.json +++ b/packages/settings/package.json @@ -35,7 +35,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index c01fae78d..bba9536ca 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -37,7 +37,7 @@ "@mantine/hooks": "^8.2.4", "@mantine/spotlight": "^8.2.4", "@tabler/icons-react": "^3.34.1", - "jotai": "^2.13.0", + "jotai": "^2.13.1", "next": "15.4.6", "react": "19.1.1", "react-dom": "19.1.1", @@ -47,7 +47,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/translation/package.json b/packages/translation/package.json index b048005ff..1002d3d89 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -41,7 +41,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/translation/src/lang/ca.json b/packages/translation/src/lang/ca.json index 4e9df1e5d..c4c9d1f03 100644 --- a/packages/translation/src/lang/ca.json +++ b/packages/translation/src/lang/ca.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 76b886246..d30d91529 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -944,6 +944,14 @@ "topic": { "label": "主题", "newLabel": "新主题" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json index a43023884..d23733771 100644 --- a/packages/translation/src/lang/cs.json +++ b/packages/translation/src/lang/cs.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index fcdc66c4e..533480009 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -944,6 +944,14 @@ "topic": { "label": "Emne", "newLabel": "Nyt emne" + }, + "opnsenseApiKey": { + "label": "API-nøgle (Key)", + "newLabel": "Ny API-nøgle (Key)" + }, + "opnsenseApiSecret": { + "label": "API-nøgle (Secret)", + "newLabel": "Ny API-nøgle (Key)" } } }, @@ -2449,15 +2457,15 @@ "option": {} }, "systemResources": { - "name": "", - "description": "", + "name": "Systemressourcer", + "description": "CPU, Hukommelse, Disk og andet hardwareforbrug af dit system", "option": {}, "card": { - "cpu": "", - "memory": "", - "network": "", - "up": "", - "down": "" + "cpu": "CPU", + "memory": "MEM", + "network": "NET", + "up": "OP", + "down": "NED" } } }, diff --git a/packages/translation/src/lang/de-CH.json b/packages/translation/src/lang/de-CH.json index 748db6f15..b030efab8 100644 --- a/packages/translation/src/lang/de-CH.json +++ b/packages/translation/src/lang/de-CH.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/de.json b/packages/translation/src/lang/de.json index 326f7d000..22a72d12e 100644 --- a/packages/translation/src/lang/de.json +++ b/packages/translation/src/lang/de.json @@ -944,6 +944,14 @@ "topic": { "label": "Thema", "newLabel": "Neues Thema erstellen" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/el.json b/packages/translation/src/lang/el.json index cd3ac4019..4039a02b1 100644 --- a/packages/translation/src/lang/el.json +++ b/packages/translation/src/lang/el.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/en-gb.json b/packages/translation/src/lang/en-gb.json index 5634341af..79e67975e 100644 --- a/packages/translation/src/lang/en-gb.json +++ b/packages/translation/src/lang/en-gb.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 03590099d..e9a364d03 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -1003,6 +1003,7 @@ } }, "common": { + "success": "Success", "beta": "Beta", "error": "Error", "action": { @@ -3260,14 +3261,70 @@ "minutes": "Every {interval, plural, =1 {minute} other {# minutes}}", "hours": "Every {interval, plural, =1 {hour} other {# hours}}", "midnight": "Every day at midnight", - "weeklyMonday": "Every week on monday" + "weeklyMonday": "Every week on monday", + "update": { + "success": { + "message": "Interval updated successfully" + }, + "error": { + "message": "Failed to update interval" + } + } }, "settings": { "title": "Task settings for {jobName}" }, "field": { + "name": { + "label": "Name" + }, "interval": { "label": "Schedule interval" + }, + "lastExecution": { + "label": "Last Execution" + }, + "actions": { + "label": "Actions" + } + }, + "table": { + "search": "Search {count} tasks..." + }, + "action": { + "refresh": { + "label": "Refresh" + } + }, + "refresh": { + "success": { + "message": "Tasks refreshed successfully" + }, + "error": { + "message": "Failed to refresh tasks" + } + }, + "trigger": { + "success": { + "message": "Task triggered successfully" + }, + "error": { + "message": "Failed to trigger task" + } + }, + "enable": { + "success": { + "message": "Task enabled successfully" + } + }, + "disable": { + "success": { + "message": "Task disabled successfully" + } + }, + "toggle": { + "error": { + "message": "Failed to toggle task status" } } }, @@ -3776,6 +3833,9 @@ }, "tools": { "label": "Tools", + "tasks": { + "label": "Tasks" + }, "docker": { "label": "Docker" }, diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json index d8536c2f5..d94f2dd1a 100644 --- a/packages/translation/src/lang/es.json +++ b/packages/translation/src/lang/es.json @@ -69,15 +69,15 @@ "notification": { "success": { "title": "Usuario creado", - "message": "" + "message": "El usuario se creó con éxito" }, "error": { - "title": "" + "title": "Error al crear el usuario" } } }, "group": { - "title": "", + "title": "Grupo externo", "subtitle": "Especifique el grupo que debe ser usado para usuarios externos.", "form": { "name": { @@ -92,7 +92,7 @@ }, "finish": { "title": "Finalizar la configuración", - "subtitle": "", + "subtitle": "¡Estás listo para empezar!", "description": "Ha completado el proceso de configuración con éxito. Puede empezar a utilizar Homarr. Seleccione su siguiente paso:", "action": { "goToBoard": "Ir al tablero {name}", @@ -168,12 +168,12 @@ "labelWith": "Iniciar sesión con {provider}", "notification": { "success": { - "title": "", - "message": "" + "title": "Inicio de sesión exitoso", + "message": "Has iniciado sesión" }, "error": { "title": "Inicio de sesión fallido", - "message": "" + "message": "Error al iniciar sesión" } }, "forgotPassword": { @@ -202,27 +202,27 @@ "message": "La contraseña ha sido cambiada correctamente" }, "error": { - "message": "" + "message": "No se puede cambiar la contraseña" } } }, "changeHomeBoard": { "notification": { "success": { - "message": "" + "message": "Tablero de inicio cambiado correctamente" }, "error": { - "message": "" + "message": "No se pudo cambiar el tablero de inicio" } } }, "changeSearchPreferences": { "notification": { "success": { - "message": "" + "message": "Preferencias de búsqueda cambiadas con éxito" }, "error": { - "message": "" + "message": "No se pueden cambiar las preferencias de búsqueda" } } }, @@ -239,7 +239,7 @@ "changePingIconsEnabled": { "notification": { "success": { - "message": "" + "message": "Iconos de ping cambiados correctamente" }, "error": { "message": "" @@ -368,7 +368,7 @@ } }, "integration": { - "title": "", + "title": "Integraciones", "item": { "create": { "label": "", @@ -596,7 +596,7 @@ "label": "Nombre" }, "description": { - "label": "" + "label": "Descripción" }, "url": { "label": "" @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, @@ -2344,7 +2352,7 @@ "openProjectPage": "", "openReleasePage": "", "releaseDescription": "", - "projectDescription": "", + "projectDescription": "Descripción del proyecto", "created": "", "error": { "label": "", diff --git a/packages/translation/src/lang/et.json b/packages/translation/src/lang/et.json index 76940cb56..77dadc14b 100644 --- a/packages/translation/src/lang/et.json +++ b/packages/translation/src/lang/et.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/fr.json b/packages/translation/src/lang/fr.json index 334881acf..e0f97e084 100644 --- a/packages/translation/src/lang/fr.json +++ b/packages/translation/src/lang/fr.json @@ -944,6 +944,14 @@ "topic": { "label": "Sujet", "newLabel": "Nouveau sujet" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index 758b6a947..edcdc603d 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -944,6 +944,14 @@ "topic": { "label": "נושא", "newLabel": "נושא חדש" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/hr.json b/packages/translation/src/lang/hr.json index bd97026c5..5677c211f 100644 --- a/packages/translation/src/lang/hr.json +++ b/packages/translation/src/lang/hr.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/hu.json b/packages/translation/src/lang/hu.json index a7329c1e2..010ce65fd 100644 --- a/packages/translation/src/lang/hu.json +++ b/packages/translation/src/lang/hu.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index b10949e63..9066c6705 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/ja.json b/packages/translation/src/lang/ja.json index 72c62f36e..252184477 100644 --- a/packages/translation/src/lang/ja.json +++ b/packages/translation/src/lang/ja.json @@ -944,6 +944,14 @@ "topic": { "label": "トピック", "newLabel": "新規トピック" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/ko.json b/packages/translation/src/lang/ko.json index 89fc7e991..bf783fe74 100644 --- a/packages/translation/src/lang/ko.json +++ b/packages/translation/src/lang/ko.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/lt.json b/packages/translation/src/lang/lt.json index 286e171fd..ea7c93849 100644 --- a/packages/translation/src/lang/lt.json +++ b/packages/translation/src/lang/lt.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/lv.json b/packages/translation/src/lang/lv.json index 31ac4e9b0..ddbad5c24 100644 --- a/packages/translation/src/lang/lv.json +++ b/packages/translation/src/lang/lv.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index 35258ec6e..6364d3ad5 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index 2a03de304..460ab789f 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/pl.json b/packages/translation/src/lang/pl.json index 9c2b969ac..40892fa14 100644 --- a/packages/translation/src/lang/pl.json +++ b/packages/translation/src/lang/pl.json @@ -307,12 +307,12 @@ "name": "Nazwa", "members": "Członkowie", "homeBoard": { - "label": "", - "description": "" + "label": "Tablica główna", + "description": "Tylko tablice dostępne dla grupy mogą być wybrane" }, "mobileBoard": { - "label": "", - "description": "" + "label": "Tablica mobilna", + "description": "Tylko tablice dostępne dla grupy mogą być wybrane" } }, "permission": { @@ -514,12 +514,12 @@ "board": { "notification": { "success": { - "title": "", - "message": "" + "title": "Ustawienia zostały zapisane", + "message": "Ustawienia tablicy zapisane pomyślnie" }, "error": { - "title": "", - "message": "" + "title": "Nie udało się zapisać ustawień", + "message": "Nie można zapisać ustawień tablicy" } } } @@ -527,17 +527,17 @@ "changePosition": { "notification": { "success": { - "message": "" + "message": "Pozycja zmieniona pomyślnie" }, "error": { - "message": "" + "message": "Nie można zmienić pozycji" } } } }, "defaultGroup": { - "name": "", - "description": "" + "name": "Domyślna grupa", + "description": "{name} - Wszyscy zalogowani użytkownicy" } }, "app": { @@ -603,8 +603,8 @@ }, "useDifferentUrlForPing": { "checkbox": { - "label": "", - "description": "" + "label": "Użyj innego adresu URL do pingu", + "description": "Przydatne, jeśli do Homarr'a można uzyskać bezpośredni dostępny za pomocą wewnętrznej nazwy hosta lub sieci, aby uniknąć wykorzystania przepustowości łącza" } } }, @@ -612,17 +612,17 @@ "select": { "label": "Wybierz aplikację", "notFound": "Nie znaleziono aplikacji", - "search": "", - "noResults": "", - "action": "", - "title": "" + "search": "Znajdź aplikację", + "noResults": "Brak wyników", + "action": "Wybierz {app}", + "title": "Wybierz aplikację do dodania do tej tablicy" }, "create": { - "title": "", - "description": "", - "action": "" + "title": "Stwórz nową aplikację", + "description": "Stwórz nową aplikację", + "action": "Otwórz tworzenie aplikacji" }, - "add": "" + "add": "Dodaj aplikację" } }, "integration": { @@ -687,11 +687,11 @@ "description": "Integracja \"{kind}\" może być używana z wyszukiwarkami. Zaznacz to, aby automatycznie skonfigurować wyszukiwarkę." }, "createApp": { - "label": "", - "description": "" + "label": "Stwórz aplikację", + "description": "Utwórz aplikację o tej samej nazwie i ikonie, co integracja. Poniższe pole pozostaw puste, aby utworzyć aplikację z URL integracji." }, "appHref": { - "placeholder": "" + "placeholder": "Niestandardowy adres URL aplikacji" } }, "action": { @@ -705,75 +705,75 @@ "error": { "common": { "cause": { - "title": "" + "title": "Więcej szczegółów o przyczynie" } }, "unknown": { - "title": "", - "description": "" + "title": "Nieznany błąd", + "description": "Wystąpił nieznany błąd, otwórz przyczynę poniżej, aby zobaczyć więcej szczegółów" }, "parse": { - "title": "", - "description": "" + "title": "Błąd przetwarzania", + "description": "Odpowiedź nie mogła zostać przetworzona. Sprawdź, czy adres URL wskazuje na bazowy adres URL usługi." }, "authorization": { - "title": "", - "description": "" + "title": "Błąd autoryzacji", + "description": "Zapytanie nie zostało autoryzowane. Sprawdź, czy dane uwierzytelniające są poprawne i czy mają odpowiednie uprawnienia." }, "statusCode": { - "title": "", - "description": "", - "otherDescription": "", + "title": "Błąd odpowiedzi", + "description": "Otrzymano nieoczekiwaną odpowiedź {statusCode} ({reason}) od . Sprawdź, czy adres URL wskazuje na bazowy adres URL integracji.", + "otherDescription": "Otrzymano nieoczekiwaną odpowiedź {statusCode} od . Sprawdź, czy adres URL wskazuje na bazowy adres URL integracji.", "reason": { - "badRequest": "", - "notFound": "", - "tooManyRequests": "", - "internalServerError": "", - "serviceUnavailable": "", - "gatewayTimeout": "" + "badRequest": "Błędne zapytanie", + "notFound": "Nie znaleziono", + "tooManyRequests": "Zbyt wiele zapytań", + "internalServerError": "Wewnętrzny błąd serwera", + "serviceUnavailable": "Usługa niedostępna", + "gatewayTimeout": "Upłynął limit czasu bramki" } }, "certificate": { - "title": "", + "title": "Błędny certyfikat", "description": { - "expired": "", - "notYetValid": "", - "untrusted": "", - "hostnameMismatch": "" + "expired": "Certyfikat stracił ważność", + "notYetValid": "Certyfikat nie jest jeszcze ważny", + "untrusted": "Certyfikat nie jest zaufany", + "hostnameMismatch": "Nazwa hosta certyfikatu nie jest zgodna z adresem URL" }, "alert": { "permission": { - "title": "", - "message": "" + "title": "Brak wymaganych uprawnień", + "message": "Nie masz uprawnień, aby konfigurować certyfikaty. Skontaktuj się z administratorem, aby przesłać wymagany certyfikat główny." }, "hostnameMismatch": { - "title": "", - "message": "" + "title": "Nazwa hosta jest niezgodna", + "message": "Nazwa hosta w certyfikacie nie pasuje do nazwy hosta, z którą próbujesz się połączyć. Może to wskazywać na zagrożenie bezpieczeństwa, ale nadal możesz zaufać temu certyfikatowi, jeśli chcesz." }, "extract": { - "title": "", + "title": "Wydobycie certyfikatu CA nie powiodło się", "message": "" } }, "action": { "retry": { - "label": "" + "label": "Spróbuj utworzyć ponownie" }, "trust": { - "label": "" + "label": "Zaufaj certyfikatowi" }, "upload": { - "label": "" + "label": "Prześlij certyfikat" } }, "hostnameMismatch": { "confirm": { - "title": "", - "message": "" + "title": "Zaufaj mimo niezgodności nazwy hosta", + "message": "Czy na pewno chcesz zaufać certyfikatowi z niezgodną nazwą hosta?" }, "notification": { "success": { - "title": "", + "title": "Zaufany certyfikat", "message": "" }, "error": { @@ -799,7 +799,7 @@ } }, "details": { - "title": "", + "title": "Szczegóły", "description": "", "content": { "action": "", @@ -808,7 +808,7 @@ } }, "request": { - "title": "", + "title": "Błąd zapytania", "description": { "connection": { "hostUnreachable": "", @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/pt.json b/packages/translation/src/lang/pt.json index 05e2e033e..2e178832f 100644 --- a/packages/translation/src/lang/pt.json +++ b/packages/translation/src/lang/pt.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/ro.json b/packages/translation/src/lang/ro.json index 7e543d14f..78d8d46d9 100644 --- a/packages/translation/src/lang/ro.json +++ b/packages/translation/src/lang/ro.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/ru.json b/packages/translation/src/lang/ru.json index d56b6ffeb..21f8a0741 100644 --- a/packages/translation/src/lang/ru.json +++ b/packages/translation/src/lang/ru.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/sk.json b/packages/translation/src/lang/sk.json index 0345ba092..06b2cd353 100644 --- a/packages/translation/src/lang/sk.json +++ b/packages/translation/src/lang/sk.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/sl.json b/packages/translation/src/lang/sl.json index 8d3103da3..8749e4a99 100644 --- a/packages/translation/src/lang/sl.json +++ b/packages/translation/src/lang/sl.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/sv.json b/packages/translation/src/lang/sv.json index 5e2dbf7a3..6f36eeca3 100644 --- a/packages/translation/src/lang/sv.json +++ b/packages/translation/src/lang/sv.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index 9c3e58091..b06ba9b0c 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -944,6 +944,14 @@ "topic": { "label": "Konu", "newLabel": "Yeni konu" + }, + "opnsenseApiKey": { + "label": "API Anahtarı (Anahtar)", + "newLabel": "Yeni API Anahtarı (Anahtar)" + }, + "opnsenseApiSecret": { + "label": "API Anahtarı (Gizli Anahtar)", + "newLabel": "Yeni API Anahtarı (Gizli Anahtar)" } } }, @@ -2454,10 +2462,10 @@ "option": {}, "card": { "cpu": "İşlemci", - "memory": "", - "network": "", - "up": "", - "down": "" + "memory": "BELLEK", + "network": "AĞ", + "up": "YÜKLEME", + "down": "İNDİRME" } } }, diff --git a/packages/translation/src/lang/uk.json b/packages/translation/src/lang/uk.json index 28b423226..845979c2a 100644 --- a/packages/translation/src/lang/uk.json +++ b/packages/translation/src/lang/uk.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json index c2f240f9a..4bfbd8bdd 100644 --- a/packages/translation/src/lang/vi.json +++ b/packages/translation/src/lang/vi.json @@ -2,77 +2,77 @@ "init": { "step": { "start": { - "title": "", - "subtitle": "", - "description": "", + "title": "Chào mừng đến với Homarr", + "subtitle": "Hãy bắt đầu cài đặt phiên bản Homarr của bạn.", + "description": "Để bắt đầu, hãy chọn cách bạn muốn cài đặt phiên bản Homarr của mình.", "action": { - "scratch": "", - "importOldmarr": "" + "scratch": "Bắt đầu từ đầu", + "importOldmarr": "Nhập từ Homarr trước phiên bản 1.0" } }, "import": { - "title": "", - "subtitle": "", + "title": "Nhập dữ liệu", + "subtitle": "Bạn có thể nhập dữ liệu từ một phiên bản Homarr có sẵn.", "dropzone": { - "title": "", - "description": "" + "title": "Kéo tệp tin zip vào đây hoặc nhấp để chọn", + "description": "Tệp tin zip đã tải lên sẽ được xử lý và bạn sẽ có thể chọn những gì bạn muốn nhập" }, "fileInfo": { "action": { - "change": "" + "change": "Thay đổi tập tin" } }, "importSettings": { - "title": "", - "description": "" + "title": "Nhập cài đặt", + "description": "Cấu hình hành vi nhập dữ liệu" }, "boardSelection": { - "title": "", - "description": "", + "title": "Tìm thấy {count} bảng", + "description": "Chọn tất cả các bảng với kích thước bạn muốn nhập", "action": { - "selectAll": "", - "unselectAll": "" + "selectAll": "Chọn tất cả", + "unselectAll": "Bỏ chọn tất cả" } }, "summary": { "title": "", "description": "", "action": { - "import": "" + "import": "Xác nhận nhập và tiếp tục" }, "entities": { "apps": "Ứng dụng", "boards": "Bảng", - "integrations": "", + "integrations": "Tích hợp", "credentialUsers": "" } }, "tokenModal": { - "title": "", + "title": "Nhập token nhập", "field": { "token": { "label": "Mã thông báo", - "description": "" + "description": "Nhập token nhập được hiển thị từ phiên bản homarr trước đó của bạn" } }, "notification": { "error": { - "title": "", - "message": "" + "title": "Token không hợp lệ", + "message": "Token bạn nhập không đúng" } } } }, "user": { - "title": "", + "title": "Người dùng quản trị", "subtitle": "", "notification": { "success": { - "title": "", - "message": "" + "title": "Đã tạo người dùng", + "message": "Người dùng đã được tạo thành công" }, "error": { - "title": "" + "title": "Tạo người dùng không thành công" } } }, @@ -91,41 +91,41 @@ "subtitle": "" }, "finish": { - "title": "", - "subtitle": "", + "title": "Hoàn tất cài đặt", + "subtitle": "Đã sẵn sàng để tiếp tục!", "description": "", "action": { "goToBoard": "", "createBoard": "", "inviteUser": "", - "docs": "" + "docs": "Hãy đọc tài liệu này" } } }, - "backToStart": "" + "backToStart": "Trở lại từ đầu" }, "user": { "title": "Người dùng", "name": "Người dùng", "page": { "login": { - "title": "", - "subtitle": "" + "title": "Đăng nhập vào tài khoản của bạn", + "subtitle": "Chào mừng trở lại! Hãy nhập thông tin đăng nhập của bạn" }, "invite": { - "title": "", - "subtitle": "", - "description": "" + "title": "Tham gia Homarr", + "subtitle": "Chào mừng đến với Homarr! Hãy tạo tài khoản của bạn", + "description": "Bạn được mời bởi {username}" }, "init": { - "title": "", - "subtitle": "" + "title": "Cài đặt Homarr mới", + "subtitle": "Hãy tạo tài khoản quản trị ban đầu" } }, "field": { "email": { "label": "E-mail", - "verified": "" + "verified": "Đã xác minh" }, "username": { "label": "Tên người dùng" @@ -133,18 +133,18 @@ "password": { "label": "Mật khẩu", "requirement": { - "length": "", + "length": "Bao gồm ít nhất 8 kí tự", "lowercase": "Bao gồm chữ thường", "uppercase": "Bao gồm chữ in hoa", "number": "Bao gồm số", - "special": "" + "special": "Bao gồm kí tự đặc biệt" } }, "passwordConfirm": { "label": "Xác nhận mật khẩu" }, "previousPassword": { - "label": "" + "label": "Mật khẩu trước đây" }, "homeBoard": { "label": "" @@ -153,31 +153,31 @@ "label": "" }, "defaultSearchEngine": { - "label": "" + "label": "Công cụ tìm kiếm mặc định" }, "openSearchInNewTab": { "label": "" } }, "error": { - "usernameTaken": "" + "usernameTaken": "Tên người dùng đã được sử dụng" }, "action": { "login": { "label": "Đăng nhập", - "labelWith": "", + "labelWith": "Đăng nhập với {provider}", "notification": { "success": { - "title": "", - "message": "" + "title": "Đăng nhập thành công", + "message": "Bạn đã đăng nhập" }, "error": { - "title": "", + "title": "Đăng nhập không thành công", "message": "" } }, "forgotPassword": { - "label": "", + "label": "Quên mật khẩu?", "description": "" } }, @@ -186,23 +186,23 @@ "notification": { "success": { "title": "Tài khoản đã được tạo", - "message": "" + "message": "Vui lòng đăng nhập để tiếp tục" }, "error": { - "title": "", - "message": "" + "title": "Tạo tài khoản thất bại", + "message": "Tài khoản của bạn không thể được tạo" } } }, "create": "Tạo người dùng", "changePassword": { - "label": "", + "label": "Thay đổi mật khẩu", "notification": { "success": { - "message": "" + "message": "Thay đổi mật khẩu thành công" }, "error": { - "message": "" + "message": "Không thể thay đổi mật khẩu" } } }, @@ -219,20 +219,20 @@ "changeSearchPreferences": { "notification": { "success": { - "message": "" + "message": "Cài đặt tìm kiếm đã được thay đổi thành công" }, "error": { - "message": "" + "message": "Không thể thay đổi cài đặt tìm kiếm" } } }, "changeFirstDayOfWeek": { "notification": { "success": { - "message": "" + "message": "Ngày đầu tiên của tuần đã được thay đổi thành công" }, "error": { - "message": "" + "message": "Không thể thay đổi ngày đầu tiên của tuần" } } }, @@ -248,29 +248,29 @@ }, "manageAvatar": { "changeImage": { - "label": "", + "label": "Thay đổi hình ảnh", "notification": { "success": { - "message": "" + "message": "Thay đổi hình ảnh thành công" }, "error": { - "message": "" + "message": "Không thể thay đổi hình ảnh" }, "toLarge": { - "title": "", - "message": "" + "title": "Hình ảnh quá lớn", + "message": "Kích thước tối đa của ảnh là {size}" } } }, "removeImage": { - "label": "", - "confirm": "", + "label": "Xóa ảnh", + "confirm": "Bạn có chắc chắn muốn xoá hình ảnh này không?", "notification": { "success": { - "message": "" + "message": "Hình ảnh được xóa thành công" }, "error": { - "message": "" + "message": "Không thể xóa hình ảnh" } } } @@ -278,34 +278,34 @@ "editProfile": { "notification": { "success": { - "message": "" + "message": "Hô sơ được cập nhật thành công" }, "error": { - "message": "" + "message": "Không thể cập nhật hồ sơ" } } }, "delete": { - "label": "", - "description": "", - "confirm": "" + "label": "Xóa người dùng vĩnh viễn", + "description": "Xóa người dùng này bao gồm cài đặt của họ. Sẽ không xóa các bảng. Người dùng sẽ không được thông báo.", + "confirm": "Bạn có chắc chắn muốn xóa tài khoản {username} cùng với các cài đặt?" }, "select": { - "label": "", - "notFound": "" + "label": "Chọn tài khoản", + "notFound": "Không tìm thấy tài khoản" }, "transfer": { - "label": "" + "label": "Chọn chủ sở hữu mới" } } }, "group": { - "title": "", - "name": "", - "search": "", + "title": "Các nhóm", + "name": "Nhóm", + "search": "Tìm một nhóm", "field": { "name": "Tên", - "members": "", + "members": "Thành viên", "homeBoard": { "label": "", "description": "" @@ -320,8 +320,8 @@ "title": "Quản trị viên", "item": { "admin": { - "label": "", - "description": "" + "label": "Quản trị viên", + "description": "Thành viên với quyền này có toàn quyền truy cập vào các tính năng và cài đặt" } } }, @@ -329,11 +329,11 @@ "title": "Ứng dụng", "item": { "create": { - "label": "", - "description": "" + "label": "Tạo ứng dụng", + "description": "Cho phép thành viên tạo ứng dụng" }, "use-all": { - "label": "", + "label": "Sử dụng tất cả các ứng dụng", "description": "" }, "modify-all": { @@ -342,7 +342,7 @@ }, "full-all": { "label": "", - "description": "" + "description": "Cho phép thành viên quản lý, tạo và xóa mọi ứng dụng" } } }, @@ -396,29 +396,29 @@ "description": "" }, "view-all": { - "label": "", - "description": "" + "label": "Xem tất cả media", + "description": "Cho phép thành viên xem tất cả media" }, "full-all": { - "label": "", - "description": "" + "label": "Toàn quyền truy cập media", + "description": "Cho phép thành viên quản lý và xóa mọi media" } } }, "other": { - "title": "", + "title": "Khác", "item": { "view-logs": { - "label": "", - "description": "" + "label": "Xem nhật ký", + "description": "Cho phép thành viên xem nhật ký" } } }, "search-engine": { - "title": "", + "title": "Công cụ tìm kiếm", "item": { "create": { - "label": "", + "label": "Tạo công cụ tìm kiếm", "description": "" }, "modify-all": { @@ -465,14 +465,14 @@ } }, "addMember": { - "label": "" + "label": "Thêm thành viên" }, "removeMember": { - "label": "", + "label": "Xóa thành viên", "confirm": "" }, "delete": { - "label": "", + "label": "Xóa nhóm", "description": "", "confirm": "", "notification": { @@ -527,31 +527,31 @@ "changePosition": { "notification": { "success": { - "message": "" + "message": "Thay đổi vị trí thành công" }, "error": { - "message": "" + "message": "Không thể thay đổi vị trí" } } } }, "defaultGroup": { - "name": "", + "name": "Nhóm mặc định", "description": "" } }, "app": { - "search": "", + "search": "Tim một ứng dụng", "page": { "list": { "title": "Ứng dụng", "noResults": { "title": "", - "action": "" + "action": "Tạo ứng dụng của bạn trước" } }, "create": { - "title": "", + "title": "Ứng dụng mới", "notification": { "success": { "title": "", @@ -596,25 +596,25 @@ "label": "Tên" }, "description": { - "label": "" + "label": "Thông tin chi tiết" }, "url": { - "label": "" + "label": "Url" }, "useDifferentUrlForPing": { "checkbox": { "label": "", - "description": "" + "description": "Hữu ích nếu Homarr có thể truy cập trực tiếp bằng tên máy chủ nội bộ hoặc mạng để tránh sử dụng băng thông của ISP" } } }, "action": { "select": { - "label": "", - "notFound": "", + "label": "Chọn ứng dụng", + "notFound": "Không tìm thấy ứng dụng", "search": "", - "noResults": "", - "action": "", + "noResults": "Không có kết quả", + "action": "Chọn {app}", "title": "" }, "create": { @@ -680,14 +680,14 @@ "label": "Tên" }, "url": { - "label": "" + "label": "Url" }, "attemptSearchEngineCreation": { - "label": "", + "label": "Tạo công cụ tìm kiếm", "description": "" }, "createApp": { - "label": "", + "label": "Tạo ứng dụng", "description": "" }, "appHref": { @@ -699,8 +699,8 @@ }, "testConnection": { "action": { - "create": "", - "edit": "" + "create": "Kiểm tra kết nối và tạo", + "edit": "Kiểm tra kết nối và lưu" }, "error": { "common": { @@ -709,11 +709,11 @@ } }, "unknown": { - "title": "", + "title": "Lỗi không xác định", "description": "" }, "parse": { - "title": "", + "title": "Lỗi cú pháp", "description": "" }, "authorization": { @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index 8c8acb2b9..825fe6fd0 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -944,6 +944,14 @@ "topic": { "label": "", "newLabel": "" + }, + "opnsenseApiKey": { + "label": "", + "newLabel": "" + }, + "opnsenseApiSecret": { + "label": "", + "newLabel": "" } } }, diff --git a/packages/ui/package.json b/packages/ui/package.json index afef8d01c..204e2b677 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -45,7 +45,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/css-modules": "^1.0.5", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/validation/package.json b/packages/validation/package.json index 2b3cfb717..213a75d81 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -24,14 +24,14 @@ "dependencies": { "@homarr/definitions": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", - "zod": "^3.25.76", - "zod-form-data": "^2.0.7" + "zod": "^4.0.14", + "zod-form-data": "^3.0.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/validation/src/app.ts b/packages/validation/src/app.ts index c50b17fe0..21a4335be 100644 --- a/packages/validation/src/app.ts +++ b/packages/validation/src/app.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const appHrefSchema = z .string() diff --git a/packages/validation/src/board.ts b/packages/validation/src/board.ts index 87facae3e..b538a7076 100644 --- a/packages/validation/src/board.ts +++ b/packages/validation/src/board.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { backgroundImageAttachments, diff --git a/packages/validation/src/certificates.ts b/packages/validation/src/certificates.ts index 283d03a69..9dab3321c 100644 --- a/packages/validation/src/certificates.ts +++ b/packages/validation/src/certificates.ts @@ -1,48 +1,44 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { createCustomErrorParams } from "./form/i18n"; export const certificateValidFileNameSchema = z.string().regex(/^[\w\-. ]+$/); -export const superRefineCertificateFile = (value: File | null, context: z.RefinementCtx) => { - if (!value) { - return context.addIssue({ - code: "invalid_type", - expected: "object", - received: "null", - }); - } - - const result = certificateValidFileNameSchema.safeParse(value.name); +export const checkCertificateFile: z.core.CheckFn = (context) => { + const result = certificateValidFileNameSchema.safeParse(context.value.name); if (!result.success) { - return context.addIssue({ + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "invalidFileName", params: {}, }), + input: context.value.name, }); + return; } - if (!value.name.endsWith(".crt") && !value.name.endsWith(".pem")) { - return context.addIssue({ + if (!context.value.name.endsWith(".crt") && !context.value.name.endsWith(".pem")) { + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "invalidFileType", params: { expected: ".crt" }, }), + input: context.value.name, }); + return; } - if (value.size > 1024 * 1024) { - return context.addIssue({ + if (context.value.size > 1024 * 1024) { + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "fileTooLarge", params: { maxSize: "1 MB" }, }), + input: context.value.size, }); + return; } - - return null; }; diff --git a/packages/validation/src/common.ts b/packages/validation/src/common.ts index 20c7a175b..10cfb995c 100644 --- a/packages/validation/src/common.ts +++ b/packages/validation/src/common.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const paginatedSchema = z.object({ search: z.string().optional(), diff --git a/packages/validation/src/enums.ts b/packages/validation/src/enums.ts index 988198adc..423c28855 100644 --- a/packages/validation/src/enums.ts +++ b/packages/validation/src/enums.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; type CouldBeReadonlyArray = T[] | readonly T[]; @@ -6,6 +6,6 @@ export const zodEnumFromArray = (array: CouldBeReadonlyArray(array: CouldBeReadonlyArray) => +export const zodUnionFromArray = (array: CouldBeReadonlyArray) => // eslint-disable-next-line @typescript-eslint/no-non-null-assertion z.union([array[0]!, array[1]!, ...array.slice(2)]); diff --git a/packages/validation/src/form/i18n.spec.ts b/packages/validation/src/form/i18n.spec.ts new file mode 100644 index 000000000..3ff2cba94 --- /dev/null +++ b/packages/validation/src/form/i18n.spec.ts @@ -0,0 +1,114 @@ +import { describe, expect, test } from "vitest"; +import { z } from "zod/v4"; + +import type { TranslationFunction } from "@homarr/translation"; + +import { createCustomErrorParams, zodErrorMap } from "./i18n"; + +const expectError = (error: z.core.$ZodIssue, key: string) => { + expect(error.message).toContain(key); +}; + +describe("i18n", () => { + const t = ((key: string) => { + return `${key}`; + }) as TranslationFunction; + z.config({ + customError: zodErrorMap(t), + }); + + test("should return required error for string when passing null", () => { + const schema = z.string(); + const result = schema.safeParse(null); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "required"); + }); + test("should return required error for empty string", () => { + const schema = z.string().nonempty(); + const result = schema.safeParse(""); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "required"); + }); + test("should return invalid email error", () => { + const schema = z.string().email(); + const result = schema.safeParse("invalid-email"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "invalidEmail"); + }); + test("should return startsWith error", () => { + const schema = z.string().startsWith("test"); + const result = schema.safeParse("invalid"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "startsWith"); + }); + test("should return endsWith error", () => { + const schema = z.string().endsWith("test"); + const result = schema.safeParse("invalid"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "endsWith"); + }); + test("should return includes error", () => { + const schema = z.string().includes("test"); + const result = schema.safeParse("invalid"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "includes"); + }); + test("should return tooSmall error for string", () => { + const schema = z.string().min(5); + const result = schema.safeParse("test"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "tooSmall.string"); + }); + test("should return tooSmall error for number", () => { + const schema = z.number().min(5); + const result = schema.safeParse(3); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "tooSmall.number"); + }); + test("should return tooBig error for string", () => { + const schema = z.string().max(5); + const result = schema.safeParse("too long"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "tooBig.string"); + }); + test("should return tooBig error for number", () => { + const schema = z.number().max(5); + const result = schema.safeParse(10); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "tooBig.number"); + }); + test("should return custom error", () => { + const schema = z.string().refine((val) => val === "valid", { + params: createCustomErrorParams({ + key: "boardAlreadyExists", + params: {}, + }), + }); + + const result = schema.safeParse("invalid"); + expect(result.success).toBe(false); + if (result.success) return; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expectError(result.error.issues[0]!, "boardAlreadyExists"); + }); +}); diff --git a/packages/validation/src/form/i18n.ts b/packages/validation/src/form/i18n.ts index e1f01041a..dc64f412b 100644 --- a/packages/validation/src/form/i18n.ts +++ b/packages/validation/src/form/i18n.ts @@ -1,132 +1,139 @@ -import type { ErrorMapCtx, z, ZodTooBigIssue, ZodTooSmallIssue } from "zod"; -import { ZodIssueCode } from "zod"; +import type { z } from "zod/v4"; -import type { TranslationFunction, TranslationObject } from "@homarr/translation"; +import type { ScopedTranslationFunction, TranslationFunction, TranslationObject } from "@homarr/translation"; -export const zodErrorMap = (t: TFunction) => { - return (issue: z.ZodIssueOptionalMessage, ctx: ErrorMapCtx) => { - const error = handleZodError(issue, ctx); - if ("message" in error && error.message) { - return { - message: error.message, - }; +export const zodErrorMap = (t: TranslationFunction): z.core.$ZodErrorMap => { + return (issue) => { + const error = handleError(issue); + if (typeof error === "string") { + return error; } - return { - // use never to make ts happy - message: t(error.key ? `common.zod.${error.key}` : "common.zod.errors.default", (error.params ?? {}) as never), - }; + return t(`common.zod.errors.${error.key}`, (error.params ?? {}) as never); }; }; -const handleStringError = (issue: z.ZodInvalidStringIssue) => { - if (issue.validation === "email") { +type ValidTranslationKeys = Parameters>[0]; + +type HandlerReturnValue = + | string + | { + key: ValidTranslationKeys; + params?: Record; + }; + +const handleError = (issue: z.core.$ZodRawIssue): HandlerReturnValue => { + if (issue.code === "too_big") return handleTooBigError(issue); + if (issue.code === "too_small") return handleTooSmallError(issue); + if (issue.code === "invalid_format") return handleInvalidFormatError(issue); + if (issue.code === "invalid_type" && issue.expected === "string" && issue.input === null) { return { - key: "errors.string.invalidEmail", - } as const; + key: "required", + }; + } + if (issue.code === "custom" && issue.params?.i18n) { + const i18n = issue.params.i18n as { key: CustomErrorKey; params?: Record }; + return { + key: `custom.${i18n.key}`, + params: i18n.params, + }; } - if (typeof issue.validation === "object") { - if ("startsWith" in issue.validation) { - return { - key: "errors.string.startsWith", - params: { - startsWith: issue.validation.startsWith, - }, - } as const; - } else if ("endsWith" in issue.validation) { - return { - key: "errors.string.endsWith", - params: { - endsWith: issue.validation.endsWith, - }, - } as const; + return ( + issue.message ?? { + key: "default", } + ); +}; +const handleTooBigError = ( + issue: Pick & { message?: string }, +): HandlerReturnValue => { + if (issue.origin !== "string" && issue.origin !== "number") { + return ( + issue.message ?? { + key: "default", + } + ); + } + + const origin = issue.origin as "string" | "number"; + + return { + key: `tooBig.${origin}`, + params: { + maximum: issue.maximum.toString(), + count: issue.maximum.toString(), + }, + } as const; +}; + +const handleTooSmallError = ( + issue: Pick & { message?: string }, +): HandlerReturnValue => { + if (issue.origin !== "string" && issue.origin !== "number") { + return ( + issue.message ?? { + key: "default", + } + ); + } + + const origin = issue.origin as "string" | "number"; + if (origin === "string" && issue.minimum === 1) { return { - key: "errors.string.includes", + key: "required", + } as const; + } + return { + key: `tooSmall.${origin}`, + params: { + minimum: issue.minimum.toString(), + count: issue.minimum.toString(), + }, + } as const; +}; + +const handleInvalidFormatError = ( + issue: Pick & { message?: string }, +): HandlerReturnValue => { + if (issue.format === "includes" && "includes" in issue && typeof issue.includes === "string") { + return { + key: "string.includes", params: { - includes: issue.validation.includes, + includes: issue.includes, }, } as const; } - return { - message: issue.message, - }; -}; - -const handleTooSmallError = (issue: ZodTooSmallIssue) => { - if (issue.type !== "string" && issue.type !== "number") { + if (issue.format === "ends_with" && "suffix" in issue && typeof issue.suffix === "string") { return { - message: issue.message, - }; - } - - if (issue.type === "string" && issue.minimum === 1) { - return { - key: "errors.required", + key: "string.endsWith", + params: { + endsWith: issue.suffix, + }, } as const; } - return { - key: `errors.tooSmall.${issue.type}`, - params: { - minimum: issue.minimum, - count: issue.minimum, - }, - } as const; -}; - -const handleTooBigError = (issue: ZodTooBigIssue) => { - if (issue.type !== "string" && issue.type !== "number") { + if (issue.format === "starts_with" && "prefix" in issue && typeof issue.prefix === "string") { return { - message: issue.message, - }; - } - - return { - key: `errors.tooBig.${issue.type}`, - params: { - maximum: issue.maximum, - count: issue.maximum, - }, - } as const; -}; - -const handleZodError = (issue: z.ZodIssueOptionalMessage, ctx: ErrorMapCtx) => { - if (ctx.defaultError === "Required") { - return { - key: "errors.required", - params: {}, + key: "string.startsWith", + params: { + startsWith: issue.prefix, + }, } as const; } - if (issue.code === ZodIssueCode.invalid_string) { - return handleStringError(issue); - } - if (issue.code === ZodIssueCode.too_small) { - return handleTooSmallError(issue); - } - if (issue.code === ZodIssueCode.too_big) { - return handleTooBigError(issue); - } - if (issue.code === ZodIssueCode.invalid_type && (ctx.data === "" || issue.received === "null")) { + if (issue.format === "email") { return { - key: "errors.required", - params: {}, - } as const; - } - if (issue.code === ZodIssueCode.custom && issue.params?.i18n) { - const { i18n } = issue.params as CustomErrorParams; - return { - key: `errors.custom.${i18n.key}`, - params: i18n.params, + key: "string.invalidEmail", } as const; } - return { - message: issue.message, - }; + return ( + issue.message ?? { + key: "default", + } + ); }; type CustomErrorKey = keyof TranslationObject["common"]["zod"]["errors"]["custom"]; diff --git a/packages/validation/src/group.ts b/packages/validation/src/group.ts index d621a93d4..cc58b95b1 100644 --- a/packages/validation/src/group.ts +++ b/packages/validation/src/group.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { everyoneGroup, groupPermissionKeys } from "@homarr/definitions"; diff --git a/packages/validation/src/icons.ts b/packages/validation/src/icons.ts index 6d134097f..a577c39b6 100644 --- a/packages/validation/src/icons.ts +++ b/packages/validation/src/icons.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const iconsFindSchema = z.object({ searchText: z.string().optional(), diff --git a/packages/validation/src/integration.ts b/packages/validation/src/integration.ts index 00b3783fa..80dd1c979 100644 --- a/packages/validation/src/integration.ts +++ b/packages/validation/src/integration.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { integrationKinds, integrationPermissions, integrationSecretKinds } from "@homarr/definitions"; diff --git a/packages/validation/src/media.ts b/packages/validation/src/media.ts index 98f186c3d..cece4a19f 100644 --- a/packages/validation/src/media.ts +++ b/packages/validation/src/media.ts @@ -1,4 +1,3 @@ -import type { z } from "zod"; import { zfd } from "zod-form-data"; import { createCustomErrorParams } from "./form/i18n"; @@ -6,36 +5,30 @@ import { createCustomErrorParams } from "./form/i18n"; export const supportedMediaUploadFormats = ["image/png", "image/jpeg", "image/webp", "image/gif", "image/svg+xml"]; export const mediaUploadSchema = zfd.formData({ - file: zfd.file().superRefine((value: File | null, context: z.RefinementCtx) => { - if (!value) { - return context.addIssue({ - code: "invalid_type", - expected: "object", - received: "null", - }); - } - - if (!supportedMediaUploadFormats.includes(value.type)) { - return context.addIssue({ + file: zfd.file().check((context) => { + if (!supportedMediaUploadFormats.includes(context.value.type)) { + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "invalidFileType", params: { expected: `one of ${supportedMediaUploadFormats.join(", ")}` }, }), + input: context.value.type, }); + return; } - if (value.size > 1024 * 1024 * 32) { + if (context.value.size > 1024 * 1024 * 32) { // Don't forget to update the limit in nginx.conf (client_max_body_size) - return context.addIssue({ + context.issues.push({ code: "custom", params: createCustomErrorParams({ key: "fileTooLarge", params: { maxSize: "32 MB" }, }), + input: context.value.size, }); + return; } - - return null; }), }); diff --git a/packages/validation/src/permissions.ts b/packages/validation/src/permissions.ts index 35ebe9c86..eafcd46b8 100644 --- a/packages/validation/src/permissions.ts +++ b/packages/validation/src/permissions.ts @@ -1,6 +1,6 @@ -import { z } from "zod"; +import { z } from "zod/v4"; -export const createSavePermissionsSchema = >( +export const createSavePermissionsSchema = ( permissionSchema: TPermissionSchema, ) => { return z.object({ diff --git a/packages/validation/src/search-engine.ts b/packages/validation/src/search-engine.ts index c84c77d9e..02314d6dc 100644 --- a/packages/validation/src/search-engine.ts +++ b/packages/validation/src/search-engine.ts @@ -1,5 +1,5 @@ -import type { ZodTypeAny } from "zod"; -import { z } from "zod"; +import type { ZodTypeAny } from "zod/v4"; +import { z } from "zod/v4"; import type { SearchEngineType } from "@homarr/definitions"; diff --git a/packages/validation/src/settings.ts b/packages/validation/src/settings.ts index 7110dfb3e..928f2861e 100644 --- a/packages/validation/src/settings.ts +++ b/packages/validation/src/settings.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const settingsInitSchema = z.object({ analytics: z.object({ diff --git a/packages/validation/src/shared.ts b/packages/validation/src/shared.ts index c6da17448..87bb3b41f 100644 --- a/packages/validation/src/shared.ts +++ b/packages/validation/src/shared.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; import { integrationKinds, widgetKinds } from "@homarr/definitions"; @@ -40,7 +40,7 @@ export const sharedItemSchema = z.object({ export const commonItemSchema = z .object({ kind: zodEnumFromArray(widgetKinds), - options: z.record(z.unknown()), + options: z.record(z.string(), z.unknown()), }) .and(sharedItemSchema); diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index 16bc593a0..788eb2750 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -1,5 +1,5 @@ import type { DayOfWeek } from "@mantine/dates"; -import { z } from "zod"; +import { z } from "zod/v4"; import { colorSchemes } from "@homarr/definitions"; import type { TranslationObject } from "@homarr/translation"; @@ -38,9 +38,10 @@ export const userPasswordSchema = z }, ); -const addConfirmPasswordRefinement = ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - schema: z.ZodObject, +const addConfirmPasswordRefinement = < + TSchema extends z.ZodObject<{ password: z.core.$ZodString; confirmPassword: z.core.$ZodString }, z.core.$strip>, +>( + schema: TSchema, ) => { return schema.refine((data) => data.password === data.confirmPassword, { path: ["confirmPassword"], @@ -55,7 +56,7 @@ export const userBaseCreateSchema = z.object({ username: usernameSchema, password: userPasswordSchema, confirmPassword: z.string(), - email: z.string().email().or(z.string().length(0).optional()), + email: z.string().email().or(z.string().length(0)).optional(), groupIds: z.array(z.string()), }); @@ -121,7 +122,15 @@ export const userChangeColorSchemeSchema = z.object({ }); export const userFirstDayOfWeekSchema = z.object({ - firstDayOfWeek: z.custom((value) => z.number().min(0).max(6).safeParse(value).success), + firstDayOfWeek: z + .custom((value) => z.number().min(0).max(6).safeParse(value).success) + .meta({ + override: { + type: "integer", + minimum: 0, + maximum: 6, + }, + }), }); export const userPingIconsEnabledSchema = z.object({ diff --git a/packages/validation/src/widgets/media-request.ts b/packages/validation/src/widgets/media-request.ts index aa0f85c6e..65cad88f3 100644 --- a/packages/validation/src/widgets/media-request.ts +++ b/packages/validation/src/widgets/media-request.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import { z } from "zod/v4"; export const mediaRequestOptionsSchema = z.object({ mediaId: z.number(), diff --git a/packages/widgets/package.json b/packages/widgets/package.json index df4d600e1..1aba6cc2c 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -70,6 +70,7 @@ "@tiptap/starter-kit": "^2.26.1", "clsx": "^2.1.1", "dayjs": "^1.11.13", + "mantine-form-zod-resolver": "^1.2.1", "mantine-react-table": "2.0.0-beta.9", "next": "15.4.6", "react": "19.1.1", @@ -77,14 +78,14 @@ "react-markdown": "^10.1.0", "recharts": "^2.15.4", "video.js": "^8.23.4", - "zod": "^3.25.76" + "zod": "^4.0.14" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/video.js": "^7.3.58", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/packages/widgets/src/calendar/index.ts b/packages/widgets/src/calendar/index.ts index 088bdf6ef..d03b2f610 100644 --- a/packages/widgets/src/calendar/index.ts +++ b/packages/widgets/src/calendar/index.ts @@ -1,5 +1,5 @@ import { IconCalendar } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { radarrReleaseTypes } from "@homarr/integrations/types"; diff --git a/packages/widgets/src/downloads/index.ts b/packages/widgets/src/downloads/index.ts index edd4506e0..c00044aa9 100644 --- a/packages/widgets/src/downloads/index.ts +++ b/packages/widgets/src/downloads/index.ts @@ -1,5 +1,5 @@ import { IconDownload } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; import type { ExtendedDownloadClientItem } from "@homarr/integrations"; diff --git a/packages/widgets/src/media-transcoding/index.ts b/packages/widgets/src/media-transcoding/index.ts index 0103f480a..2753925d8 100644 --- a/packages/widgets/src/media-transcoding/index.ts +++ b/packages/widgets/src/media-transcoding/index.ts @@ -1,5 +1,5 @@ import { IconTransform } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { capitalize } from "@homarr/common"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; diff --git a/packages/widgets/src/minecraft/server-status/index.ts b/packages/widgets/src/minecraft/server-status/index.ts index 1f258e75c..c5cd0e068 100644 --- a/packages/widgets/src/minecraft/server-status/index.ts +++ b/packages/widgets/src/minecraft/server-status/index.ts @@ -1,5 +1,5 @@ import { IconBrandMinecraft } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createWidgetDefinition } from "../../definition"; import { optionsBuilder } from "../../options"; diff --git a/packages/widgets/src/modals/widget-edit-modal.tsx b/packages/widgets/src/modals/widget-edit-modal.tsx index 8e6c56c8a..d05ac95c1 100644 --- a/packages/widgets/src/modals/widget-edit-modal.tsx +++ b/packages/widgets/src/modals/widget-edit-modal.tsx @@ -2,11 +2,11 @@ import { useState } from "react"; import { Button, Group, Stack } from "@mantine/core"; -import { z } from "zod"; +import { zod4Resolver } from "mantine-form-zod-resolver"; +import { z } from "zod/v4"; import { objectEntries } from "@homarr/common"; import type { WidgetKind } from "@homarr/definitions"; -import { zodResolver } from "@homarr/form"; import { createModal, useModalAction } from "@homarr/modals"; import type { SettingsContextProps } from "@homarr/settings/creator"; import { useI18n } from "@homarr/translation/client"; @@ -41,14 +41,16 @@ export const WidgetEditModal = createModal>(({ actions, i const [advancedOptions, setAdvancedOptions] = useState(innerProps.value.advancedOptions); // Translate the error messages - z.setErrorMap(zodErrorMap(t)); + z.config({ + customError: zodErrorMap(t), + }); const { definition } = widgetImports[innerProps.kind]; const options = definition.createOptions(innerProps.settings) as Record; const form = useForm({ mode: "controlled", initialValues: innerProps.value, - validate: zodResolver( + validate: zod4Resolver( z.object({ options: z.object( objectEntries(options).reduce( diff --git a/packages/widgets/src/options.ts b/packages/widgets/src/options.ts index 194759396..d0fe2cdfb 100644 --- a/packages/widgets/src/options.ts +++ b/packages/widgets/src/options.ts @@ -1,8 +1,8 @@ import type React from "react"; import type { DraggableAttributes, UniqueIdentifier } from "@dnd-kit/core"; import type { ActionIconProps } from "@mantine/core"; -import { z } from "zod"; -import type { ZodType } from "zod"; +import { z } from "zod/v4"; +import type { ZodType } from "zod/v4"; import type { IntegrationKind } from "@homarr/definitions"; diff --git a/packages/widgets/src/releases/index.ts b/packages/widgets/src/releases/index.ts index 42081a9c2..84c4f9998 100644 --- a/packages/widgets/src/releases/index.ts +++ b/packages/widgets/src/releases/index.ts @@ -1,5 +1,5 @@ import { IconRocket } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; diff --git a/packages/widgets/src/rssFeed/index.ts b/packages/widgets/src/rssFeed/index.ts index cd6a66c06..058f1fe51 100644 --- a/packages/widgets/src/rssFeed/index.ts +++ b/packages/widgets/src/rssFeed/index.ts @@ -1,5 +1,5 @@ import { IconRss } from "@tabler/icons-react"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; diff --git a/packages/widgets/src/weather/index.ts b/packages/widgets/src/weather/index.ts index e120c5783..c8eb3f108 100644 --- a/packages/widgets/src/weather/index.ts +++ b/packages/widgets/src/weather/index.ts @@ -1,6 +1,6 @@ import { IconCloud } from "@tabler/icons-react"; import dayjs from "dayjs"; -import { z } from "zod"; +import { z } from "zod/v4"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8bf2461e..802c623fd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,8 +29,8 @@ importers: specifier: ^10.0.1 version: 10.0.1(semantic-release@24.2.7(typescript@5.9.2)) '@semantic-release/github': - specifier: ^11.0.3 - version: 11.0.3(semantic-release@24.2.7(typescript@5.9.2)) + specifier: ^11.0.4 + version: 11.0.4(semantic-release@24.2.7(typescript@5.9.2)) '@semantic-release/npm': specifier: ^12.0.2 version: 12.0.2(semantic-release@24.2.7(typescript@5.9.2)) @@ -41,11 +41,11 @@ importers: specifier: ^11.5.1 version: 11.5.1 '@turbo/gen': - specifier: ^2.5.5 - version: 2.5.5(@types/node@22.17.1)(typescript@5.9.2) + specifier: ^2.5.6 + version: 2.5.6(@types/node@22.17.2)(typescript@5.9.2) '@vitejs/plugin-react': - specifier: ^4.7.0 - version: 4.7.0(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) + specifier: ^5.0.0 + version: 5.0.0(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -71,17 +71,17 @@ importers: specifier: ^11.5.1 version: 11.5.1 turbo: - specifier: ^2.5.5 - version: 2.5.5 + specifier: ^2.5.6 + version: 2.5.6 typescript: specifier: ^5.9.2 version: 5.9.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) + version: 5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) apps/nextjs: dependencies: @@ -195,19 +195,19 @@ importers: version: 8.2.4(chroma-js@3.1.2) '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/dropzone': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) '@mantine/modals': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/tiptap': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tiptap/extension-link@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(@tiptap/react@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tiptap/extension-link@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(@tiptap/react@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@million/lint': specifier: 1.0.14 version: 1.0.14(rollup@4.21.3)(webpack-sources@3.2.3) @@ -215,23 +215,23 @@ importers: specifier: ^3.34.1 version: 3.34.1(react@19.1.1) '@tanstack/react-query': - specifier: ^5.84.2 - version: 5.84.2(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@tanstack/react-query-devtools': - specifier: ^5.84.2 - version: 5.84.2(@tanstack/react-query@5.84.2(react@19.1.1))(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1) '@tanstack/react-query-next-experimental': - specifier: ^5.84.2 - version: 5.84.2(@tanstack/react-query@5.84.2(react@19.1.1))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react@19.1.1) '@trpc/client': specifier: ^11.4.4 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/next': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@trpc/react-query': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@trpc/server': specifier: ^11.4.4 version: 11.4.4(typescript@5.9.2) @@ -263,11 +263,11 @@ importers: specifier: ^11.0.3 version: 11.0.3 jotai: - specifier: ^2.13.0 - version: 2.13.0(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.1.9)(react@19.1.1) + specifier: ^2.13.1 + version: 2.13.1(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.1.10)(react@19.1.1) mantine-react-table: specifier: 2.0.0-beta.9 - version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -297,13 +297,13 @@ importers: version: 2.2.2 swagger-ui-react: specifier: ^5.27.1 - version: 5.27.1(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 5.27.1(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) use-deep-compare-effect: specifier: ^1.8.1 version: 1.8.1(react@19.1.1) zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -318,17 +318,17 @@ importers: specifier: 3.1.1 version: 3.1.1 '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.17.2 + version: 22.17.2 '@types/prismjs': specifier: ^1.26.5 version: 1.26.5 '@types/react': - specifier: 19.1.9 - version: 19.1.9 + specifier: 19.1.10 + version: 19.1.10 '@types/react-dom': specifier: 19.1.7 - version: 19.1.7(@types/react@19.1.9) + version: 19.1.7(@types/react@19.1.10) '@types/swagger-ui-react': specifier: ^5.18.0 version: 5.18.0 @@ -336,8 +336,8 @@ importers: specifier: ^9.2.0 version: 9.2.0 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 node-loader: specifier: ^2.1.0 version: 2.1.0(webpack@5.94.0) @@ -402,8 +402,8 @@ importers: specifier: ^17.2.1 version: 17.2.1 fastify: - specifier: ^5.4.0 - version: 5.4.0 + specifier: ^5.5.0 + version: 5.5.0 superjson: specifier: 2.2.2 version: 2.2.2 @@ -421,23 +421,23 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.17.2 + version: 22.17.2 dotenv-cli: specifier: ^10.0.0 version: 10.0.0 esbuild: - specifier: ^0.25.8 - version: 0.25.8 + specifier: ^0.25.9 + version: 0.25.9 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 prettier: specifier: ^3.6.2 version: 3.6.2 tsx: - specifier: 4.20.3 - version: 4.20.3 + specifier: 4.20.4 + version: 4.20.4 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -472,8 +472,8 @@ importers: specifier: ^17.2.1 version: 17.2.1 tsx: - specifier: 4.20.3 - version: 4.20.3 + specifier: 4.20.4 + version: 4.20.4 ws: specifier: ^8.18.3 version: 8.18.3 @@ -491,11 +491,11 @@ importers: specifier: ^8.18.1 version: 8.18.1 esbuild: - specifier: ^0.25.8 - version: 0.25.8 + specifier: ^0.25.9 + version: 0.25.9 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -531,8 +531,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -548,6 +548,9 @@ importers: '@homarr/common': specifier: workspace:^0.1.0 version: link:../common + '@homarr/core': + specifier: workspace:^0.1.0 + version: link:../core '@homarr/cron-job-api': specifier: workspace:^0.1.0 version: link:../cron-job-api @@ -600,20 +603,20 @@ importers: specifier: ^1.3.0 version: 1.3.0 '@tanstack/react-query': - specifier: ^5.84.2 - version: 5.84.2(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@trpc/client': specifier: ^11.4.4 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/react-query': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) '@trpc/server': specifier: ^11.4.4 version: 11.4.4(typescript@5.9.2) '@trpc/tanstack-react-query': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) lodash.clonedeep: specifier: ^4.5.0 version: 4.5.0 @@ -630,11 +633,11 @@ importers: specifier: 2.2.2 version: 2.2.2 trpc-to-openapi: - specifier: ^2.4.0 - version: 2.4.0(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@2.19.0(zod@3.25.76))(zod@3.25.76) + specifier: ^3.0.0 + version: 3.0.0(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.14))(zod@4.0.14) zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -646,8 +649,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -706,8 +709,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -725,8 +728,8 @@ importers: specifier: 0.9.1 version: 0.9.1 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 prettier: specifier: ^3.6.2 version: 3.6.2 @@ -756,8 +759,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -784,8 +787,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -821,11 +824,11 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript esbuild: - specifier: ^0.25.8 - version: 0.25.8 + specifier: ^0.25.9 + version: 0.25.9 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -857,11 +860,11 @@ importers: specifier: 7.13.0 version: 7.13.0 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 zod-validation-error: specifier: ^3.5.3 - version: 3.5.3(zod@3.25.76) + version: 3.5.3(zod@4.0.14) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -873,8 +876,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -883,13 +886,13 @@ importers: dependencies: '@t3-oss/env-nextjs': specifier: ^0.13.8 - version: 0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@3.25.76) + version: 0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@4.0.14) ioredis: specifier: 5.7.0 version: 5.7.0 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -901,8 +904,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -922,8 +925,8 @@ importers: specifier: workspace:^0.1.0 version: link:../log '@tanstack/react-query': - specifier: ^5.84.2 - version: 5.84.2(react@19.1.1) + specifier: ^5.85.3 + version: 5.85.3(react@19.1.1) '@trpc/client': specifier: ^11.4.4 version: 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) @@ -932,7 +935,7 @@ importers: version: 11.4.4(typescript@5.9.2) '@trpc/tanstack-react-query': specifier: ^11.4.4 - version: 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + version: 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -940,8 +943,8 @@ importers: specifier: 19.1.1 version: 19.1.1 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -956,11 +959,11 @@ importers: specifier: ^3.0.11 version: 3.0.11 '@types/react': - specifier: 19.1.9 - version: 19.1.9 + specifier: 19.1.10 + version: 19.1.10 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -981,8 +984,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1051,8 +1054,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1082,8 +1085,8 @@ importers: specifier: ^3.0.11 version: 3.0.11 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1110,7 +1113,7 @@ importers: version: link:../server-settings '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@paralleldrive/cuid2': specifier: ^2.2.2 version: 2.2.2 @@ -1130,8 +1133,8 @@ importers: specifier: ^0.44.4 version: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3) drizzle-zod: - specifier: ^0.7.1 - version: 0.7.1(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@3.25.76) + specifier: ^0.8.2 + version: 0.8.2(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@4.0.14) mysql2: specifier: 3.14.3 version: 3.14.3 @@ -1155,17 +1158,17 @@ importers: specifier: ^10.0.0 version: 10.0.0 esbuild: - specifier: ^0.25.8 - version: 0.25.8 + specifier: ^0.25.9 + version: 0.25.9 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 prettier: specifier: ^3.6.2 version: 3.6.2 tsx: - specifier: 4.20.3 - version: 4.20.3 + specifier: 4.20.4 + version: 4.20.4 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1179,8 +1182,8 @@ importers: specifier: ^5.2.5 version: 5.2.5 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1192,11 +1195,11 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 tsx: - specifier: 4.20.3 - version: 4.20.3 + specifier: 4.20.4 + version: 4.20.4 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1226,8 +1229,8 @@ importers: specifier: ^3.3.42 version: 3.3.42 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1246,9 +1249,12 @@ importers: '@mantine/form': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) + mantine-form-zod-resolver: + specifier: ^1.2.1 + version: 1.2.1(@mantine/form@8.2.4(react@19.1.1))(zod@4.0.14) zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1260,8 +1266,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1291,13 +1297,13 @@ importers: version: link:../validation '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1309,8 +1315,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1337,8 +1343,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1374,8 +1380,8 @@ importers: specifier: 6.0.0 version: 6.0.0 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1449,8 +1455,8 @@ importers: specifier: ^0.6.2 version: 0.6.2 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1468,8 +1474,8 @@ importers: specifier: ^0.4.14 version: 0.4.14 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1486,8 +1492,8 @@ importers: specifier: 3.17.0 version: 3.17.0 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1499,8 +1505,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1515,7 +1521,7 @@ importers: version: link:../ui '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) @@ -1533,8 +1539,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1576,7 +1582,7 @@ importers: version: link:../validation '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tabler/icons-react': specifier: ^3.34.1 version: 3.34.1(react@19.1.1) @@ -1593,8 +1599,8 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1606,8 +1612,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1619,7 +1625,7 @@ importers: version: link:../ui '@mantine/notifications': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tabler/icons-react': specifier: ^3.34.1 version: 3.34.1(react@19.1.1) @@ -1634,8 +1640,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1677,7 +1683,7 @@ importers: version: link:../validation '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) @@ -1697,11 +1703,11 @@ importers: specifier: 2.2.2 version: 2.2.2 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 zod-form-data: - specifier: ^2.0.7 - version: 2.0.7(zod@3.25.76) + specifier: ^3.0.0 + version: 3.0.0(zod@4.0.14) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1716,8 +1722,8 @@ importers: specifier: 0.5.7 version: 0.5.7 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1728,8 +1734,8 @@ importers: specifier: workspace:^0.1.0 version: link:../common zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1741,8 +1747,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1769,8 +1775,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1809,8 +1815,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1861,8 +1867,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1886,8 +1892,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1905,7 +1911,7 @@ importers: version: link:../server-settings '@mantine/dates': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.28.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -1926,8 +1932,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -1966,19 +1972,19 @@ importers: version: link:../ui '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) '@mantine/spotlight': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tabler/icons-react': specifier: ^3.34.1 version: 3.34.1(react@19.1.1) jotai: - specifier: ^2.13.0 - version: 2.13.0(@babel/core@7.28.0)(@babel/template@7.27.2)(@types/react@19.1.9)(react@19.1.1) + specifier: ^2.13.1 + version: 2.13.1(@babel/core@7.28.0)(@babel/template@7.27.2)(@types/react@19.1.10)(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.28.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -2002,8 +2008,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2024,7 +2030,7 @@ importers: version: 4.3.1 mantine-react-table: specifier: 2.0.0-beta.9 - version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.28.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -2048,8 +2054,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2073,10 +2079,10 @@ importers: version: link:../validation '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/dates': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) @@ -2085,7 +2091,7 @@ importers: version: 3.34.1(react@19.1.1) mantine-react-table: specifier: 2.0.0-beta.9 - version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.28.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -2112,8 +2118,8 @@ importers: specifier: ^1.0.5 version: 1.0.5 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2127,11 +2133,11 @@ importers: specifier: workspace:^0.1.0 version: link:../translation zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 zod-form-data: - specifier: ^2.0.7 - version: 2.0.7(zod@3.25.76) + specifier: ^3.0.0 + version: 3.0.0(zod@4.0.14) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2143,8 +2149,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2222,10 +2228,10 @@ importers: version: link:../validation '@mantine/charts': specifier: ^8.2.4 - version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(recharts@2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) + version: 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(recharts@2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)) '@mantine/core': specifier: ^8.2.4 - version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': specifier: ^8.2.4 version: 8.2.4(react@19.1.1) @@ -2286,9 +2292,12 @@ importers: dayjs: specifier: ^1.11.13 version: 1.11.13 + mantine-form-zod-resolver: + specifier: ^1.2.1 + version: 1.2.1(@mantine/form@8.2.4(react@19.1.1))(zod@4.0.14) mantine-react-table: specifier: 2.0.0-beta.9 - version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next: specifier: 15.4.6 version: 15.4.6(@babel/core@7.28.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) @@ -2300,7 +2309,7 @@ importers: version: 19.1.1(react@19.1.1) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.1.9)(react@19.1.1) + version: 10.1.0(@types/react@19.1.10)(react@19.1.1) recharts: specifier: ^2.15.4 version: 2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -2308,8 +2317,8 @@ importers: specifier: ^8.23.4 version: 8.23.4 zod: - specifier: ^3.25.76 - version: 3.25.76 + specifier: ^4.0.14 + version: 4.0.14 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2324,8 +2333,8 @@ importers: specifier: ^7.3.58 version: 7.3.58 eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2337,25 +2346,25 @@ importers: version: 15.4.6 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.32.0) + version: 10.1.8(eslint@9.33.0) eslint-config-turbo: - specifier: ^2.5.5 - version: 2.5.5(eslint@9.32.0)(turbo@2.5.5) + specifier: ^2.5.6 + version: 2.5.6(eslint@9.33.0)(turbo@2.5.6) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.0) + version: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.32.0) + version: 6.10.2(eslint@9.33.0) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.32.0) + version: 7.37.5(eslint@9.33.0) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.32.0) + version: 5.2.0(eslint@9.33.0) typescript-eslint: - specifier: ^8.39.0 - version: 8.39.0(eslint@9.32.0)(typescript@5.9.2) + specifier: ^8.39.1 + version: 8.39.1(eslint@9.33.0)(typescript@5.9.2) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -2364,8 +2373,8 @@ importers: specifier: workspace:^0.1.0 version: link:../typescript eslint: - specifier: ^9.32.0 - version: 9.32.0 + specifier: ^9.33.0 + version: 9.33.0 typescript: specifier: ^5.9.2 version: 5.9.2 @@ -2375,8 +2384,8 @@ importers: tooling/prettier: dependencies: '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.6.1 - version: 4.6.1(prettier@3.6.2) + specifier: ^4.6.2 + version: 4.6.2(prettier@3.6.2) prettier: specifier: ^3.6.2 version: 3.6.2 @@ -2732,8 +2741,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2756,8 +2765,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2780,8 +2789,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2804,8 +2813,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2828,8 +2837,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2852,8 +2861,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2876,8 +2885,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2900,8 +2909,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2924,8 +2933,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2948,8 +2957,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2972,8 +2981,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2996,8 +3005,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -3020,8 +3029,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -3044,8 +3053,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -3068,8 +3077,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -3092,8 +3101,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -3116,14 +3125,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -3146,14 +3155,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -3176,14 +3185,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -3206,8 +3215,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -3230,8 +3239,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -3254,8 +3263,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -3278,8 +3287,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -3298,28 +3307,28 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.32.0': - resolution: {integrity: sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==} + '@eslint/js@9.33.0': + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@extractus/feed-extractor@7.1.6': @@ -3437,8 +3446,8 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} - '@ianvs/prettier-plugin-sort-imports@4.6.1': - resolution: {integrity: sha512-Q0gujs/g6tw1uOGd1bTVLGDzAwb/UwrCehhPCQevTCYDkho8+eQSOhA0zcy9AM0XnXM1ChBWsZeE4P7Nym0pyw==} + '@ianvs/prettier-plugin-sort-imports@4.6.2': + resolution: {integrity: sha512-kHiL1IghIodo43clNQaJJU2rPqXEioPG+Ink4/T5za46A0ggSNvIx4NM3hGgciQ2VpDaR/X8cTJIZDKRurWjPw==} peerDependencies: '@prettier/plugin-oxc': ^0.0.4 '@vue/compiler-sfc': 2.7.x || 3.x @@ -4086,8 +4095,8 @@ packages: '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-beta.30': + resolution: {integrity: sha512-whXaSoNUFiyDAjkUF8OBpOm77Szdbk5lGNqFe6CbVbJFrhCCPinCbRA3NjawwlNHla1No7xvXXh+CpSxnPfUEw==} '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} @@ -4227,8 +4236,8 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/github@11.0.3': - resolution: {integrity: sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==} + '@semantic-release/github@11.0.4': + resolution: {integrity: sha512-fU/nLSjkp9DmB0h7FVO5imhhWJMvq2LjD4+3lz3ZAzpDLY9+KYwC+trJ+g7LbZeJv9y3L9fSFSg2DduUpiT6bw==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=24.1.0' @@ -4410,27 +4419,27 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.83.1': - resolution: {integrity: sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==} + '@tanstack/query-core@5.85.3': + resolution: {integrity: sha512-9Ne4USX83nHmRuEYs78LW+3lFEEO2hBDHu7mrdIgAFx5Zcrs7ker3n/i8p4kf6OgKExmaDN5oR0efRD7i2J0DQ==} '@tanstack/query-devtools@5.84.0': resolution: {integrity: sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==} - '@tanstack/react-query-devtools@5.84.2': - resolution: {integrity: sha512-ojJ66QoW9noqK35Lsmfqpfucj6wuOxLL2TYwEwpvU+iUQ5R/7TKpapWvpy9kZyNSl0mxv5mpS+ImfR8aL8/x3g==} + '@tanstack/react-query-devtools@5.85.3': + resolution: {integrity: sha512-WSVweCE1Kh1BVvPDHAmLgGT+GGTJQ9+a7bVqzD+zUiUTht+salJjYm5nikpMNaHFPJV102TCYdvgHgBXtURRNg==} peerDependencies: - '@tanstack/react-query': ^5.84.2 + '@tanstack/react-query': ^5.85.3 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.84.2': - resolution: {integrity: sha512-VQPWUa89fVPTZPzZO+4G93BQFnnCh4sFdkNAv8K83jNVy1eknzHBCJ25IkiEhnbIfT0qmIwTsu3SAbMGwxTKSw==} + '@tanstack/react-query-next-experimental@5.85.3': + resolution: {integrity: sha512-VmxbrGVmFa3fUspZ+v6z9DDbUG1xA+fmjOJD08bNO7k1XuaIhjKWp2UqqdBpwWm3TzGThL0kB4tHwpf2Emc9Mw==} peerDependencies: - '@tanstack/react-query': ^5.84.2 + '@tanstack/react-query': ^5.85.3 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.84.2': - resolution: {integrity: sha512-cZadySzROlD2+o8zIfbD978p0IphuQzRWiiH3I2ugnTmz4jbjc0+TdibpwqxlzynEen8OulgAg+rzdNF37s7XQ==} + '@tanstack/react-query@5.85.3': + resolution: {integrity: sha512-AqU8TvNh5GVIE8I+TUU0noryBRy7gOY0XhSayVXmOPll4UkZeLWKDwi0rtWOZbwLRCbyxorfJ5DIjDqE7GXpcQ==} peerDependencies: react: ^18 || ^19 @@ -4735,12 +4744,12 @@ packages: '@tsconfig/svelte@1.0.13': resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==} - '@turbo/gen@2.5.5': - resolution: {integrity: sha512-8zay4rVILdeTRLBR3rVVRLmLpvQrektMPXjwK9aze86nVwcLYxrCBYghRs88SOxk2r1qlwgg/e8UNzdkGB2UdA==} + '@turbo/gen@2.5.6': + resolution: {integrity: sha512-0ugshQQGJE/lVYHhkFsdAd6prM279Uyl+UVfylkNhrL21YML4/fGKPYb99G0bNJ+okp7bA++4/RDFh3MS0ZeRg==} hasBin: true - '@turbo/workspaces@2.5.5': - resolution: {integrity: sha512-Gye68+szmOp96xMvmondTRQYcYvevDqUP9JuN9jC6kqzFel7U1pJ/hoPvyD3WGQNxyKsdF+wJ5fvNaYXkzr6tQ==} + '@turbo/workspaces@2.5.6': + resolution: {integrity: sha512-TmY25GmxzgX+395Fwl/F0te6S4RHdJtYl1QjZr+wlxVvKJ0IBOACpnpAvnLM3dpTgXuQukGtSWcRz7Zi9mZqcQ==} hasBin: true '@types/adm-zip@0.5.7': @@ -4911,8 +4920,8 @@ packages: '@types/node@18.19.50': resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} - '@types/node@22.17.1': - resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} + '@types/node@22.17.2': + resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4934,8 +4943,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.9': - resolution: {integrity: sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA==} + '@types/react@19.1.10': + resolution: {integrity: sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -4991,63 +5000,63 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.39.0': - resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} + '@typescript-eslint/eslint-plugin@8.39.1': + resolution: {integrity: sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.0 + '@typescript-eslint/parser': ^8.39.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.39.0': - resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} + '@typescript-eslint/parser@8.39.1': + resolution: {integrity: sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==} 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.39.0': - resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} + '@typescript-eslint/project-service@8.39.1': + resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.39.0': - resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} + '@typescript-eslint/scope-manager@8.39.1': + resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.39.0': - resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} + '@typescript-eslint/tsconfig-utils@8.39.1': + resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.39.0': - resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} + '@typescript-eslint/type-utils@8.39.1': + resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} 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.39.0': - resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} + '@typescript-eslint/types@8.39.1': + resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.39.0': - resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} + '@typescript-eslint/typescript-estree@8.39.1': + resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.39.0': - resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} + '@typescript-eslint/utils@8.39.1': + resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} 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.39.0': - resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} + '@typescript-eslint/visitor-keys@8.39.1': + resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -5073,9 +5082,9 @@ packages: '@videojs/xhr@2.7.0': resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==} - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@5.0.0': + resolution: {integrity: sha512-Jx9JfsTa05bYkS9xo0hkofp2dCmp1blrKjw9JONs5BTHOvJCgLbaPSuZLGSVJW6u2qe0tc4eevY0+gSNNi0YCw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -5967,8 +5976,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crossws@0.3.4: - resolution: {integrity: sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==} + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -6374,11 +6383,11 @@ packages: sqlite3: optional: true - drizzle-zod@0.7.1: - resolution: {integrity: sha512-nZzALOdz44/AL2U005UlmMqaQ1qe5JfanvLujiTHiiT8+vZJTBFhj3pY4Vk+L6UWyKFfNmLhk602Hn4kCTynKQ==} + drizzle-zod@0.8.2: + resolution: {integrity: sha512-9Do/16OjFFNrQDZgvMtxtDDwKWbFOxUAIwNPKX98SfxrP8H18vhN1BvNXbhelLcdgCE7GEaXDJqBjMExSkhpkA==} peerDependencies: drizzle-orm: '>=0.36.0' - zod: '>=3.0.0' + zod: ^3.25.1 dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -6538,8 +6547,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -6574,8 +6583,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.5.5: - resolution: {integrity: sha512-23lKrCr66HQR62aa94n2dBGUUFz0GzM6N1KwmcREZHxomZ5Ik2rDm00wAz95lOEkhzSt6IaxW00Uz0az/Fcq5Q==} + eslint-config-turbo@2.5.6: + resolution: {integrity: sha512-1EV/UqdKE75st9q6y0MCxz7qp2v7RyGvbQsMLSuCz+VH8ScnSfmhd8FcAbqx3BshCy5IluujzMB6T5iCgL3/sA==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -6632,8 +6641,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.5.5: - resolution: {integrity: sha512-IlN65X6W7rgK88u5xl1xC+7FIGKA7eyaca0yxZQ9CBNV6keAaqtjZQLw8ZfXdv7T+MzTLYkYOeOHAv8yCRUx4Q==} + eslint-plugin-turbo@2.5.6: + resolution: {integrity: sha512-KUDE23aP2JV8zbfZ4TeM1HpAXzMM/AYG/bJam7P4AalUxas8Pd/lS/6R3p4uX91qJcH1LwL4h0ED48nDe8KorQ==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -6654,8 +6663,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.32.0: - resolution: {integrity: sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==} + eslint@9.33.0: + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6806,8 +6815,8 @@ packages: peerDependencies: '@babel/types': ^7 - fastify@5.4.0: - resolution: {integrity: sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==} + fastify@5.5.0: + resolution: {integrity: sha512-ZWSWlzj3K/DcULCnCjEiC2zn2FBPdlZsSA/pnPa/dbUfLvxkD/Nqmb0XXMXLrWkeM4uQPUvjdJpwtXmTfriXqw==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -7724,8 +7733,8 @@ packages: jose@6.0.8: resolution: {integrity: sha512-EyUPtOKyTYq+iMOszO42eobQllaIjJnwkZ2U93aJzNyPibCy7CEvT9UQnaCVB51IAd49gbNdCew1c0LcLTCB2g==} - jotai@2.13.0: - resolution: {integrity: sha512-H43zXdanNTdpfOEJ4NVbm4hgmrctpXLZagjJNcqAywhUv+sTE7esvFjwm5oBg/ywT9Qw63lIkM6fjrhFuW8UDg==} + jotai@2.13.1: + resolution: {integrity: sha512-cRsw6kFeGC9Z/D3egVKrTXRweycZ4z/k7i2MrfCzPYsL9SIWcPXTyqv258/+Ay8VUEcihNiE/coBLE6Kic6b8A==} engines: {node: '>=12.20.0'} peerDependencies: '@babel/core': '>=7.0.0' @@ -8012,6 +8021,13 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + mantine-form-zod-resolver@1.2.1: + resolution: {integrity: sha512-8Y7jX3ybZEhQeLzkbrzCS9gulnCX7sgjM5bCkRDxQHbmal8V5lLM9yZq583UEme8DuM77x/BJNTrBkYZo+JUFw==} + engines: {node: '>=16.6.0'} + peerDependencies: + '@mantine/form': '>=7.0.0' + zod: '>=3.25.0' + mantine-react-table@2.0.0-beta.9: resolution: {integrity: sha512-ZdfcwebWaPERoDvAuk43VYcBCzamohARVclnbuepT0PHZ0wRcDPMBR+zgaocL+pFy8EXUGwvWTOKNh25ITpjNQ==} engines: {node: '>=16'} @@ -8428,8 +8444,8 @@ packages: peerDependencies: webpack: ^5.0.0 - node-mock-http@1.0.0: - resolution: {integrity: sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==} + node-mock-http@1.0.2: + resolution: {integrity: sha512-zWaamgDUdo9SSLw47we78+zYw/bDr5gH8pH7oRRs8V3KmBtu8GLgGIbV2p/gRPd3LWpEOpjQj7X1FOU3VFMJ8g==} node-plop@0.26.3: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} @@ -10213,12 +10229,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - trpc-to-openapi@2.4.0: - resolution: {integrity: sha512-B6xrwOC3Ab0q1BWD/QbJzK4OUpCLoT02hAzshSUXEuIZGcJZkMG/OJ4/3gd20dyr8aI+CrFirpWKRIo7JmHbMQ==} + trpc-to-openapi@3.0.0: + resolution: {integrity: sha512-iyG1rmEGzsQeoFn+AcP0fGhDuzh/A7u2MHDUYMAUdaSt72koSG7RJxO9K/7YW9e8vHQcJtVG/Zy+8DvYOr/jWw==} peerDependencies: '@trpc/server': ^11.1.0 - zod: ^3.23.8 - zod-openapi: 4.2.4 + zod: ^4.0.0 + zod-openapi: ^5.0.1 ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} @@ -10273,46 +10289,46 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} + tsx@4.20.4: + resolution: {integrity: sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==} engines: {node: '>=18.0.0'} hasBin: true tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.5.5: - resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==} + turbo-darwin-64@2.5.6: + resolution: {integrity: sha512-3C1xEdo4aFwMJAPvtlPqz1Sw/+cddWIOmsalHFMrsqqydcptwBfu26WW2cDm3u93bUzMbBJ8k3zNKFqxJ9ei2A==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.5: - resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==} + turbo-darwin-arm64@2.5.6: + resolution: {integrity: sha512-LyiG+rD7JhMfYwLqB6k3LZQtYn8CQQUePbpA8mF/hMLPAekXdJo1g0bUPw8RZLwQXUIU/3BU7tXENvhSGz5DPA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.5: - resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==} + turbo-linux-64@2.5.6: + resolution: {integrity: sha512-GOcUTT0xiT/pSnHL4YD6Yr3HreUhU8pUcGqcI2ksIF9b2/r/kRHwGFcsHgpG3+vtZF/kwsP0MV8FTlTObxsYIA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.5: - resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==} + turbo-linux-arm64@2.5.6: + resolution: {integrity: sha512-10Tm15bruJEA3m0V7iZcnQBpObGBcOgUcO+sY7/2vk1bweW34LMhkWi8svjV9iDF68+KJDThnYDlYE/bc7/zzQ==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.5: - resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==} + turbo-windows-64@2.5.6: + resolution: {integrity: sha512-FyRsVpgaj76It0ludwZsNN40ytHN+17E4PFJyeliBEbxrGTc5BexlXVpufB7XlAaoaZVxbS6KT8RofLfDRyEPg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.5: - resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==} + turbo-windows-arm64@2.5.6: + resolution: {integrity: sha512-j/tWu8cMeQ7HPpKri6jvKtyXg9K1gRyhdK4tKrrchH8GNHscPX/F71zax58yYtLRWTiK04zNzPcUJuoS0+v/+Q==} cpu: [arm64] os: [win32] - turbo@2.5.5: - resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} + turbo@2.5.6: + resolution: {integrity: sha512-gxToHmi9oTBNB05UjUsrWf0OyN5ZXtD0apOarC1KIx232Vp3WimRNy3810QzeNSgyD5rsaIDXlxlbnOzlouo+w==} hasBin: true tweetnacl@0.14.5: @@ -10392,8 +10408,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.39.0: - resolution: {integrity: sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==} + typescript-eslint@8.39.1: + resolution: {integrity: sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -10990,16 +11006,16 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod-form-data@2.0.7: - resolution: {integrity: sha512-O27uzKMx7qc7z51KXER326Fp966jqHGvZX3i18CbvElF/QqVsQQN6Q7BnzepkzeBzTJnU3golibVSagf4dp7RQ==} + zod-form-data@3.0.0: + resolution: {integrity: sha512-jTQbmXQU5wMfI+ERZH6EuATzeD9FEOviPasLL2hCUP+FcLagXLtboUM95PHsSOFseL8Nv91YKlwln3zo1sAS2g==} peerDependencies: - zod: '>= 3.11.0' + zod: '>= 3.25.0' - zod-openapi@2.19.0: - resolution: {integrity: sha512-OUAAyBDPPwZ9u61i4k/LieXUzP2re8kFjqdNh2AvHjsyi/aRNz9leDAtMGcSoSzUT5xUeQoACJufBI6FzzZyxA==} - engines: {node: '>=16.11'} + zod-openapi@5.3.0: + resolution: {integrity: sha512-hv3DU37kV39v0MEiQ0vcL06NLS9bTHTb7FNtuFk2zhuATsi+UNcNN6y03z7qbI9NdC6LJS+Knk5shOSCUMwsDQ==} + engines: {node: '>=20'} peerDependencies: - zod: ^3.21.4 + zod: ^3.25.74 || ^4.0.0 zod-validation-error@3.5.3: resolution: {integrity: sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw==} @@ -11007,8 +11023,8 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.0.14: + resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -11435,7 +11451,7 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.8': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.18.20': @@ -11447,7 +11463,7 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.8': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.18.20': @@ -11459,7 +11475,7 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.8': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.18.20': @@ -11471,7 +11487,7 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.8': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -11483,7 +11499,7 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.8': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.18.20': @@ -11495,7 +11511,7 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.8': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -11507,7 +11523,7 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.8': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -11519,7 +11535,7 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.8': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.18.20': @@ -11531,7 +11547,7 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.8': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.18.20': @@ -11543,7 +11559,7 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.8': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.18.20': @@ -11555,7 +11571,7 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.8': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.18.20': @@ -11567,7 +11583,7 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.8': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -11579,7 +11595,7 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.8': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -11591,7 +11607,7 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.8': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -11603,7 +11619,7 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.8': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.18.20': @@ -11615,7 +11631,7 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.8': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.18.20': @@ -11627,10 +11643,10 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.25.8': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.8': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -11642,10 +11658,10 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.25.8': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.25.8': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -11657,10 +11673,10 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.25.8': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.25.8': + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/sunos-x64@0.18.20': @@ -11672,7 +11688,7 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.8': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.18.20': @@ -11684,7 +11700,7 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.18.20': @@ -11696,7 +11712,7 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.8': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.18.20': @@ -11708,12 +11724,12 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.25.8': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.32.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0)': dependencies: - eslint: 9.32.0 + eslint: 9.33.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -11726,9 +11742,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -11746,13 +11762,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.32.0': {} + '@eslint/js@9.33.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.4': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@extractus/feed-extractor@7.1.6': @@ -11901,7 +11917,7 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} - '@ianvs/prettier-plugin-sort-imports@4.6.1(prettier@3.6.2)': + '@ianvs/prettier-plugin-sort-imports@4.6.2(prettier@3.6.2)': dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 @@ -12077,7 +12093,7 @@ snapshots: '@kubernetes/client-node@1.3.0': dependencies: '@types/js-yaml': 4.0.9 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/node-fetch': 2.6.12 '@types/stream-buffers': 3.0.7 form-data: 4.0.1 @@ -12110,9 +12126,9 @@ snapshots: js-base64: 3.7.7 optional: true - '@mantine/charts@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(recharts@2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': + '@mantine/charts@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(recharts@2.15.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1))': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -12122,7 +12138,7 @@ snapshots: dependencies: chroma-js: 3.1.2 - '@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) @@ -12130,24 +12146,24 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-number-format: 5.4.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-remove-scroll: 2.6.2(@types/react@19.1.9)(react@19.1.1) - react-textarea-autosize: 8.5.9(@types/react@19.1.9)(react@19.1.1) + react-remove-scroll: 2.6.2(@types/react@19.1.10)(react@19.1.1) + react-textarea-autosize: 8.5.9(@types/react@19.1.10)(react@19.1.1) type-fest: 4.41.0 transitivePeerDependencies: - '@types/react' - '@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) clsx: 2.1.1 dayjs: 1.11.13 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@mantine/dropzone@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/dropzone@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -12163,25 +12179,25 @@ snapshots: dependencies: react: 19.1.1 - '@mantine/modals@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/modals@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@mantine/notifications@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/notifications@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) '@mantine/store': 8.2.4(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mantine/spotlight@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/spotlight@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) '@mantine/store': 8.2.4(react@19.1.1) react: 19.1.1 @@ -12191,9 +12207,9 @@ snapshots: dependencies: react: 19.1.1 - '@mantine/tiptap@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tiptap/extension-link@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(@tiptap/react@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mantine/tiptap@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tiptap/extension-link@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1))(@tiptap/react@2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) '@tiptap/extension-link': 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1) '@tiptap/react': 2.26.1(@tiptap/core@2.26.1(@tiptap/pm@2.26.1))(@tiptap/pm@2.26.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -12564,7 +12580,7 @@ snapshots: '@remirror/core-constants@3.0.0': {} - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-beta.30': {} '@rollup/pluginutils@5.1.0(rollup@4.21.3)': dependencies: @@ -12679,7 +12695,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.3(semantic-release@24.2.7(typescript@5.9.2))': + '@semantic-release/github@11.0.4(semantic-release@24.2.7(typescript@5.9.2))': dependencies: '@octokit/core': 7.0.2 '@octokit/plugin-paginate-rest': 13.0.0(@octokit/core@7.0.2) @@ -12687,7 +12703,7 @@ snapshots: '@octokit/plugin-throttling': 11.0.1(@octokit/core@7.0.2) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.4.0 + debug: 4.4.1 dir-glob: 3.0.1 globby: 14.0.2 http-proxy-agent: 7.0.2 @@ -13107,19 +13123,19 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@3.25.76)': + '@t3-oss/env-core@0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@4.0.14)': optionalDependencies: arktype: 2.1.20 typescript: 5.9.2 - zod: 3.25.76 + zod: 4.0.14 - '@t3-oss/env-nextjs@0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@3.25.76)': + '@t3-oss/env-nextjs@0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@4.0.14)': dependencies: - '@t3-oss/env-core': 0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@3.25.76) + '@t3-oss/env-core': 0.13.8(arktype@2.1.20)(typescript@5.9.2)(zod@4.0.14) optionalDependencies: arktype: 2.1.20 typescript: 5.9.2 - zod: 3.25.76 + zod: 4.0.14 '@tabler/icons-react@3.34.1(react@19.1.1)': dependencies: @@ -13132,25 +13148,25 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.83.1': {} + '@tanstack/query-core@5.85.3': {} '@tanstack/query-devtools@5.84.0': {} - '@tanstack/react-query-devtools@5.84.2(@tanstack/react-query@5.84.2(react@19.1.1))(react@19.1.1)': + '@tanstack/react-query-devtools@5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(react@19.1.1)': dependencies: '@tanstack/query-devtools': 5.84.0 - '@tanstack/react-query': 5.84.2(react@19.1.1) + '@tanstack/react-query': 5.85.3(react@19.1.1) react: 19.1.1 - '@tanstack/react-query-next-experimental@5.84.2(@tanstack/react-query@5.84.2(react@19.1.1))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react@19.1.1)': + '@tanstack/react-query-next-experimental@5.85.3(@tanstack/react-query@5.85.3(react@19.1.1))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react@19.1.1)': dependencies: - '@tanstack/react-query': 5.84.2(react@19.1.1) + '@tanstack/react-query': 5.85.3(react@19.1.1) next: 15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0) react: 19.1.1 - '@tanstack/react-query@5.84.2(react@19.1.1)': + '@tanstack/react-query@5.85.3(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.83.1 + '@tanstack/query-core': 5.85.3 react: 19.1.1 '@tanstack/react-table@8.20.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': @@ -13410,7 +13426,7 @@ snapshots: '@trpc/server': 11.4.4(typescript@5.9.2) typescript: 5.9.2 - '@trpc/next@11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@trpc/next@11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/react-query@11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(next@15.4.6(@babel/core@7.26.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(sass@1.90.0))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': dependencies: '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.4.4(typescript@5.9.2) @@ -13419,12 +13435,12 @@ snapshots: react-dom: 19.1.1(react@19.1.1) typescript: 5.9.2 optionalDependencies: - '@tanstack/react-query': 5.84.2(react@19.1.1) - '@trpc/react-query': 11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) + '@tanstack/react-query': 5.85.3(react@19.1.1) + '@trpc/react-query': 11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) - '@trpc/react-query@11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@trpc/react-query@11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': dependencies: - '@tanstack/react-query': 5.84.2(react@19.1.1) + '@tanstack/react-query': 5.85.3(react@19.1.1) '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.4.4(typescript@5.9.2) react: 19.1.1 @@ -13435,9 +13451,9 @@ snapshots: dependencies: typescript: 5.9.2 - '@trpc/tanstack-react-query@11.4.4(@tanstack/react-query@5.84.2(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': + '@trpc/tanstack-react-query@11.4.4(@tanstack/react-query@5.85.3(react@19.1.1))(@trpc/client@11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2))(@trpc/server@11.4.4(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)': dependencies: - '@tanstack/react-query': 5.84.2(react@19.1.1) + '@tanstack/react-query': 5.85.3(react@19.1.1) '@trpc/client': 11.4.4(@trpc/server@11.4.4(typescript@5.9.2))(typescript@5.9.2) '@trpc/server': 11.4.4(typescript@5.9.2) react: 19.1.1 @@ -13454,9 +13470,9 @@ snapshots: '@tsconfig/svelte@1.0.13': {} - '@turbo/gen@2.5.5(@types/node@22.17.1)(typescript@5.9.2)': + '@turbo/gen@2.5.6(@types/node@22.17.2)(typescript@5.9.2)': dependencies: - '@turbo/workspaces': 2.5.5 + '@turbo/workspaces': 2.5.6 commander: 10.0.1 fs-extra: 10.1.0 inquirer: 8.2.6 @@ -13464,7 +13480,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@22.17.1)(typescript@5.9.2) + ts-node: 10.9.2(@types/node@22.17.2)(typescript@5.9.2) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -13474,7 +13490,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@2.5.5': + '@turbo/workspaces@2.5.6': dependencies: commander: 10.0.1 execa: 5.1.1 @@ -13490,11 +13506,11 @@ snapshots: '@types/adm-zip@0.5.7': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/asn1@0.2.4': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/aws-lambda@8.10.146': {} @@ -13521,16 +13537,16 @@ snapshots: '@types/bcrypt@6.0.0': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/chai@5.2.2': dependencies: @@ -13540,7 +13556,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/cookie@0.4.1': {} @@ -13549,11 +13565,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 4.17.21 '@types/keygrip': 1.0.6 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/cors@2.8.17': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/css-font-loading-module@0.0.7': {} @@ -13591,13 +13607,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/ssh2': 1.15.1 '@types/dockerode@3.3.42': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/ssh2': 1.15.1 '@types/estree-jsx@1.0.5': @@ -13610,7 +13626,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -13625,7 +13641,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/hast@2.3.10': dependencies: @@ -13673,7 +13689,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 form-data: 4.0.1 '@types/node-unifi@2.5.1(patch_hash=5e6ae51e2a17a7f9729bfa30b0eb3d0842a5810ac6db47603ab4a6efa1ed84c5)': @@ -13684,7 +13700,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.17.1': + '@types/node@22.17.2': dependencies: undici-types: 6.21.0 @@ -13700,11 +13716,11 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.1.7(@types/react@19.1.9)': + '@types/react-dom@19.1.7(@types/react@19.1.10)': dependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 - '@types/react@19.1.9': + '@types/react@19.1.10': dependencies: csstype: 3.1.3 @@ -13713,21 +13729,21 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/send': 0.17.4 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.1': @@ -13736,15 +13752,15 @@ snapshots: '@types/stream-buffers@3.0.7': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/swagger-ui-react@5.18.0': dependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 '@types/through@0.0.33': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/tinycolor2@1.4.6': {} @@ -13763,21 +13779,21 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 - '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.0)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/type-utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.0 - eslint: 9.32.0 + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.1 + eslint: 9.33.0 graphemer: 1.4.0 ignore: 7.0.4 natural-compare: 1.4.0 @@ -13786,56 +13802,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 - eslint: 9.32.0 + eslint: 9.33.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.39.0': + '@typescript-eslint/scope-manager@8.39.1': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) debug: 4.4.1 - eslint: 9.32.0 + eslint: 9.33.0 ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.39.0': {} + '@typescript-eslint/types@8.39.1': {} - '@typescript-eslint/typescript-estree@8.39.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/visitor-keys': 8.39.0 + '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/visitor-keys': 8.39.1 debug: 4.4.1 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -13846,20 +13862,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.32.0)(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) - '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/types': 8.39.0 - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - eslint: 9.32.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0) + '@typescript-eslint/scope-manager': 8.39.1 + '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + eslint: 9.33.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.39.0': + '@typescript-eslint/visitor-keys@8.39.1': dependencies: - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/types': 8.39.1 eslint-visitor-keys: 4.2.1 '@umami/node@0.4.0': {} @@ -13894,15 +13910,15 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@4.7.0(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))': + '@vitejs/plugin-react@5.0.0(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@rolldown/pluginutils': 1.0.0-beta.30 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) transitivePeerDependencies: - supports-color @@ -13921,7 +13937,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) transitivePeerDependencies: - supports-color @@ -13933,13 +13949,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))': + '@vitest/mocker@3.2.4(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -13970,7 +13986,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) '@vitest/utils@3.2.4': dependencies: @@ -14921,7 +14937,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.4: + crossws@0.3.5: dependencies: uncrypto: 0.1.3 @@ -15210,8 +15226,8 @@ snapshots: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.25.8 - esbuild-register: 3.6.0(esbuild@0.25.8) + esbuild: 0.25.9 + esbuild-register: 3.6.0(esbuild@0.25.9) transitivePeerDependencies: - supports-color @@ -15223,10 +15239,10 @@ snapshots: gel: 2.0.0 mysql2: 3.14.3 - drizzle-zod@0.7.1(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@3.25.76): + drizzle-zod@0.8.2(drizzle-orm@0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3))(zod@4.0.14): dependencies: drizzle-orm: 0.44.4(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.2.0)(gel@2.0.0)(mysql2@3.14.3) - zod: 3.25.76 + zod: 4.0.14 dunder-proto@1.0.1: dependencies: @@ -15281,7 +15297,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 22.17.1 + '@types/node': 22.17.2 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -15543,10 +15559,10 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-register@3.6.0(esbuild@0.25.8): + esbuild-register@3.6.0(esbuild@0.25.9): dependencies: debug: 4.4.1 - esbuild: 0.25.8 + esbuild: 0.25.9 transitivePeerDependencies: - supports-color @@ -15627,34 +15643,34 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.8: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -15674,15 +15690,15 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@9.32.0): + eslint-config-prettier@10.1.8(eslint@9.33.0): dependencies: - eslint: 9.32.0 + eslint: 9.33.0 - eslint-config-turbo@2.5.5(eslint@9.32.0)(turbo@2.5.5): + eslint-config-turbo@2.5.6(eslint@9.33.0)(turbo@2.5.6): dependencies: - eslint: 9.32.0 - eslint-plugin-turbo: 2.5.5(eslint@9.32.0)(turbo@2.5.5) - turbo: 2.5.5 + eslint: 9.33.0 + eslint-plugin-turbo: 2.5.6(eslint@9.33.0)(turbo@2.5.6) + turbo: 2.5.6 eslint-import-resolver-node@0.3.9: dependencies: @@ -15692,17 +15708,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - eslint: 9.32.0 + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + eslint: 9.33.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15711,9 +15727,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.32.0 + eslint: 9.33.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.32.0) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -15725,13 +15741,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.32.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.33.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -15741,7 +15757,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.32.0 + eslint: 9.33.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -15750,11 +15766,11 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.32.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.33.0): dependencies: - eslint: 9.32.0 + eslint: 9.33.0 - eslint-plugin-react@7.37.5(eslint@9.32.0): + eslint-plugin-react@7.37.5(eslint@9.33.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -15762,7 +15778,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.32.0 + eslint: 9.33.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -15776,11 +15792,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.5.5(eslint@9.32.0)(turbo@2.5.5): + eslint-plugin-turbo@2.5.6(eslint@9.33.0)(turbo@2.5.6): dependencies: dotenv: 16.0.3 - eslint: 9.32.0 - turbo: 2.5.5 + eslint: 9.33.0 + turbo: 2.5.6 eslint-scope@5.1.1: dependencies: @@ -15796,16 +15812,16 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.32.0: + eslint@9.33.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.32.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.32.0 - '@eslint/plugin-kit': 0.3.4 + '@eslint/js': 9.33.0 + '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 @@ -15988,7 +16004,7 @@ snapshots: dependencies: '@babel/types': 7.26.0 - fastify@5.4.0: + fastify@5.5.0: dependencies: '@fastify/ajv-compiler': 4.0.2 '@fastify/error': 4.2.0 @@ -16003,7 +16019,7 @@ snapshots: process-warning: 5.0.0 rfdc: 1.4.1 secure-json-parse: 4.0.0 - semver: 7.7.1 + semver: 7.7.2 toad-cache: 3.7.0 fastq@1.17.1: @@ -16366,11 +16382,11 @@ snapshots: h3@1.15.1: dependencies: cookie-es: 1.2.2 - crossws: 0.3.4 + crossws: 0.3.5 defu: 6.1.4 destr: 2.0.3 iron-webcrypto: 1.2.1 - node-mock-http: 1.0.0 + node-mock-http: 1.0.2 radix3: 1.1.2 ufo: 1.6.1 uncrypto: 0.1.3 @@ -16980,24 +16996,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 merge-stream: 2.0.0 supports-color: 8.1.1 jose@6.0.8: {} - jotai@2.13.0(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.1.9)(react@19.1.1): + jotai@2.13.1(@babel/core@7.26.0)(@babel/template@7.27.2)(@types/react@19.1.10)(react@19.1.1): optionalDependencies: '@babel/core': 7.26.0 '@babel/template': 7.27.2 - '@types/react': 19.1.9 + '@types/react': 19.1.10 react: 19.1.1 - jotai@2.13.0(@babel/core@7.28.0)(@babel/template@7.27.2)(@types/react@19.1.9)(react@19.1.1): + jotai@2.13.1(@babel/core@7.28.0)(@babel/template@7.27.2)(@types/react@19.1.10)(react@19.1.1): optionalDependencies: '@babel/core': 7.28.0 '@babel/template': 7.27.2 - '@types/react': 19.1.9 + '@types/react': 19.1.10 react: 19.1.1 js-base64@3.7.7: @@ -17276,10 +17292,15 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + mantine-form-zod-resolver@1.2.1(@mantine/form@8.2.4(react@19.1.1))(zod@4.0.14): dependencies: - '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mantine/dates': 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/form': 8.2.4(react@19.1.1) + zod: 4.0.14 + + mantine-react-table@2.0.0-beta.9(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/dates@8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(@tabler/icons-react@3.34.1(react@19.1.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + dependencies: + '@mantine/core': 8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mantine/dates': 8.2.4(@mantine/core@8.2.4(@mantine/hooks@8.2.4(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mantine/hooks@8.2.4(react@19.1.1))(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mantine/hooks': 8.2.4(react@19.1.1) '@tabler/icons-react': 3.34.1(react@19.1.1) '@tanstack/match-sorter-utils': 8.19.4 @@ -17809,7 +17830,7 @@ snapshots: loader-utils: 2.0.4 webpack: 5.94.0 - node-mock-http@1.0.0: {} + node-mock-http@1.0.2: {} node-plop@0.26.3: dependencies: @@ -18467,7 +18488,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.17.1 + '@types/node': 22.17.2 long: 5.2.3 proxmox-api@1.1.1: @@ -18595,11 +18616,11 @@ snapshots: react-is@18.3.1: {} - react-markdown@10.1.0(@types/react@19.1.9)(react@19.1.1): + react-markdown@10.1.0(@types/react@19.1.10)(react@19.1.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@types/react': 19.1.9 + '@types/react': 19.1.10 devlop: 1.1.0 hast-util-to-jsx-runtime: 2.3.6 html-url-attributes: 3.0.1 @@ -18618,35 +18639,35 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-redux@9.2.0(@types/react@19.1.9)(react@19.1.1)(redux@5.0.1): + react-redux@9.2.0(@types/react@19.1.10)(react@19.1.1)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 redux: 5.0.1 react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.9)(react@19.1.1): + react-remove-scroll-bar@2.3.8(@types/react@19.1.10)(react@19.1.1): dependencies: react: 19.1.1 - react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.10)(react@19.1.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 - react-remove-scroll@2.6.2(@types/react@19.1.9)(react@19.1.1): + react-remove-scroll@2.6.2(@types/react@19.1.10)(react@19.1.1): dependencies: react: 19.1.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.9)(react@19.1.1) - react-style-singleton: 2.2.3(@types/react@19.1.9)(react@19.1.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.1.10)(react@19.1.1) + react-style-singleton: 2.2.3(@types/react@19.1.10)(react@19.1.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.9)(react@19.1.1) - use-sidecar: 1.1.2(@types/react@19.1.9)(react@19.1.1) + use-callback-ref: 1.3.3(@types/react@19.1.10)(react@19.1.1) + use-sidecar: 1.1.2(@types/react@19.1.10)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 react-scan@0.0.31: dependencies: @@ -18669,13 +18690,13 @@ snapshots: react-dom: 19.1.1(react@19.1.1) react-transition-group: 4.4.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-style-singleton@2.2.3(@types/react@19.1.9)(react@19.1.1): + react-style-singleton@2.2.3(@types/react@19.1.10)(react@19.1.1): dependencies: get-nonce: 1.0.1 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 react-syntax-highlighter@15.6.1(react@19.1.1): dependencies: @@ -18687,12 +18708,12 @@ snapshots: react: 19.1.1 refractor: 3.6.0 - react-textarea-autosize@8.5.9(@types/react@19.1.9)(react@19.1.1): + react-textarea-autosize@8.5.9(@types/react@19.1.10)(react@19.1.1): dependencies: '@babel/runtime': 7.25.6 react: 19.1.1 use-composed-ref: 1.3.0(react@19.1.1) - use-latest: 1.2.1(@types/react@19.1.9)(react@19.1.1) + use-latest: 1.2.1(@types/react@19.1.10)(react@19.1.1) transitivePeerDependencies: - '@types/react' @@ -19073,7 +19094,7 @@ snapshots: dependencies: '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.7(typescript@5.9.2)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.3(semantic-release@24.2.7(typescript@5.9.2)) + '@semantic-release/github': 11.0.4(semantic-release@24.2.7(typescript@5.9.2)) '@semantic-release/npm': 12.0.2(semantic-release@24.2.7(typescript@5.9.2)) '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.7(typescript@5.9.2)) aggregate-error: 5.0.0 @@ -19635,7 +19656,7 @@ snapshots: transitivePeerDependencies: - debug - swagger-ui-react@5.27.1(@types/react@19.1.9)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + swagger-ui-react@5.27.1(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime-corejs3': 7.27.1 '@scarf/scarf': 1.4.0 @@ -19659,7 +19680,7 @@ snapshots: react-immutable-proptypes: 2.2.0(immutable@3.8.2) react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-inspector: 6.0.2(react@19.1.1) - react-redux: 9.2.0(@types/react@19.1.9)(react@19.1.1)(redux@5.0.1) + react-redux: 9.2.0(@types/react@19.1.10)(react@19.1.1)(redux@5.0.1) react-syntax-highlighter: 15.6.1(react@19.1.1) redux: 5.0.1 redux-immutable: 4.0.0(immutable@3.8.2) @@ -19912,14 +19933,14 @@ snapshots: trough@2.2.0: {} - trpc-to-openapi@2.4.0(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@2.19.0(zod@3.25.76))(zod@3.25.76): + trpc-to-openapi@3.0.0(@trpc/server@11.4.4(typescript@5.9.2))(zod-openapi@5.3.0(zod@4.0.14))(zod@4.0.14): dependencies: '@trpc/server': 11.4.4(typescript@5.9.2) co-body: 6.2.0 h3: 1.15.1 openapi3-ts: 4.4.0 - zod: 3.25.76 - zod-openapi: 2.19.0(zod@3.25.76) + zod: 4.0.14 + zod-openapi: 5.3.0(zod@4.0.14) optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.6.1 @@ -19929,14 +19950,14 @@ snapshots: ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@22.17.1)(typescript@5.9.2): + ts-node@10.9.2(@types/node@22.17.2)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.17.1 + '@types/node': 22.17.2 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -19976,9 +19997,9 @@ snapshots: tsscmp@1.0.6: {} - tsx@4.20.3: + tsx@4.20.4: dependencies: - esbuild: 0.25.8 + esbuild: 0.25.9 get-tsconfig: 4.8.1 optionalDependencies: fsevents: 2.3.3 @@ -19987,32 +20008,32 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo-darwin-64@2.5.5: + turbo-darwin-64@2.5.6: optional: true - turbo-darwin-arm64@2.5.5: + turbo-darwin-arm64@2.5.6: optional: true - turbo-linux-64@2.5.5: + turbo-linux-64@2.5.6: optional: true - turbo-linux-arm64@2.5.5: + turbo-linux-arm64@2.5.6: optional: true - turbo-windows-64@2.5.5: + turbo-windows-64@2.5.6: optional: true - turbo-windows-arm64@2.5.5: + turbo-windows-arm64@2.5.6: optional: true - turbo@2.5.5: + turbo@2.5.6: optionalDependencies: - turbo-darwin-64: 2.5.5 - turbo-darwin-arm64: 2.5.5 - turbo-linux-64: 2.5.5 - turbo-linux-arm64: 2.5.5 - turbo-windows-64: 2.5.5 - turbo-windows-arm64: 2.5.5 + turbo-darwin-64: 2.5.6 + turbo-darwin-arm64: 2.5.6 + turbo-linux-64: 2.5.6 + turbo-linux-arm64: 2.5.6 + turbo-windows-64: 2.5.6 + turbo-windows-arm64: 2.5.6 tweetnacl@0.14.5: {} @@ -20112,13 +20133,13 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.39.0(eslint@9.32.0)(typescript@5.9.2): + typescript-eslint@8.39.1(eslint@9.33.0)(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.32.0)(typescript@5.9.2))(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.32.0)(typescript@5.9.2) - eslint: 9.32.0 + '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2) + eslint: 9.33.0 typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -20279,12 +20300,12 @@ snapshots: url-toolkit@2.2.5: {} - use-callback-ref@1.3.3(@types/react@19.1.9)(react@19.1.1): + use-callback-ref@1.3.3(@types/react@19.1.10)(react@19.1.1): dependencies: react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 use-composed-ref@1.3.0(react@19.1.1): dependencies: @@ -20303,26 +20324,26 @@ snapshots: intl-messageformat: 10.7.1 react: 19.1.1 - use-isomorphic-layout-effect@1.1.2(@types/react@19.1.9)(react@19.1.1): + use-isomorphic-layout-effect@1.1.2(@types/react@19.1.10)(react@19.1.1): dependencies: react: 19.1.1 optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 - use-latest@1.2.1(@types/react@19.1.9)(react@19.1.1): + use-latest@1.2.1(@types/react@19.1.10)(react@19.1.1): dependencies: react: 19.1.1 - use-isomorphic-layout-effect: 1.1.2(@types/react@19.1.9)(react@19.1.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@19.1.10)(react@19.1.1) optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 - use-sidecar@1.1.2(@types/react@19.1.9)(react@19.1.1): + use-sidecar@1.1.2(@types/react@19.1.10)(react@19.1.1): dependencies: detect-node-es: 1.1.0 react: 19.1.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.9 + '@types/react': 19.1.10 use-sync-external-store@1.4.0(react@19.1.1): dependencies: @@ -20400,13 +20421,13 @@ snapshots: dependencies: global: 4.4.0 - vite-node@3.2.4(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): + vite-node@3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) transitivePeerDependencies: - '@types/node' - less @@ -20418,34 +20439,34 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.9.2) optionalDependencies: - vite: 5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): + vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.21.3 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.17.2 fsevents: 2.3.3 sass: 1.90.0 sugarss: 5.0.0(postcss@8.4.47) terser: 5.39.0 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.17.1)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.17.2)(@vitest/ui@3.2.4)(jsdom@26.1.0)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) + '@vitest/mocker': 3.2.4(vite@5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -20463,12 +20484,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.5(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) - vite-node: 3.2.4(@types/node@22.17.1)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite: 5.4.5(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) + vite-node: 3.2.4(@types/node@22.17.2)(sass@1.90.0)(sugarss@5.0.0(postcss@8.4.47))(terser@5.39.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.17.1 + '@types/node': 22.17.2 '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: @@ -20781,19 +20802,19 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.5.2 - zod-form-data@2.0.7(zod@3.25.76): + zod-form-data@3.0.0(zod@4.0.14): dependencies: '@rvf/set-get': 7.0.1 - zod: 3.25.76 + zod: 4.0.14 - zod-openapi@2.19.0(zod@3.25.76): + zod-openapi@5.3.0(zod@4.0.14): dependencies: - zod: 3.25.76 + zod: 4.0.14 - zod-validation-error@3.5.3(zod@3.25.76): + zod-validation-error@3.5.3(zod@4.0.14): dependencies: - zod: 3.25.76 + zod: 4.0.14 - zod@3.25.76: {} + zod@4.0.14: {} zwitch@2.0.4: {} diff --git a/static-data/translators.json b/static-data/translators.json index 1e9fb4eb7..72ff7ca5b 100644 --- a/static-data/translators.json +++ b/static-data/translators.json @@ -1 +1 @@ -[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"Skick","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12619811/medium/0331f1de413a645b4516bc4e037f31bb.jpg"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"vittoriosoccorso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16498805/medium/17086b2f1981f734edd1572f79c3158a.jpeg"},{"username":"Worgen325","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16533177/medium/4a62cc6b06095751aeb4b1b3e96db93f.png"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/2bd0f716f062632f78085b3828a72b6d_default.png"}] \ No newline at end of file +[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"Skick","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12619811/medium/0331f1de413a645b4516bc4e037f31bb.jpg"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"vittoriosoccorso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16498805/medium/17086b2f1981f734edd1572f79c3158a.jpeg"},{"username":"Worgen325","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16533177/medium/4a62cc6b06095751aeb4b1b3e96db93f.png"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/2bd0f716f062632f78085b3828a72b6d_default.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"}] \ No newline at end of file diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 97f57a2eb..69624ffa6 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -19,17 +19,17 @@ "dependencies": { "@next/eslint-plugin-next": "15.4.6", "eslint-config-prettier": "^10.1.8", - "eslint-config-turbo": "^2.5.5", + "eslint-config-turbo": "^2.5.6", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "typescript-eslint": "^8.39.0" + "typescript-eslint": "^8.39.1" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.32.0", + "eslint": "^9.33.0", "typescript": "^5.9.2" } } diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index a5e29ff74..f32987a0d 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -10,7 +10,7 @@ }, "prettier": "@homarr/prettier-config", "dependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.6.1", + "@ianvs/prettier-plugin-sort-imports": "^4.6.2", "prettier": "^3.6.2" }, "devDependencies": {