diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 0119a8be9..1bd9ef399 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.5.0 - 1.4.0 - 1.3.1 - 1.3.0 diff --git a/.nvmrc b/.nvmrc index d5b283a3a..7d41c735d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.13.1 +22.14.0 diff --git a/Dockerfile b/Dockerfile index d971c346d..7dcce1216 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.13.1-alpine AS base +FROM node:22.14.0-alpine AS base FROM base AS builder RUN apk add --no-cache libc6-compat diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 35aabdebe..eb325613a 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -18,6 +18,7 @@ "@homarr/analytics": "workspace:^0.1.0", "@homarr/api": "workspace:^0.1.0", "@homarr/auth": "workspace:^0.1.0", + "@homarr/boards": "workspace:^0.1.0", "@homarr/certificates": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/cron-job-status": "workspace:^0.1.0", @@ -42,12 +43,12 @@ "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", - "@mantine/colors-generator": "^7.16.2", - "@mantine/core": "^7.16.2", - "@mantine/dropzone": "^7.16.2", - "@mantine/hooks": "^7.16.2", - "@mantine/modals": "^7.16.2", - "@mantine/tiptap": "^7.16.2", + "@mantine/colors-generator": "^7.16.3", + "@mantine/core": "^7.16.3", + "@mantine/dropzone": "^7.16.3", + "@mantine/hooks": "^7.16.3", + "@mantine/modals": "^7.16.3", + "@mantine/tiptap": "^7.16.3", "@million/lint": "1.0.14", "@t3-oss/env-nextjs": "^0.12.0", "@tabler/icons-react": "^3.30.0", @@ -67,33 +68,33 @@ "dotenv": "^16.4.7", "flag-icons": "^7.3.2", "glob": "^11.0.1", - "jotai": "^2.11.3", + "jotai": "^2.12.0", "mantine-react-table": "2.0.0-beta.8", - "next": "15.1.6", + "next": "15.1.7", "postcss-preset-mantine": "^1.17.0", "prismjs": "^1.29.0", "react": "19.0.0", "react-dom": "19.0.0", "react-error-boundary": "^5.0.0", "react-simple-code-editor": "^0.14.1", - "sass": "^1.84.0", + "sass": "^1.85.0", "superjson": "2.2.2", "swagger-ui-react": "^5.18.3", "use-deep-compare-effect": "^1.8.1", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "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.13.1", + "@types/node": "^22.13.4", "@types/prismjs": "^1.26.5", "@types/react": "19.0.8", "@types/react-dom": "19.0.3", "@types/swagger-ui-react": "^5.18.0", "concurrently": "^9.1.2", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "node-loader": "^2.1.0", "prettier": "^3.4.2", "typescript": "^5.7.3" diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_client.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_client.tsx index 25a550dca..0f3454653 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_client.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_client.tsx @@ -5,12 +5,13 @@ import { Box, LoadingOverlay, Stack } from "@mantine/core"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import { BoardCategorySection } from "~/components/board/sections/category-section"; import { BoardEmptySection } from "~/components/board/sections/empty-section"; import { BoardBackgroundVideo } from "~/components/layout/background"; import { fullHeightWithoutHeaderAndFooter } from "~/constants"; -import { useIsBoardReady, useRequiredBoard } from "./_context"; +import { useIsBoardReady } from "./_ready-context"; let boardName: string | null = null; diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx deleted file mode 100644 index 808759af1..000000000 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx +++ /dev/null @@ -1,118 +0,0 @@ -"use client"; - -import type { Dispatch, PropsWithChildren, SetStateAction } from "react"; -import { createContext, useCallback, useContext, useEffect, useState } from "react"; -import { usePathname } from "next/navigation"; - -import type { RouterOutputs } from "@homarr/api"; -import { clientApi } from "@homarr/api/client"; - -import { updateBoardName } from "./_client"; - -const BoardContext = createContext<{ - board: RouterOutputs["board"]["getHomeBoard"]; - isReady: boolean; - markAsReady: (id: string) => void; - isEditMode: boolean; - setEditMode: Dispatch>; -} | null>(null); - -export const BoardProvider = ({ - children, - initialBoard, -}: PropsWithChildren<{ - initialBoard: RouterOutputs["board"]["getBoardByName"]; -}>) => { - const pathname = usePathname(); - const utils = clientApi.useUtils(); - const [readySections, setReadySections] = useState([]); - const [isEditMode, setEditMode] = useState(false); - const { data } = clientApi.board.getBoardByName.useQuery( - { name: initialBoard.name }, - { - initialData: initialBoard, - refetchOnWindowFocus: false, - refetchOnReconnect: false, - }, - ); - // Update the board name so it can be used within updateBoard method - updateBoardName(initialBoard.name); - - // Invalidate the board when the pathname changes - // This allows to refetch the board when it might have changed - e.g. if someone else added an item - useEffect(() => { - return () => { - setReadySections([]); - void utils.board.getBoardByName.invalidate({ name: initialBoard.name }); - }; - }, [pathname, utils, initialBoard.name]); - - useEffect(() => { - setReadySections((previous) => previous.filter((id) => data.sections.some((section) => section.id === id))); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [data.sections.length, setReadySections]); - - const markAsReady = useCallback((id: string) => { - setReadySections((previous) => (previous.includes(id) ? previous : [...previous, id])); - }, []); - - return ( - - {children} - - ); -}; - -export const useMarkSectionAsReady = () => { - const context = useContext(BoardContext); - - if (!context) { - throw new Error("Board is required"); - } - - return context.markAsReady; -}; - -export const useIsBoardReady = () => { - const context = useContext(BoardContext); - - if (!context) { - throw new Error("Board is required"); - } - - return context.isReady; -}; - -export const useRequiredBoard = () => { - const optionalBoard = useOptionalBoard(); - - if (!optionalBoard) { - throw new Error("Board is required"); - } - - return optionalBoard; -}; - -export const useOptionalBoard = () => { - const context = useContext(BoardContext); - - return context?.board; -}; - -export const useEditMode = () => { - const context = useContext(BoardContext); - - if (!context) { - throw new Error("Board is required"); - } - - return [context.isEditMode, context.setEditMode] as const; -}; diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_custom-css.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_custom-css.tsx index ab01aff39..4ef289946 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_custom-css.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_custom-css.tsx @@ -1,6 +1,6 @@ "use client"; -import { useRequiredBoard } from "./_context"; +import { useRequiredBoard } from "@homarr/boards/context"; export const CustomCss = () => { const board = useRequiredBoard(); diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_header-actions.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_header-actions.tsx index 74c617d09..e4029bd3a 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_header-actions.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_header-actions.tsx @@ -20,6 +20,8 @@ import { } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; +import { useEditMode } from "@homarr/boards/edit-mode"; import { revalidatePathActionAsync } from "@homarr/common/client"; import { useConfirmModal, useModalAction } from "@homarr/modals"; import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; @@ -32,7 +34,6 @@ import { CategoryEditModal } from "~/components/board/sections/category/category import { useDynamicSectionActions } from "~/components/board/sections/dynamic/dynamic-actions"; import { HeaderButton } from "~/components/layout/header/button"; import { env } from "~/env"; -import { useEditMode, useRequiredBoard } from "./_context"; export const BoardContentHeaderActions = () => { const [isEditMode] = useEditMode(); @@ -119,7 +120,7 @@ const AddMenu = () => { }; const EditModeMenu = () => { - const [isEditMode, setEditMode] = useEditMode(); + const [isEditMode, { open, close }] = useEditMode(); const board = useRequiredBoard(); const utils = clientApi.useUtils(); const t = useScopedI18n("board.action.edit"); @@ -131,7 +132,7 @@ const EditModeMenu = () => { }); void utils.board.getBoardByName.invalidate({ name: board.name }); void revalidatePathActionAsync(`/boards/${board.name}`); - setEditMode(false); + close(); }, onError() { showErrorNotification({ @@ -143,8 +144,8 @@ const EditModeMenu = () => { const toggle = useCallback(() => { if (isEditMode) return saveBoard(board); - setEditMode(true); - }, [board, isEditMode, saveBoard, setEditMode]); + open(); + }, [board, isEditMode, saveBoard, open]); useHotkeys([["mod+e", toggle]]); usePreventLeaveWithDirty(isEditMode); diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_ready-context.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_ready-context.tsx new file mode 100644 index 000000000..dcd07a311 --- /dev/null +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_ready-context.tsx @@ -0,0 +1,67 @@ +"use client"; + +import type { PropsWithChildren } from "react"; +import { createContext, useCallback, useContext, useEffect, useState } from "react"; +import { usePathname } from "next/navigation"; + +import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; + +const BoardReadyContext = createContext<{ + isReady: boolean; + markAsReady: (id: string) => void; +} | null>(null); + +export const BoardReadyProvider = ({ children }: PropsWithChildren) => { + const pathname = usePathname(); + const utils = clientApi.useUtils(); + const board = useRequiredBoard(); + const [readySections, setReadySections] = useState([]); + + // Reset sections required for ready state + useEffect(() => { + return () => { + setReadySections([]); + }; + }, [pathname, utils]); + + useEffect(() => { + setReadySections((previous) => previous.filter((id) => board.sections.some((section) => section.id === id))); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [board.sections.length, setReadySections]); + + const markAsReady = useCallback((id: string) => { + setReadySections((previous) => (previous.includes(id) ? previous : [...previous, id])); + }, []); + + return ( + + {children} + + ); +}; + +export const useMarkSectionAsReady = () => { + const context = useContext(BoardReadyContext); + + if (!context) { + throw new Error("BoardReadyProvider is required"); + } + + return context.markAsReady; +}; + +export const useIsBoardReady = () => { + const context = useContext(BoardReadyContext); + + if (!context) { + throw new Error("BoardReadyProvider is required"); + } + + return context.isReady; +}; diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx index 755c0a42b..bde65aa42 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_theme.tsx @@ -4,10 +4,10 @@ import type { PropsWithChildren } from "react"; import type { MantineColorsTuple } from "@mantine/core"; import { createTheme, darken, lighten, MantineProvider } from "@mantine/core"; +import { useRequiredBoard } from "@homarr/boards/context"; import type { ColorScheme } from "@homarr/definitions"; import { useColorSchemeManager } from "../../_client-providers/mantine"; -import { useRequiredBoard } from "./_context"; export const BoardMantineProvider = ({ children, diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_behavior.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_behavior.tsx new file mode 100644 index 000000000..fdfd0042b --- /dev/null +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_behavior.tsx @@ -0,0 +1,48 @@ +"use client"; + +import { Button, Group, Stack, Switch } from "@mantine/core"; + +import { useForm } from "@homarr/form"; +import { useI18n } from "@homarr/translation/client"; + +import type { Board } from "../../_types"; +import { useSavePartialSettingsMutation } from "./_shared"; + +interface Props { + board: Board; +} + +export const BehaviorSettingsContent = ({ board }: Props) => { + const t = useI18n(); + const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board); + const form = useForm({ + initialValues: { + disableStatus: board.disableStatus, + }, + }); + + return ( +
{ + savePartialSettings({ + id: board.id, + ...values, + }); + })} + > + + + + + + + +
+ ); +}; diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_danger.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_danger.tsx index 115605279..699da6003 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_danger.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_danger.tsx @@ -5,11 +5,11 @@ import { useRouter } from "next/navigation"; import { Button, Divider, Group, Stack, Text } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import { useConfirmModal, useModalAction } from "@homarr/modals"; import { useScopedI18n } from "@homarr/translation/client"; import { BoardRenameModal } from "~/components/board/modals/board-rename-modal"; -import { useRequiredBoard } from "../../(content)/_context"; import classes from "./danger.module.css"; export const DangerZoneSettingsContent = ({ hideVisibility }: { hideVisibility: boolean }) => { diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_general.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_general.tsx index 0303be98d..efa640f93 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/settings/_general.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/_general.tsx @@ -5,13 +5,13 @@ import { Button, Grid, Group, Loader, Stack, TextInput, Tooltip } from "@mantine import { useDebouncedValue, useDocumentTitle, useFavicon } from "@mantine/hooks"; import { IconAlertTriangle } from "@tabler/icons-react"; +import { useUpdateBoard } from "@homarr/boards/updater"; import { useZodForm } from "@homarr/form"; import { useI18n } from "@homarr/translation/client"; import { validation } from "@homarr/validation"; import { createMetaTitle } from "~/metadata"; import type { Board } from "../../_types"; -import { useUpdateBoard } from "../../(content)/_client"; import { useSavePartialSettingsMutation } from "./_shared"; interface Props { diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx index 1ffb892d1..4304f51da 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx @@ -4,6 +4,7 @@ import { AccordionControl, AccordionItem, AccordionPanel, Container, Stack, Text import { IconAlertTriangle, IconBrush, + IconClick, IconFileTypeCss, IconLayout, IconPhoto, @@ -23,6 +24,7 @@ import type { TablerIcon } from "@homarr/ui"; import { getBoardPermissionsAsync } from "~/components/board/permissions/server"; import { ActiveTabAccordion } from "../../../../../components/active-tab-accordion"; import { BackgroundSettingsContent } from "./_background"; +import { BehaviorSettingsContent } from "./_behavior"; import { BoardAccessSettings } from "./_board-access"; import { ColorSettingsContent } from "./_colors"; import { CustomCssSettingsContent } from "./_customCss"; @@ -95,6 +97,9 @@ export default async function BoardSettingsPage(props: Props) { + + + {hasFullAccess && ( <> diff --git a/apps/nextjs/src/app/[locale]/boards/_header-actions.tsx b/apps/nextjs/src/app/[locale]/boards/_header-actions.tsx index 299bbb05f..c68be29e9 100644 --- a/apps/nextjs/src/app/[locale]/boards/_header-actions.tsx +++ b/apps/nextjs/src/app/[locale]/boards/_header-actions.tsx @@ -2,8 +2,9 @@ import { IconLayoutBoard } from "@tabler/icons-react"; +import { useRequiredBoard } from "@homarr/boards/context"; + import { HeaderButton } from "~/components/layout/header/button"; -import { useRequiredBoard } from "./(content)/_context"; export const BoardOtherHeaderActions = () => { const board = useRequiredBoard(); diff --git a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx index 22a4e53c0..446709f34 100644 --- a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx +++ b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx @@ -3,6 +3,8 @@ import { notFound } from "next/navigation"; import { AppShellMain } from "@mantine/core"; import { TRPCError } from "@trpc/server"; +import { BoardProvider } from "@homarr/boards/context"; +import { EditModeProvider } from "@homarr/boards/edit-mode"; import { logger } from "@homarr/log"; import { MainHeader } from "~/components/layout/header"; @@ -10,9 +12,9 @@ import { BoardLogoWithTitle } from "~/components/layout/logo/board-logo"; import { ClientShell } from "~/components/layout/shell"; import { getCurrentColorSchemeAsync } from "~/theme/color-scheme"; import type { Board } from "./_types"; -import { BoardProvider } from "./(content)/_context"; import type { Params } from "./(content)/_creator"; import { CustomCss } from "./(content)/_custom-css"; +import { BoardReadyProvider } from "./(content)/_ready-context"; import { BoardMantineProvider } from "./(content)/_theme"; interface CreateBoardLayoutProps { @@ -42,17 +44,21 @@ export const createBoardLayout = ({ return ( - - - - } - actions={headerActions} - hasNavigation={false} - /> - {children} - - + + + + + + } + actions={headerActions} + hasNavigation={false} + /> + {children} + + + + ); }; diff --git a/apps/nextjs/src/app/[locale]/layout.tsx b/apps/nextjs/src/app/[locale]/layout.tsx index 1a04d8c7e..b988647bc 100644 --- a/apps/nextjs/src/app/[locale]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/layout.tsx @@ -94,6 +94,8 @@ export default async function Layout(props: { board: { homeBoardId: serverSettings.board.homeBoardId, mobileHomeBoardId: serverSettings.board.mobileHomeBoardId, + enableStatusByDefault: serverSettings.board.enableStatusByDefault, + forceDisableStatus: serverSettings.board.forceDisableStatus, }, search: { defaultSearchEngineId: serverSettings.search.defaultSearchEngineId }, }} diff --git a/apps/nextjs/src/app/[locale]/manage/settings/_components/board-settings-form.tsx b/apps/nextjs/src/app/[locale]/manage/settings/_components/board-settings-form.tsx index 69f2329b0..3a06cf8a3 100644 --- a/apps/nextjs/src/app/[locale]/manage/settings/_components/board-settings-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/settings/_components/board-settings-form.tsx @@ -1,6 +1,6 @@ "use client"; -import { Group, Text } from "@mantine/core"; +import { Group, Switch, Text } from "@mantine/core"; import { IconLayoutDashboard } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; @@ -56,6 +56,18 @@ export const BoardSettingsForm = ({ defaultValues }: { defaultValues: ServerSett )} {...form.getInputProps("mobileHomeBoardId")} /> + + {tBoard("status.title")} + + )} diff --git a/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx b/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx index d351c9238..d31f42e9e 100644 --- a/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx +++ b/apps/nextjs/src/app/[locale]/widgets/[kind]/_content.tsx @@ -9,6 +9,7 @@ import { ErrorBoundary } from "react-error-boundary"; import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; import { useModalAction } from "@homarr/modals"; import { showSuccessNotification } from "@homarr/notifications"; +import { useSettings } from "@homarr/settings"; import { useScopedI18n } from "@homarr/translation/client"; import type { BoardItemAdvancedOptions } from "@homarr/validation"; import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets"; @@ -29,6 +30,7 @@ interface WidgetPreviewPageContentProps { } export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPreviewPageContentProps) => { + const settings = useSettings(); const t = useScopedI18n("widgetPreview"); const { openModal: openWidgetEditModal } = useModalAction(WidgetEditModal); const { openModal: openPreviewDimensionsModal } = useModalAction(PreviewDimensionsModal); @@ -43,7 +45,7 @@ export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPrevie integrationIds: string[]; advancedOptions: BoardItemAdvancedOptions; }>({ - options: reduceWidgetOptionsWithDefaultValues(kind, {}), + options: reduceWidgetOptionsWithDefaultValues(kind, settings, {}), integrationIds: [], advancedOptions: { customCssClasses: [], @@ -63,8 +65,9 @@ export const WidgetPreviewPageContent = ({ kind, integrationData }: WidgetPrevie (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), ), integrationSupport: "supportedIntegrations" in currentDefinition, + settings, }); - }, [currentDefinition, integrationData, kind, openWidgetEditModal, state]); + }, [currentDefinition, integrationData, kind, openWidgetEditModal, settings, state]); const Comp = loadWidgetDynamic(kind); diff --git a/apps/nextjs/src/components/board/items/item-actions.tsx b/apps/nextjs/src/components/board/items/item-actions.tsx index c8a93a590..bdda5793f 100644 --- a/apps/nextjs/src/components/board/items/item-actions.tsx +++ b/apps/nextjs/src/components/board/items/item-actions.tsx @@ -1,9 +1,9 @@ import { useCallback } from "react"; +import { useUpdateBoard } from "@homarr/boards/updater"; import type { BoardItemAdvancedOptions } from "@homarr/validation"; import type { Item } from "~/app/[locale]/boards/_types"; -import { useUpdateBoard } from "~/app/[locale]/boards/(content)/_client"; import type { CreateItemInput } from "./actions/create-item"; import { createItemCallback } from "./actions/create-item"; import type { DuplicateItemInput } from "./actions/duplicate-item"; diff --git a/apps/nextjs/src/components/board/items/item-content.tsx b/apps/nextjs/src/components/board/items/item-content.tsx index 6db4bb9d4..bcee538b0 100644 --- a/apps/nextjs/src/components/board/items/item-content.tsx +++ b/apps/nextjs/src/components/board/items/item-content.tsx @@ -5,11 +5,13 @@ import combineClasses from "clsx"; import { NoIntegrationSelectedError } from "node_modules/@homarr/widgets/src/errors"; import { ErrorBoundary } from "react-error-boundary"; +import { useRequiredBoard } from "@homarr/boards/context"; +import { useEditMode } from "@homarr/boards/edit-mode"; +import { useSettings } from "@homarr/settings"; import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues, widgetImports } from "@homarr/widgets"; import { WidgetError } from "@homarr/widgets/errors"; import type { Item } from "~/app/[locale]/boards/_types"; -import { useEditMode, useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; import classes from "../sections/item.module.css"; import { useItemActions } from "./item-actions"; import { BoardItemMenu } from "./item-menu"; @@ -53,11 +55,12 @@ interface InnerContentProps { } const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { + const settings = useSettings(); const board = useRequiredBoard(); const [isEditMode] = useEditMode(); const Comp = loadWidgetDynamic(item.kind); const { definition } = widgetImports[item.kind]; - const options = reduceWidgetOptionsWithDefaultValues(item.kind, item.options); + const options = reduceWidgetOptionsWithDefaultValues(item.kind, settings, item.options); const newItem = { ...item, options }; const { updateItemOptions } = useItemActions(); const updateOptions = ({ newOptions }: { newOptions: Record }) => diff --git a/apps/nextjs/src/components/board/items/item-menu.tsx b/apps/nextjs/src/components/board/items/item-menu.tsx index d16ec2c7a..3d01f8aaf 100644 --- a/apps/nextjs/src/components/board/items/item-menu.tsx +++ b/apps/nextjs/src/components/board/items/item-menu.tsx @@ -3,13 +3,14 @@ import { ActionIcon, Menu } from "@mantine/core"; import { IconCopy, IconDotsVertical, IconLayoutKanban, IconPencil, IconTrash } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; +import { useEditMode } from "@homarr/boards/edit-mode"; import { useConfirmModal, useModalAction } from "@homarr/modals"; +import { useSettings } from "@homarr/settings"; import { useI18n, useScopedI18n } from "@homarr/translation/client"; import { widgetImports } from "@homarr/widgets"; import { WidgetEditModal } from "@homarr/widgets/modals"; import type { Item } from "~/app/[locale]/boards/_types"; -import { useEditMode } from "~/app/[locale]/boards/(content)/_context"; import { useSectionContext } from "../sections/section-context"; import { useItemActions } from "./item-actions"; import { ItemMoveModal } from "./item-move-modal"; @@ -35,6 +36,7 @@ export const BoardItemMenu = ({ const { data: integrationData, isPending } = clientApi.integration.all.useQuery(); const currentDefinition = useMemo(() => widgetImports[item.kind].definition, [item.kind]); const { gridstack } = useSectionContext().refs; + const settings = useSettings(); // Reset error boundary on next render if item has been edited useEffect(() => { @@ -75,6 +77,7 @@ export const BoardItemMenu = ({ (currentDefinition.supportedIntegrations as string[]).some((kind) => kind === integration.kind), ), integrationSupport: "supportedIntegrations" in currentDefinition, + settings, }); }; diff --git a/apps/nextjs/src/components/board/sections/category-section.tsx b/apps/nextjs/src/components/board/sections/category-section.tsx index 294fd856a..c5180b032 100644 --- a/apps/nextjs/src/components/board/sections/category-section.tsx +++ b/apps/nextjs/src/components/board/sections/category-section.tsx @@ -3,9 +3,9 @@ import { useDisclosure } from "@mantine/hooks"; import { IconChevronDown, IconChevronUp } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; import type { CategorySection } from "~/app/[locale]/boards/_types"; -import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; import { CategoryMenu } from "./category/category-menu"; import { GridStack } from "./gridstack/gridstack"; import classes from "./item.module.css"; diff --git a/apps/nextjs/src/components/board/sections/category/category-actions.ts b/apps/nextjs/src/components/board/sections/category/category-actions.ts index 70298ceac..3007be754 100644 --- a/apps/nextjs/src/components/board/sections/category/category-actions.ts +++ b/apps/nextjs/src/components/board/sections/category/category-actions.ts @@ -1,9 +1,9 @@ import { useCallback } from "react"; +import { useUpdateBoard } from "@homarr/boards/updater"; import { createId } from "@homarr/db/client"; import type { CategorySection, EmptySection } from "~/app/[locale]/boards/_types"; -import { useUpdateBoard } from "~/app/[locale]/boards/(content)/_client"; import type { MoveCategoryInput } from "./actions/move-category"; import { moveCategoryCallback } from "./actions/move-category"; import type { RemoveCategoryInput } from "./actions/remove-category"; diff --git a/apps/nextjs/src/components/board/sections/category/category-menu-actions.tsx b/apps/nextjs/src/components/board/sections/category/category-menu-actions.tsx index 15de9c00c..6b89fb54c 100644 --- a/apps/nextjs/src/components/board/sections/category/category-menu-actions.tsx +++ b/apps/nextjs/src/components/board/sections/category/category-menu-actions.tsx @@ -3,6 +3,7 @@ import { useCallback } from "react"; import { fetchApi } from "@homarr/api/client"; import { createId } from "@homarr/db/client"; import { useConfirmModal, useModalAction } from "@homarr/modals"; +import { useSettings } from "@homarr/settings"; import { useI18n } from "@homarr/translation/client"; import type { CategorySection } from "~/app/[locale]/boards/_types"; @@ -99,8 +100,9 @@ export const useCategoryMenuActions = (category: CategorySection) => { ); }, [category, openModal, renameCategory, t]); + const settings = useSettings(); const openAllInNewTabs = useCallback(async () => { - const appIds = filterByItemKind(category.items, "app").map((item) => { + const appIds = filterByItemKind(category.items, settings, "app").map((item) => { return item.options.appId; }); @@ -119,7 +121,7 @@ export const useCategoryMenuActions = (category: CategorySection) => { }); break; } - }, [category, t, openConfirmModal]); + }, [category, t, openConfirmModal, settings]); return { addCategoryAbove, diff --git a/apps/nextjs/src/components/board/sections/category/category-menu.tsx b/apps/nextjs/src/components/board/sections/category/category-menu.tsx index 69c72a347..894db8949 100644 --- a/apps/nextjs/src/components/board/sections/category/category-menu.tsx +++ b/apps/nextjs/src/components/board/sections/category/category-menu.tsx @@ -13,12 +13,12 @@ import { IconTrash, } from "@tabler/icons-react"; +import { useEditMode } from "@homarr/boards/edit-mode"; import type { MaybePromise } from "@homarr/common/types"; import { useScopedI18n } from "@homarr/translation/client"; import type { TablerIcon } from "@homarr/ui"; import type { CategorySection } from "~/app/[locale]/boards/_types"; -import { useEditMode } from "~/app/[locale]/boards/(content)/_context"; import { useCategoryMenuActions } from "./category-menu-actions"; interface Props { diff --git a/apps/nextjs/src/components/board/sections/category/filter.ts b/apps/nextjs/src/components/board/sections/category/filter.ts index 87bc2c210..bdc59484c 100644 --- a/apps/nextjs/src/components/board/sections/category/filter.ts +++ b/apps/nextjs/src/components/board/sections/category/filter.ts @@ -1,14 +1,23 @@ import type { WidgetKind } from "@homarr/definitions"; +import type { SettingsContextProps } from "@homarr/settings"; import type { WidgetComponentProps } from "@homarr/widgets"; import { reduceWidgetOptionsWithDefaultValues } from "@homarr/widgets"; import type { Item } from "~/app/[locale]/boards/_types"; -export const filterByItemKind = (items: Item[], kind: TKind) => { +export const filterByItemKind = ( + items: Item[], + settings: SettingsContextProps, + kind: TKind, +) => { return items .filter((item) => item.kind === kind) .map((item) => ({ ...item, - options: reduceWidgetOptionsWithDefaultValues(kind, item.options) as WidgetComponentProps["options"], + options: reduceWidgetOptionsWithDefaultValues( + kind, + settings, + item.options, + ) as WidgetComponentProps["options"], })); }; diff --git a/apps/nextjs/src/components/board/sections/content.tsx b/apps/nextjs/src/components/board/sections/content.tsx index fd8b4b552..c51894342 100644 --- a/apps/nextjs/src/components/board/sections/content.tsx +++ b/apps/nextjs/src/components/board/sections/content.tsx @@ -1,7 +1,8 @@ import { useMemo } from "react"; +import { useRequiredBoard } from "@homarr/boards/context"; + import type { DynamicSection, Item, Section } from "~/app/[locale]/boards/_types"; -import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; import { BoardItemContent } from "../items/item-content"; import { BoardDynamicSection } from "./dynamic-section"; import { GridStackItem } from "./gridstack/gridstack-item"; diff --git a/apps/nextjs/src/components/board/sections/dynamic-section.tsx b/apps/nextjs/src/components/board/sections/dynamic-section.tsx index 6a858bd10..afb138555 100644 --- a/apps/nextjs/src/components/board/sections/dynamic-section.tsx +++ b/apps/nextjs/src/components/board/sections/dynamic-section.tsx @@ -1,7 +1,8 @@ import { Box, Card } from "@mantine/core"; +import { useRequiredBoard } from "@homarr/boards/context"; + import type { DynamicSection } from "~/app/[locale]/boards/_types"; -import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; import { BoardDynamicSectionMenu } from "./dynamic/dynamic-menu"; import { GridStack } from "./gridstack/gridstack"; import classes from "./item.module.css"; 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 dc8228b35..d27bd907e 100644 --- a/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts +++ b/apps/nextjs/src/components/board/sections/dynamic/dynamic-actions.ts @@ -1,9 +1,9 @@ import { useCallback } from "react"; +import { useUpdateBoard } from "@homarr/boards/updater"; import { createId } from "@homarr/db/client"; import type { DynamicSection, EmptySection } from "~/app/[locale]/boards/_types"; -import { useUpdateBoard } from "~/app/[locale]/boards/(content)/_client"; interface RemoveDynamicSection { id: string; diff --git a/apps/nextjs/src/components/board/sections/dynamic/dynamic-menu.tsx b/apps/nextjs/src/components/board/sections/dynamic/dynamic-menu.tsx index 1a07eb81e..e1910d363 100644 --- a/apps/nextjs/src/components/board/sections/dynamic/dynamic-menu.tsx +++ b/apps/nextjs/src/components/board/sections/dynamic/dynamic-menu.tsx @@ -1,11 +1,11 @@ import { ActionIcon, Menu } from "@mantine/core"; import { IconDotsVertical, IconTrash } from "@tabler/icons-react"; +import { useEditMode } from "@homarr/boards/edit-mode"; import { useConfirmModal } from "@homarr/modals"; import { useI18n, useScopedI18n } from "@homarr/translation/client"; import type { DynamicSection } from "~/app/[locale]/boards/_types"; -import { useEditMode } from "~/app/[locale]/boards/(content)/_context"; import { useDynamicSectionActions } from "./dynamic-actions"; export const BoardDynamicSectionMenu = ({ section }: { section: DynamicSection }) => { diff --git a/apps/nextjs/src/components/board/sections/empty-section.tsx b/apps/nextjs/src/components/board/sections/empty-section.tsx index 3245b4e41..de474760f 100644 --- a/apps/nextjs/src/components/board/sections/empty-section.tsx +++ b/apps/nextjs/src/components/board/sections/empty-section.tsx @@ -1,7 +1,8 @@ import combineClasses from "clsx"; +import { useEditMode } from "@homarr/boards/edit-mode"; + import type { EmptySection } from "~/app/[locale]/boards/_types"; -import { useEditMode } from "~/app/[locale]/boards/(content)/_context"; import { GridStack } from "./gridstack/gridstack"; import { useSectionItems } from "./use-section-items"; diff --git a/apps/nextjs/src/components/board/sections/gridstack/use-gridstack.ts b/apps/nextjs/src/components/board/sections/gridstack/use-gridstack.ts index afe3f0eb6..251bb1d42 100644 --- a/apps/nextjs/src/components/board/sections/gridstack/use-gridstack.ts +++ b/apps/nextjs/src/components/board/sections/gridstack/use-gridstack.ts @@ -2,10 +2,12 @@ import type { RefObject } from "react"; import { createRef, useCallback, useEffect, useRef } from "react"; import { useElementSize } from "@mantine/hooks"; +import { useRequiredBoard } from "@homarr/boards/context"; +import { useEditMode } from "@homarr/boards/edit-mode"; import type { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode } from "@homarr/gridstack"; import type { Section } from "~/app/[locale]/boards/_types"; -import { useEditMode, useMarkSectionAsReady, useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; +import { useMarkSectionAsReady } from "~/app/[locale]/boards/(content)/_ready-context"; import { useItemActions } from "../../items/item-actions"; import { useSectionActions } from "../section-actions"; import { initializeGridstack } from "./init-gridstack"; diff --git a/apps/nextjs/src/components/board/sections/section-actions.tsx b/apps/nextjs/src/components/board/sections/section-actions.tsx index b79ef88c5..6403d2175 100644 --- a/apps/nextjs/src/components/board/sections/section-actions.tsx +++ b/apps/nextjs/src/components/board/sections/section-actions.tsx @@ -1,6 +1,6 @@ import { useCallback } from "react"; -import { useUpdateBoard } from "~/app/[locale]/boards/(content)/_client"; +import { useUpdateBoard } from "@homarr/boards/updater"; interface MoveAndResizeInnerSection { innerSectionId: string; diff --git a/apps/nextjs/src/components/board/sections/use-section-items.ts b/apps/nextjs/src/components/board/sections/use-section-items.ts index 9989e0f85..7e31f8643 100644 --- a/apps/nextjs/src/components/board/sections/use-section-items.ts +++ b/apps/nextjs/src/components/board/sections/use-section-items.ts @@ -1,5 +1,6 @@ +import { useRequiredBoard } from "@homarr/boards/context"; + import type { Section } from "~/app/[locale]/boards/_types"; -import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; export const useSectionItems = (section: Section) => { const board = useRequiredBoard(); diff --git a/apps/nextjs/src/components/layout/background.tsx b/apps/nextjs/src/components/layout/background.tsx index 08365e924..c7011408a 100644 --- a/apps/nextjs/src/components/layout/background.tsx +++ b/apps/nextjs/src/components/layout/background.tsx @@ -1,7 +1,7 @@ import { usePathname } from "next/navigation"; import type { AppShellProps } from "@mantine/core"; -import { useOptionalBoard } from "~/app/[locale]/boards/(content)/_context"; +import { useOptionalBoard } from "@homarr/boards/context"; const supportedVideoFormats = ["mp4", "webm", "ogg"]; const isVideo = (url: string) => supportedVideoFormats.some((format) => url.toLowerCase().endsWith(`.${format}`)); diff --git a/apps/nextjs/src/components/layout/logo/board-logo.tsx b/apps/nextjs/src/components/layout/logo/board-logo.tsx index 096709431..ad2f1ca2e 100644 --- a/apps/nextjs/src/components/layout/logo/board-logo.tsx +++ b/apps/nextjs/src/components/layout/logo/board-logo.tsx @@ -1,6 +1,7 @@ "use client"; -import { useRequiredBoard } from "~/app/[locale]/boards/(content)/_context"; +import { useRequiredBoard } from "@homarr/boards/context"; + import { homarrLogoPath, homarrPageTitle } from "./homarr-logo"; import type { LogoWithTitleProps } from "./logo"; import { Logo, LogoWithTitle } from "./logo"; diff --git a/apps/tasks/package.json b/apps/tasks/package.json index b32a6aaac..1949a0a69 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -44,9 +44,9 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "@types/node": "^22.13.1", + "@types/node": "^22.13.4", "dotenv-cli": "^8.0.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "prettier": "^3.4.2", "tsx": "4.19.2", "typescript": "^5.7.3" diff --git a/apps/websocket/package.json b/apps/websocket/package.json index b25a28aa2..63fa53635 100644 --- a/apps/websocket/package.json +++ b/apps/websocket/package.json @@ -34,7 +34,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/ws": "^8.5.14", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "prettier": "^3.4.2", "typescript": "^5.7.3" } diff --git a/package.json b/package.json index 297a79278..fa31f9b31 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@semantic-release/github": "^11.0.1", "@semantic-release/npm": "^12.0.1", "@semantic-release/release-notes-generator": "^14.0.3", - "@turbo/gen": "^2.4.0", + "@turbo/gen": "^2.4.2", "@vitejs/plugin-react": "^4.3.4", "@vitest/coverage-v8": "^3.0.5", "@vitest/ui": "^3.0.5", @@ -46,24 +46,40 @@ "cross-env": "^7.0.3", "jsdom": "^26.0.0", "prettier": "^3.4.2", - "semantic-release": "^24.2.1", + "semantic-release": "^24.2.2", "testcontainers": "^10.18.0", - "turbo": "^2.4.0", + "turbo": "^2.4.2", "typescript": "^5.7.3", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.0.5" }, - "packageManager": "pnpm@9.15.5", + "packageManager": "pnpm@10.4.0", "engines": { - "node": ">=22.13.1" + "node": ">=22.14.0" }, "pnpm": { + "onlyBuiltDependencies": [ + "@tree-sitter-grammars/tree-sitter-yaml", + "bcrypt", + "better-sqlite3", + "cpu-features", + "esbuild", + "sharp", + "ssh2", + "tree-sitter", + "tree-sitter-json" + ], "allowNonAppliedPatches": true, "overrides": { "proxmox-api>undici": "7.3.0" }, "patchedDependencies": { "pretty-print-error": "patches/pretty-print-error.patch" - } + }, + "ignoredBuiltDependencies": [ + "@scarf/scarf", + "core-js-pure", + "protobufjs" + ] } } diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 101215bb0..e7552a2c5 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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/api/package.json b/packages/api/package.json index 758a3e9fd..869f669f9 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -44,19 +44,19 @@ "@trpc/react-query": "next", "@trpc/server": "next", "lodash.clonedeep": "^4.5.0", - "next": "15.1.6", + "next": "15.1.7", "pretty-print-error": "^1.1.2", "react": "19.0.0", "react-dom": "19.0.0", "superjson": "2.2.2", "trpc-to-openapi": "^2.1.3", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "prettier": "^3.4.2", "typescript": "^5.7.3" } diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index 2522809c2..b4f9b598a 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -484,6 +484,9 @@ export const boardRouter = createTRPCRouter({ // layout settings columnCount: input.columnCount, + + // Behavior settings + disableStatus: input.disableStatus, }) .where(eq(boards.id, input.id)); }), diff --git a/packages/api/src/router/test/integration/integration-router.spec.ts b/packages/api/src/router/test/integration/integration-router.spec.ts index 2aaf75a2f..e786eb535 100644 --- a/packages/api/src/router/test/integration/integration-router.spec.ts +++ b/packages/api/src/router/test/integration/integration-router.spec.ts @@ -247,7 +247,7 @@ describe("create should create a new integration", () => { expect(dbSearchEngine!.short).toBe("j"); expect(dbSearchEngine!.name).toBe(input.name); expect(dbSearchEngine!.iconUrl).toBe( - "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyseerr.png", + "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/jellyseerr.svg", ); }); diff --git a/packages/api/src/router/test/user.spec.ts b/packages/api/src/router/test/user.spec.ts index fc5f5af13..b3af6f7a5 100644 --- a/packages/api/src/router/test/user.spec.ts +++ b/packages/api/src/router/test/user.spec.ts @@ -237,7 +237,7 @@ describe("editProfile shoud update user", () => { expect(user).toHaveLength(1); expect(user[0]).containSubset({ id: defaultOwnerId, - name: "ABC", + name: "abc", email: "abc@gmail.com", emailVerified, }); @@ -272,7 +272,7 @@ describe("editProfile shoud update user", () => { expect(user).toHaveLength(1); expect(user[0]).containSubset({ id: defaultOwnerId, - name: "ABC", + name: "abc", email: "myNewEmail@gmail.com", emailVerified: null, }); diff --git a/packages/api/src/router/update-checker.ts b/packages/api/src/router/update-checker.ts index 4b36c3f93..d02744f92 100644 --- a/packages/api/src/router/update-checker.ts +++ b/packages/api/src/router/update-checker.ts @@ -1,11 +1,19 @@ +import { formatError } from "pretty-print-error"; + +import { logger } from "@homarr/log"; import { updateCheckerRequestHandler } from "@homarr/request-handler/update-checker"; import { createTRPCRouter, permissionRequiredProcedure } from "../trpc"; export const updateCheckerRouter = createTRPCRouter({ getAvailableUpdates: permissionRequiredProcedure.requiresPermission("admin").query(async () => { - const handler = updateCheckerRequestHandler.handler({}); - const data = await handler.getCachedOrUpdatedDataAsync({}); - return data.data.availableUpdates; + try { + const handler = updateCheckerRequestHandler.handler({}); + const data = await handler.getCachedOrUpdatedDataAsync({}); + return data.data.availableUpdates; + } catch (error) { + logger.error(`Failed to get available updates\n${formatError(error)}`); + return undefined; // We return undefined to not show the indicator in the UI + } }), }); diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index 5ffc41dee..1ce4e1690 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -523,12 +523,10 @@ const createUserAsync = async (db: Database, input: Omit { const user = await db.query.users.findFirst({ - where: and(eq(users.name, username.toLowerCase()), eq(users.provider, provider)), + where: and(eq(users.name, username), eq(users.provider, provider)), }); if (!user) return; diff --git a/packages/api/src/router/widgets/index.ts b/packages/api/src/router/widgets/index.ts index ce39bf9f7..c2a8efc60 100644 --- a/packages/api/src/router/widgets/index.ts +++ b/packages/api/src/router/widgets/index.ts @@ -10,6 +10,7 @@ import { mediaServerRouter } from "./media-server"; import { mediaTranscodingRouter } from "./media-transcoding"; import { minecraftRouter } from "./minecraft"; import { notebookRouter } from "./notebook"; +import { optionsRouter } from "./options"; import { rssFeedRouter } from "./rssFeed"; import { smartHomeRouter } from "./smart-home"; import { weatherRouter } from "./weather"; @@ -29,4 +30,5 @@ export const widgetRouter = createTRPCRouter({ healthMonitoring: healthMonitoringRouter, mediaTranscoding: mediaTranscodingRouter, minecraft: minecraftRouter, + options: optionsRouter, }); diff --git a/packages/api/src/router/widgets/options.ts b/packages/api/src/router/widgets/options.ts new file mode 100644 index 000000000..aa7c5e5c6 --- /dev/null +++ b/packages/api/src/router/widgets/options.ts @@ -0,0 +1,19 @@ +import { getServerSettingsAsync } from "@homarr/db/queries"; + +import type { WidgetOptionsSettings } from "../../../../widgets/src"; +import { createTRPCRouter, publicProcedure } from "../../trpc"; + +export const optionsRouter = createTRPCRouter({ + getWidgetOptionSettings: publicProcedure.query(async ({ ctx }): Promise => { + const serverSettings = await getServerSettingsAsync(ctx.db); + + return { + server: { + board: { + enableStatusByDefault: serverSettings.board.enableStatusByDefault, + forceDisableStatus: serverSettings.board.forceDisableStatus, + }, + }, + }; + }), +}); diff --git a/packages/auth/package.json b/packages/auth/package.json index c47755150..7a7573b5d 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -34,12 +34,12 @@ "bcrypt": "^5.1.1", "cookies": "^0.9.1", "ldapts": "7.3.1", - "next": "15.1.6", + "next": "15.1.7", "next-auth": "5.0.0-beta.25", "pretty-print-error": "^1.1.2", "react": "19.0.0", "react-dom": "19.0.0", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", @@ -47,7 +47,7 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/bcrypt": "5.0.2", "@types/cookies": "0.9.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "prettier": "^3.4.2", "typescript": "^5.7.3" } diff --git a/packages/boards/eslint.config.js b/packages/boards/eslint.config.js new file mode 100644 index 000000000..5b19b6f8a --- /dev/null +++ b/packages/boards/eslint.config.js @@ -0,0 +1,9 @@ +import baseConfig from "@homarr/eslint-config/base"; + +/** @type {import('typescript-eslint').Config} */ +export default [ + { + ignores: [], + }, + ...baseConfig, +]; diff --git a/packages/boards/package.json b/packages/boards/package.json new file mode 100644 index 000000000..a59d8d4ce --- /dev/null +++ b/packages/boards/package.json @@ -0,0 +1,38 @@ +{ + "name": "@homarr/boards", + "version": "0.1.0", + "private": true, + "license": "MIT", + "type": "module", + "exports": { + "./context": "./src/context.tsx", + "./updater": "./src/updater.ts", + "./edit-mode": "./src/edit-mode.tsx" + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + }, + "scripts": { + "clean": "rm -rf .turbo node_modules", + "format": "prettier --check . --ignore-path ../../.gitignore", + "lint": "eslint", + "typecheck": "tsc --noEmit" + }, + "prettier": "@homarr/prettier-config", + "dependencies": { + "@homarr/api": "workspace:^0.1.0", + "react": "19.0.0", + "react-dom": "19.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.20.1", + "typescript": "^5.7.3" + } +} diff --git a/packages/boards/src/context.tsx b/packages/boards/src/context.tsx new file mode 100644 index 000000000..ab2af5c74 --- /dev/null +++ b/packages/boards/src/context.tsx @@ -0,0 +1,70 @@ +"use client"; + +import type { PropsWithChildren } from "react"; +import { createContext, useContext, useEffect } from "react"; +import { usePathname } from "next/navigation"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; + +import { updateBoardName } from "./updater"; + +const BoardContext = createContext<{ + board: RouterOutputs["board"]["getHomeBoard"]; +} | null>(null); + +export const BoardProvider = ({ + children, + initialBoard, +}: PropsWithChildren<{ + initialBoard: RouterOutputs["board"]["getBoardByName"]; +}>) => { + const { data } = clientApi.board.getBoardByName.useQuery( + { name: initialBoard.name }, + { + initialData: initialBoard, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }, + ); + + // Update the board name so it can be used within updateBoard method + updateBoardName(initialBoard.name); + + const pathname = usePathname(); + const utils = clientApi.useUtils(); + + // Invalidate the board when the pathname changes + // This allows to refetch the board when it might have changed - e.g. if someone else added an item + useEffect(() => { + return () => { + void utils.board.getBoardByName.invalidate({ name: initialBoard.name }); + }; + }, [pathname, utils, initialBoard.name]); + + return ( + + {children} + + ); +}; + +export const useRequiredBoard = () => { + const optionalBoard = useOptionalBoard(); + + if (!optionalBoard) { + throw new Error("Board is required"); + } + + return optionalBoard; +}; + +export const useOptionalBoard = () => { + const context = useContext(BoardContext); + + return context?.board ?? null; +}; diff --git a/packages/boards/src/edit-mode.tsx b/packages/boards/src/edit-mode.tsx new file mode 100644 index 000000000..9b813b032 --- /dev/null +++ b/packages/boards/src/edit-mode.tsx @@ -0,0 +1,23 @@ +"use client"; + +import type { PropsWithChildren } from "react"; +import { createContext, useContext } from "react"; +import { useDisclosure } from "@mantine/hooks"; + +const EditModeContext = createContext | null>(null); + +export const EditModeProvider = ({ children }: PropsWithChildren) => { + const editModeDisclosure = useDisclosure(false); + + return {children}; +}; + +export const useEditMode = () => { + const context = useContext(EditModeContext); + + if (!context) { + throw new Error("EditMode is required"); + } + + return context; +}; diff --git a/packages/boards/src/updater.ts b/packages/boards/src/updater.ts new file mode 100644 index 000000000..49a301a8c --- /dev/null +++ b/packages/boards/src/updater.ts @@ -0,0 +1,34 @@ +"use client"; + +import { useCallback } from "react"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; + +let boardName: string | null = null; + +export const updateBoardName = (name: string | null) => { + boardName = name; +}; + +type UpdateCallback = (prev: RouterOutputs["board"]["getHomeBoard"]) => RouterOutputs["board"]["getHomeBoard"]; + +export const useUpdateBoard = () => { + const utils = clientApi.useUtils(); + + const updateBoard = useCallback( + (updaterWithoutUndefined: UpdateCallback) => { + if (!boardName) { + throw new Error("Board name is not set"); + } + utils.board.getBoardByName.setData({ name: boardName }, (previous) => + previous ? updaterWithoutUndefined(previous) : previous, + ); + }, + [utils], + ); + + return { + updateBoard, + }; +}; diff --git a/packages/boards/tsconfig.json b/packages/boards/tsconfig.json new file mode 100644 index 000000000..cbe8483d9 --- /dev/null +++ b/packages/boards/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@homarr/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/packages/certificates/package.json b/packages/certificates/package.json index 255f8c8dd..efa999db1 100644 --- a/packages/certificates/package.json +++ b/packages/certificates/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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index d9efbfd63..66e688f3e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -33,7 +33,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/common/package.json b/packages/common/package.json index a49eb0c6f..ff831fc24 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -29,17 +29,17 @@ "dependencies": { "@homarr/log": "workspace:^0.1.0", "dayjs": "^1.11.13", - "next": "15.1.6", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0", "undici": "7.3.0", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cron-job-runner/package.json b/packages/cron-job-runner/package.json index faa4b8fa0..f2c0fee0d 100644 --- a/packages/cron-job-runner/package.json +++ b/packages/cron-job-runner/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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cron-job-status/package.json b/packages/cron-job-status/package.json index e6e3da1f4..a7ec897aa 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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs-core/package.json b/packages/cron-jobs-core/package.json index a2e3b6c11..12f381b2f 100644 --- a/packages/cron-jobs-core/package.json +++ b/packages/cron-jobs-core/package.json @@ -32,7 +32,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/node-cron": "^3.0.11", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs/package.json b/packages/cron-jobs/package.json index b8f2d98ad..f0334a93a 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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/cron-jobs/src/jobs/ping.ts b/packages/cron-jobs/src/jobs/ping.ts index 0ad99ca91..318db80bd 100644 --- a/packages/cron-jobs/src/jobs/ping.ts +++ b/packages/cron-jobs/src/jobs/ping.ts @@ -1,4 +1,6 @@ import { EVERY_MINUTE } from "@homarr/cron-jobs-core/expressions"; +import { db } from "@homarr/db"; +import { getServerSettingByKeyAsync } from "@homarr/db/queries"; import { logger } from "@homarr/log"; import { sendPingRequestAsync } from "@homarr/ping"; import { pingChannel, pingUrlChannel } from "@homarr/redis"; @@ -13,6 +15,13 @@ const resetPreviousUrlsAsync = async () => { export const pingJob = createCronJob("ping", EVERY_MINUTE, { beforeStart: resetPreviousUrlsAsync, }).withCallback(async () => { + const boardSettings = await getServerSettingByKeyAsync(db, "board"); + + if (boardSettings.forceDisableStatus) { + logger.debug("Simple ping is disabled by server settings"); + return; + } + const urls = await pingUrlChannel.getAllAsync(); await Promise.allSettled([...new Set(urls)].map(pingAsync)); diff --git a/packages/db/driver.ts b/packages/db/driver.ts index 2dce7f4a0..c5159fd9d 100644 --- a/packages/db/driver.ts +++ b/packages/db/driver.ts @@ -1,9 +1,11 @@ +import type { Database as BetterSqlite3Connection } from "better-sqlite3"; import Database from "better-sqlite3"; import type { Logger } from "drizzle-orm"; import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3"; import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import type { MySql2Database } from "drizzle-orm/mysql2"; import { drizzle as drizzleMysql } from "drizzle-orm/mysql2"; +import type { Pool as MysqlConnectionPool } from "mysql2"; import mysql from "mysql2"; import { logger } from "@homarr/log"; @@ -29,7 +31,7 @@ const init = () => { } }; -export let connection: Database.Database | mysql.Connection; +export let connection: BetterSqlite3Connection | MysqlConnectionPool; export let database: HomarrDatabase; class WinstonDrizzleLogger implements Logger { @@ -49,14 +51,17 @@ const initBetterSqlite = () => { const initMySQL2 = () => { if (!env.DB_HOST) { - connection = mysql.createConnection({ uri: env.DB_URL }); + connection = mysql.createPool({ uri: env.DB_URL, maxIdle: 0, idleTimeout: 60000, enableKeepAlive: true }); } else { - connection = mysql.createConnection({ + connection = mysql.createPool({ host: env.DB_HOST, database: env.DB_NAME, port: env.DB_PORT, user: env.DB_USER, password: env.DB_PASSWORD, + maxIdle: 0, + idleTimeout: 60000, + enableKeepAlive: true, }); } diff --git a/packages/db/migrations/mysql/0024_mean_vin_gonzales.sql b/packages/db/migrations/mysql/0024_mean_vin_gonzales.sql new file mode 100644 index 000000000..1dbb67b0c --- /dev/null +++ b/packages/db/migrations/mysql/0024_mean_vin_gonzales.sql @@ -0,0 +1 @@ +ALTER TABLE `board` ADD `disable_status` boolean DEFAULT false NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/mysql/meta/0024_snapshot.json b/packages/db/migrations/mysql/meta/0024_snapshot.json new file mode 100644 index 000000000..d74c8cee0 --- /dev/null +++ b/packages/db/migrations/mysql/meta/0024_snapshot.json @@ -0,0 +1,1772 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "f670b3a4-69ef-4ef8-9f1b-26a92dda2858", + "prevId": "bb3e417c-c928-4840-be08-94b5562cddd5", + "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 + } + }, + "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 + }, + "column_count": { + "name": "column_count", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "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": {} + }, + "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 + } + }, + "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" + } + }, + "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": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_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": 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 + }, + "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_section_id_section_id_fk": { + "name": "item_section_id_section_id_fk", + "tableFrom": "item", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "item_id": { + "name": "item_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": "BLOB", + "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": { + "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": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "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" + }, + "section_parent_section_id_section_id_fk": { + "name": "section_parent_section_id_section_id_fk", + "tableFrom": "section", + "tableTo": "section", + "columnsFrom": ["parent_section_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": {} + }, + "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 4dc8e48b9..036387804 100644 --- a/packages/db/migrations/mysql/meta/_journal.json +++ b/packages/db/migrations/mysql/meta/_journal.json @@ -169,6 +169,13 @@ "when": 1738687012272, "tag": "0023_fix_on_delete_actions", "breakpoints": true + }, + { + "idx": 24, + "version": "5", + "when": 1738961147412, + "tag": "0024_mean_vin_gonzales", + "breakpoints": true } ] } diff --git a/packages/db/migrations/sqlite/0024_bitter_scrambler.sql b/packages/db/migrations/sqlite/0024_bitter_scrambler.sql new file mode 100644 index 000000000..0ee55e417 --- /dev/null +++ b/packages/db/migrations/sqlite/0024_bitter_scrambler.sql @@ -0,0 +1 @@ +ALTER TABLE `board` ADD `disable_status` integer DEFAULT false NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/sqlite/meta/0024_snapshot.json b/packages/db/migrations/sqlite/meta/0024_snapshot.json new file mode 100644 index 000000000..6cbd102a7 --- /dev/null +++ b/packages/db/migrations/sqlite/meta/0024_snapshot.json @@ -0,0 +1,1697 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "7111fcfa-dd13-42d5-b3f1-6dd094628858", + "prevId": "f1f5327f-6803-4b9e-a006-cff157d77fc8", + "tables": { + "account": { + "name": "account", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "text", + "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": "integer", + "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": { + "columns": ["provider", "provider_account_id"], + "name": "account_provider_provider_account_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "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": "text", + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "app": { + "name": "app", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "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 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "boardGroupPermission": { + "name": "boardGroupPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "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": { + "columns": ["board_id", "group_id", "permission"], + "name": "boardGroupPermission_board_id_group_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "boardUserPermission": { + "name": "boardUserPermission", + "columns": { + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "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": { + "columns": ["board_id", "user_id", "permission"], + "name": "boardUserPermission_board_id_user_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "board": { + "name": "board", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "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": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 100 + }, + "custom_css": { + "name": "custom_css", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "column_count": { + "name": "column_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 10 + }, + "disable_status": { + "name": "disable_status", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "board_name_unique": { + "name": "board_name_unique", + "columns": ["name"], + "isUnique": true + } + }, + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "groupMember": { + "name": "groupMember", + "columns": { + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "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": { + "columns": ["group_id", "user_id"], + "name": "groupMember_group_id_user_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "group_id": { + "name": "group_id", + "type": "text", + "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": {}, + "checkConstraints": {} + }, + "group": { + "name": "group", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "group_name_unique": { + "name": "group_name_unique", + "columns": ["name"], + "isUnique": true + } + }, + "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" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "icon": { + "name": "icon", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "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 + }, + "checksum": { + "name": "checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_repository_id": { + "name": "icon_repository_id", + "type": "text", + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationGroupPermissions": { + "name": "integrationGroupPermissions", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "group_id": { + "name": "group_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "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": { + "integrationGroupPermissions_integration_id_group_id_permission_pk": { + "columns": ["integration_id", "group_id", "permission"], + "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integration_item": { + "name": "integration_item", + "columns": { + "item_id": { + "name": "item_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "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": { + "columns": ["item_id", "integration_id"], + "name": "integration_item_item_id_integration_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationSecret": { + "name": "integrationSecret", + "columns": { + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "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": { + "columns": ["integration_id", "kind"], + "name": "integrationSecret_integration_id_kind_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integrationUserPermission": { + "name": "integrationUserPermission", + "columns": { + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "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": { + "columns": ["integration_id", "user_id", "permission"], + "name": "integrationUserPermission_integration_id_user_id_permission_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "integration": { + "name": "integration", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "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": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "integration__kind_idx": { + "name": "integration__kind_idx", + "columns": ["kind"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "invite": { + "name": "invite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expiration_date": { + "name": "expiration_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "invite_token_unique": { + "name": "invite_token_unique", + "columns": ["token"], + "isUnique": true + } + }, + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "item": { + "name": "item", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "integer", + "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_section_id_section_id_fk": { + "name": "item_section_id_section_id_fk", + "tableFrom": "item", + "tableTo": "section", + "columnsFrom": ["section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "media": { + "name": "media", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "blob", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "size": { + "name": "size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(unixepoch())" + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "onboarding": { + "name": "onboarding", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "step": { + "name": "step", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "previous_step": { + "name": "previous_step", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "search_engine": { + "name": "search_engine", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "short": { + "name": "short", + "type": "text", + "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": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'generic'" + }, + "integration_id": { + "name": "integration_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "search_engine_short_unique": { + "name": "search_engine_short_unique", + "columns": ["short"], + "isUnique": true + } + }, + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "section_collapse_state": { + "name": "section_collapse_state", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "section_id": { + "name": "section_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "collapsed": { + "name": "collapsed", + "type": "integer", + "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": { + "columns": ["user_id", "section_id"], + "name": "section_collapse_state_user_id_section_id_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "section": { + "name": "section", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "board_id": { + "name": "board_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "x_offset": { + "name": "x_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "y_offset": { + "name": "y_offset", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "parent_section_id": { + "name": "parent_section_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "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" + }, + "section_parent_section_id_section_id_fk": { + "name": "section_parent_section_id_section_id_fk", + "tableFrom": "section", + "tableTo": "section", + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "setting_key": { + "name": "setting_key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{\"json\": {}}'" + } + }, + "indexes": { + "serverSetting_settingKey_unique": { + "name": "serverSetting_settingKey_unique", + "columns": ["setting_key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "session": { + "name": "session", + "columns": { + "session_token": { + "name": "session_token", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "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": "integer", + "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": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'credentials'" + }, + "home_board_id": { + "name": "home_board_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "mobile_home_board_id": { + "name": "mobile_home_board_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "default_search_engine_id": { + "name": "default_search_engine_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "open_search_in_new_tab": { + "name": "open_search_in_new_tab", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "color_scheme": { + "name": "color_scheme", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'dark'" + }, + "first_day_of_week": { + "name": "first_day_of_week", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "ping_icons_enabled": { + "name": "ping_icons_enabled", + "type": "integer", + "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": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "verificationToken": { + "name": "verificationToken", + "columns": { + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verificationToken_identifier_token_pk": { + "columns": ["identifier", "token"], + "name": "verificationToken_identifier_token_pk" + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/packages/db/migrations/sqlite/meta/_journal.json b/packages/db/migrations/sqlite/meta/_journal.json index 396c5b215..d82b86fb8 100644 --- a/packages/db/migrations/sqlite/meta/_journal.json +++ b/packages/db/migrations/sqlite/meta/_journal.json @@ -169,6 +169,13 @@ "when": 1738686324915, "tag": "0023_fix_on_delete_actions", "breakpoints": true + }, + { + "idx": 24, + "version": "6", + "when": 1738961178990, + "tag": "0024_bitter_scrambler", + "breakpoints": true } ] } diff --git a/packages/db/package.json b/packages/db/package.json index 15fcdf078..0b61dd9b2 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -48,7 +48,7 @@ "better-sqlite3": "^11.8.1", "dotenv": "^16.4.7", "drizzle-kit": "^0.30.4", - "drizzle-orm": "^0.39.2", + "drizzle-orm": "^0.39.3", "drizzle-zod": "^0.7.0", "mysql2": "3.12.0" }, @@ -58,7 +58,7 @@ "@homarr/tsconfig": "workspace:^0.1.0", "@types/better-sqlite3": "7.6.12", "dotenv-cli": "^8.0.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "prettier": "^3.4.2", "tsx": "4.19.2", "typescript": "^5.7.3" diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts index c7406057a..870d7f851 100644 --- a/packages/db/schema/mysql.ts +++ b/packages/db/schema/mysql.ts @@ -272,6 +272,7 @@ export const boards = mysqlTable("board", { opacity: int().default(100).notNull(), customCss: text(), columnCount: int().default(10).notNull(), + disableStatus: boolean().default(false).notNull(), }); export const boardUserPermissions = mysqlTable( diff --git a/packages/db/schema/sqlite.ts b/packages/db/schema/sqlite.ts index 000fa9463..44436c84b 100644 --- a/packages/db/schema/sqlite.ts +++ b/packages/db/schema/sqlite.ts @@ -258,6 +258,7 @@ export const boards = sqliteTable("board", { opacity: int().default(100).notNull(), customCss: text(), columnCount: int().default(10).notNull(), + disableStatus: int({ mode: "boolean" }).default(false).notNull(), }); export const boardUserPermissions = sqliteTable( diff --git a/packages/definitions/package.json b/packages/definitions/package.json index 3544e2e16..1d206cb79 100644 --- a/packages/definitions/package.json +++ b/packages/definitions/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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 17fa806d1..9ed2af4ac 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -22,109 +22,109 @@ export const integrationDefs = { sabNzbd: { name: "SABnzbd", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/sabnzbd.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/sabnzbd.svg", category: ["downloadClient", "usenet"], }, nzbGet: { name: "NZBGet", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/nzbget.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/nzbget.svg", category: ["downloadClient", "usenet"], }, deluge: { name: "Deluge", secretKinds: [["password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/deluge.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/deluge.svg", category: ["downloadClient", "torrent"], }, transmission: { name: "Transmission", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/transmission.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/transmission.svg", category: ["downloadClient", "torrent"], }, qBittorrent: { name: "qBittorrent", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/qbittorrent.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/qbittorrent.svg", category: ["downloadClient", "torrent"], }, sonarr: { name: "Sonarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/sonarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/sonarr.svg", category: ["calendar"], }, radarr: { name: "Radarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/radarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/radarr.svg", category: ["calendar"], }, lidarr: { name: "Lidarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/lidarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/lidarr.svg", category: ["calendar"], }, readarr: { name: "Readarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/readarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/readarr.svg", category: ["calendar"], }, prowlarr: { name: "Prowlarr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/prowlarr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/prowlarr.svg", category: ["indexerManager"], }, jellyfin: { name: "Jellyfin", secretKinds: [["username", "password"], ["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyfin.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/jellyfin.svg", category: ["mediaService"], }, plex: { name: "Plex", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/plex.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/plex.svg", category: ["mediaService"], }, jellyseerr: { name: "Jellyseerr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/jellyseerr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/jellyseerr.svg", category: ["mediaSearch", "mediaRequest", "search"], }, overseerr: { name: "Overseerr", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/overseerr.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/overseerr.svg", category: ["mediaSearch", "mediaRequest", "search"], }, piHole: { name: "Pi-hole", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/pi-hole.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/pi-hole.svg", category: ["dnsHole"], }, adGuardHome: { name: "AdGuard Home", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/adguard-home.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/adguard-home.svg", category: ["dnsHole"], }, homeAssistant: { name: "Home Assistant", secretKinds: [["apiKey"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/home-assistant.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/home-assistant.svg", category: ["smartHomeServer"], }, openmediavault: { name: "OpenMediaVault", secretKinds: [["username", "password"]], - iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/openmediavault.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/openmediavault.svg", category: ["healthMonitoring"], }, dashDot: { @@ -143,7 +143,7 @@ export const integrationDefs = { name: "Proxmox", secretKinds: [["username", "tokenId", "apiKey", "realm"]], category: ["healthMonitoring"], - iconUrl: "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/proxmox.png", + iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/proxmox.svg", }, } as const satisfies Record; diff --git a/packages/docker/package.json b/packages/docker/package.json index a8b8c6d1d..34a7d5b21 100644 --- a/packages/docker/package.json +++ b/packages/docker/package.json @@ -32,7 +32,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/dockerode": "^3.3.34", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/form/package.json b/packages/form/package.json index 4d265f4be..2be2c8c93 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -26,14 +26,14 @@ "@homarr/common": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/form": "^7.16.2", - "zod": "^3.24.1" + "@mantine/form": "^7.16.3", + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/icons/package.json b/packages/icons/package.json index dfdd91a66..b6fb1f70d 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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/integrations/package.json b/packages/integrations/package.json index 13d01a9ae..dd495fdce 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -25,7 +25,7 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@ctrl/deluge": "^7.1.0", - "@ctrl/qbittorrent": "^9.2.0", + "@ctrl/qbittorrent": "^9.4.0", "@ctrl/transmission": "^7.2.0", "@homarr/certificates": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", @@ -39,14 +39,14 @@ "proxmox-api": "1.1.1", "undici": "7.3.0", "xml2js": "^0.6.2", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/xml2js": "^0.4.14", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/log/package.json b/packages/log/package.json index 495fba664..5e2dcabfb 100644 --- a/packages/log/package.json +++ b/packages/log/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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/modals-collection/package.json b/packages/modals-collection/package.json index 08ce553a3..b406c2442 100644 --- a/packages/modals-collection/package.json +++ b/packages/modals-collection/package.json @@ -32,19 +32,19 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", + "@mantine/core": "^7.16.3", "@tabler/icons-react": "^3.30.0", "dayjs": "^1.11.13", - "next": "15.1.6", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/modals/package.json b/packages/modals/package.json index 024e503aa..0d892e1d4 100644 --- a/packages/modals/package.json +++ b/packages/modals/package.json @@ -24,15 +24,15 @@ "dependencies": { "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", - "@mantine/hooks": "^7.16.2", + "@mantine/core": "^7.16.3", + "@mantine/hooks": "^7.16.3", "react": "19.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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 04d5e48c3..274c0a6c2 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -24,14 +24,14 @@ "prettier": "@homarr/prettier-config", "dependencies": { "@homarr/ui": "workspace:^0.1.0", - "@mantine/notifications": "^7.16.2", + "@mantine/notifications": "^7.16.3", "@tabler/icons-react": "^3.30.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/old-import/package.json b/packages/old-import/package.json index 18a8ad00c..38ac90b92 100644 --- a/packages/old-import/package.json +++ b/packages/old-import/package.json @@ -37,14 +37,14 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", - "@mantine/hooks": "^7.16.2", + "@mantine/core": "^7.16.3", + "@mantine/hooks": "^7.16.3", "adm-zip": "0.5.16", - "next": "15.1.6", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0", "superjson": "2.2.2", - "zod": "^3.24.1", + "zod": "^3.24.2", "zod-form-data": "^2.0.5" }, "devDependencies": { @@ -52,7 +52,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/adm-zip": "0.5.7", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/old-schema/package.json b/packages/old-schema/package.json index d3887fb51..fb94a8dec 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.24.1" + "zod": "^3.24.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/ping/package.json b/packages/ping/package.json index cf0b7104f..0048e5209 100644 --- a/packages/ping/package.json +++ b/packages/ping/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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/redis/package.json b/packages/redis/package.json index 91c94a6e6..4b979750c 100644 --- a/packages/redis/package.json +++ b/packages/redis/package.json @@ -33,7 +33,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/request-handler/package.json b/packages/request-handler/package.json index 436fa4028..9f8629c99 100644 --- a/packages/request-handler/package.json +++ b/packages/request-handler/package.json @@ -22,7 +22,7 @@ }, "prettier": "@homarr/prettier-config", "dependencies": { - "@extractus/feed-extractor": "7.1.3", + "@extractus/feed-extractor": "7.1.4", "@homarr/common": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", @@ -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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/request-handler/src/lib/cached-request-integration-job-handler.ts b/packages/request-handler/src/lib/cached-request-integration-job-handler.ts index c9e2efe9a..1c306f300 100644 --- a/packages/request-handler/src/lib/cached-request-integration-job-handler.ts +++ b/packages/request-handler/src/lib/cached-request-integration-job-handler.ts @@ -5,7 +5,7 @@ import { hashObjectBase64, Stopwatch } from "@homarr/common"; import { decryptSecret } from "@homarr/common/server"; import type { MaybeArray } from "@homarr/common/types"; import { db } from "@homarr/db"; -import { getItemsWithIntegrationsAsync } from "@homarr/db/queries"; +import { getItemsWithIntegrationsAsync, getServerSettingsAsync } from "@homarr/db/queries"; import type { WidgetKind } from "@homarr/definitions"; import { logger } from "@homarr/log"; @@ -33,6 +33,7 @@ export const createRequestIntegrationJobHandler = < }, ) => { return async () => { + const serverSettings = await getServerSettingsAsync(db); const itemsForIntegration = await getItemsWithIntegrationsAsync(db, { kinds: widgetKinds, }); @@ -52,7 +53,17 @@ export const createRequestIntegrationJobHandler = < const oneOrMultipleInputs = getInput[itemForIntegration.kind]( reduceWidgetOptionsWithDefaultValues( itemForIntegration.kind, - SuperJSON.parse(itemForIntegration.options), + { + defaultSearchEngineId: serverSettings.search.defaultSearchEngineId, + openSearchInNewTab: true, + firstDayOfWeek: 1, + homeBoardId: serverSettings.board.homeBoardId, + mobileHomeBoardId: serverSettings.board.mobileHomeBoardId, + pingIconsEnabled: true, + enableStatusByDefault: serverSettings.board.enableStatusByDefault, + forceDisableStatus: serverSettings.board.forceDisableStatus, + }, + SuperJSON.parse>(itemForIntegration.options), ) as never, ); for (const { integration } of itemForIntegration.integrations) { diff --git a/packages/server-settings/package.json b/packages/server-settings/package.json index 55b5d7b42..2604741fd 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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/server-settings/src/index.ts b/packages/server-settings/src/index.ts index 35f73699f..12c859165 100644 --- a/packages/server-settings/src/index.ts +++ b/packages/server-settings/src/index.ts @@ -28,6 +28,8 @@ export const defaultServerSettings = { board: { homeBoardId: null as string | null, mobileHomeBoardId: null as string | null, + enableStatusByDefault: true, + forceDisableStatus: false, }, appearance: { defaultColorScheme: "light" as ColorScheme, diff --git a/packages/settings/package.json b/packages/settings/package.json index f92311511..d679f2979 100644 --- a/packages/settings/package.json +++ b/packages/settings/package.json @@ -25,8 +25,8 @@ "@homarr/api": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/server-settings": "workspace:^0.1.0", - "@mantine/dates": "^7.16.2", - "next": "15.1.6", + "@mantine/dates": "^7.16.3", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0" }, @@ -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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/settings/src/context.tsx b/packages/settings/src/context.tsx index a78fe3fcd..d7b71aa72 100644 --- a/packages/settings/src/context.tsx +++ b/packages/settings/src/context.tsx @@ -8,7 +8,7 @@ import type { RouterOutputs } from "@homarr/api"; import type { User } from "@homarr/db/schema"; import type { ServerSettings } from "@homarr/server-settings"; -type SettingsContextProps = Pick< +export type SettingsContextProps = Pick< User, | "firstDayOfWeek" | "defaultSearchEngineId" @@ -16,11 +16,15 @@ type SettingsContextProps = Pick< | "mobileHomeBoardId" | "openSearchInNewTab" | "pingIconsEnabled" ->; +> & + Pick; interface PublicServerSettings { search: Pick; - board: Pick; + board: Pick< + ServerSettings["board"], + "homeBoardId" | "mobileHomeBoardId" | "enableStatusByDefault" | "forceDisableStatus" + >; } const SettingsContext = createContext(null); @@ -39,6 +43,8 @@ export const SettingsProvider = ({ homeBoardId: user?.homeBoardId ?? serverSettings.board.homeBoardId, mobileHomeBoardId: user?.mobileHomeBoardId ?? serverSettings.board.mobileHomeBoardId, pingIconsEnabled: user?.pingIconsEnabled ?? false, + enableStatusByDefault: serverSettings.board.enableStatusByDefault, + forceDisableStatus: serverSettings.board.forceDisableStatus, }} > {children} diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index d5cb615e1..f86f22b17 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -33,12 +33,12 @@ "@homarr/settings": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", - "@mantine/hooks": "^7.16.2", - "@mantine/spotlight": "^7.16.2", + "@mantine/core": "^7.16.3", + "@mantine/hooks": "^7.16.3", + "@mantine/spotlight": "^7.16.3", "@tabler/icons-react": "^3.30.0", - "jotai": "^2.11.3", - "next": "15.1.6", + "jotai": "^2.12.0", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0", "use-deep-compare-effect": "^1.8.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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/translation/package.json b/packages/translation/package.json index 70ed7a76b..4c1bd445b 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -32,7 +32,7 @@ "dayjs": "^1.11.13", "deepmerge": "4.3.1", "mantine-react-table": "2.0.0-beta.8", - "next": "15.1.6", + "next": "15.1.7", "next-intl": "3.26.3", "react": "19.0.0", "react-dom": "19.0.0" @@ -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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/translation/src/config.ts b/packages/translation/src/config.ts index 700f1353f..0929de7a5 100644 --- a/packages/translation/src/config.ts +++ b/packages/translation/src/config.ts @@ -3,6 +3,17 @@ import type { MRT_Localization } from "mantine-react-table"; import { objectKeys } from "@homarr/common"; export const localeConfigurations = { + ca: { + name: "Català", + translatedName: "Catalan", + flagIcon: "es-ct", + importMrtLocalization() { + return import("./mantine-react-table/ca.json"); + }, + importDayJsLocale() { + return import("dayjs/locale/ca").then((module) => module.default); + }, + }, cn: { name: "中文", translatedName: "Chinese (Simplified)", diff --git a/packages/translation/src/lang/ca.json b/packages/translation/src/lang/ca.json index bcd73dedd..1dc7a6e04 100644 --- a/packages/translation/src/lang/ca.json +++ b/packages/translation/src/lang/ca.json @@ -401,21 +401,21 @@ "title": "", "item": { "view-logs": { - "label": "", - "description": "" + "label": "Veure registres", + "description": "Permet que els membres visualitzin els registres" } } }, "search-engine": { - "title": "", + "title": "Motors de cerca", "item": { "create": { - "label": "", - "description": "" + "label": "Crea motors de cerca", + "description": "Permet que els membres crein motors de cerca" }, "modify-all": { - "label": "", - "description": "" + "label": "Modifica tots els motors de cerca", + "description": "Permet que els membres modifiquin tots els motors de cerca" }, "full-all": { "label": "", @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/cn.json b/packages/translation/src/lang/cn.json index 7175b8ebd..84f0d0d33 100644 --- a/packages/translation/src/lang/cn.json +++ b/packages/translation/src/lang/cn.json @@ -153,10 +153,10 @@ "label": "为 ping 使用图标" }, "defaultSearchEngine": { - "label": "" + "label": "默认搜索引擎" }, "openSearchInNewTab": { - "label": "" + "label": "在新标签页中打开搜索结果" } }, "error": { @@ -219,10 +219,10 @@ "changeSearchPreferences": { "notification": { "success": { - "message": "" + "message": "搜索首选项更改成功" }, "error": { - "message": "" + "message": "无法更改搜索首选项" } } }, @@ -805,7 +805,7 @@ "apply": "应用", "backToOverview": "返回概览", "create": "创建", - "createAnother": "", + "createAnother": "创建并重新开始", "edit": "编辑", "import": "导入", "insert": "插入", @@ -948,7 +948,7 @@ "moveDown": "下移", "createAbove": "上方新建分类", "createBelow": "下方新建分类", - "openAllInNewTabs": "" + "openAllInNewTabs": "在标签中打开全部" }, "create": { "title": "新建分类", @@ -969,8 +969,8 @@ } }, "openAllInNewTabs": { - "title": "", - "text": "" + "title": "在标签中打开全部", + "text": "某些浏览器可能出于安全原因阻止大批打开标签页。 Homarr 无法打开所有窗口,因为您的浏览器屏蔽了此操作。请允许“打开弹出窗口”并重试。" } } }, @@ -1048,7 +1048,7 @@ "label": "显示描述提示" }, "pingEnabled": { - "label": "启用简单的 ping" + "label": "启用状态检查" } }, "error": { @@ -1200,12 +1200,12 @@ "description": "日期应该是什么样的" }, "customTimeFormat": { - "label": "", - "description": "" + "label": "自定义时间格式", + "description": "使用 ISO 8601 格式化时间 (这将覆盖其他选项)" }, "customDateFormat": { - "label": "", - "description": "" + "label": "自定义日期格式", + "description": "使用 ISO 8601 格式化日期(这将覆盖其他选项)" } } }, @@ -1388,11 +1388,11 @@ "label": "华氏温度" }, "disableTemperatureDecimals": { - "label": "" + "label": "禁用温度小数" }, "showCurrentWindSpeed": { - "label": "", - "description": "" + "label": "显示当前风速", + "description": "仅在当前天气时" }, "location": { "label": "天气位置" @@ -1412,12 +1412,12 @@ "description": "日期应该是什么样的" } }, - "currentWindSpeed": "", + "currentWindSpeed": "{currentWindSpeed} km/h", "dailyForecast": { - "sunrise": "", - "sunset": "", - "maxWindSpeed": "", - "maxWindGusts": "" + "sunrise": "日出", + "sunset": "日落", + "maxWindSpeed": "最大风速:{maxWindSpeed} km/h", + "maxWindGusts": "最大阵风:{maxWindGusts} km/h" }, "kind": { "clear": "晴朗", @@ -2052,6 +2052,10 @@ "description": "您可以在每个项目的高级选项中添加自定义类别到您的面板项目并在上面的自定义 CSS 中使用它们。" } }, + "disableStatus": { + "label": "禁用应用状态", + "description": "禁用此面板上所有应用的状态检查" + }, "columnCount": { "label": "列数" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "自定义 css" }, + "behavior": { + "title": "行为" + }, "access": { "title": "访问控制", "permission": { @@ -2315,7 +2322,7 @@ "mobile": "手机" } }, - "search": "", + "search": "搜索", "firstDayOfWeek": "一周的第一天", "accessibility": "无障碍服务" } @@ -2476,6 +2483,17 @@ "label": "全局主面板", "mobileLabel": "全局手机面板", "description": "只有公共面板可供选择" + }, + "status": { + "title": "应用状态", + "enableStatusByDefault": { + "label": "启用默认状态", + "description": "添加应用项目时,默认将启用状态" + }, + "forceDisableStatus": { + "label": "强制禁用状态", + "description": "所有用户的应用状态将被禁用,无法启用" + } } }, "search": { @@ -2586,15 +2604,15 @@ }, "modal": { "delete": { - "title": "", - "text": "" + "title": "删除 API 令牌", + "text": "这将永久删除 API 令牌。使用此令牌的 API 客户端无法再进行身份验证并执行 API 请求。此操作无法撤消。" } }, "table": { "header": { "id": "ID", "createdBy": "创建者", - "actions": "" + "actions": "操作" } } } diff --git a/packages/translation/src/lang/cs.json b/packages/translation/src/lang/cs.json index 6cd880636..68124aa0c 100644 --- a/packages/translation/src/lang/cs.json +++ b/packages/translation/src/lang/cs.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/da.json b/packages/translation/src/lang/da.json index 91f1bbc8a..e62952d9a 100644 --- a/packages/translation/src/lang/da.json +++ b/packages/translation/src/lang/da.json @@ -1048,7 +1048,7 @@ "label": "Vis beskrivelsesværktøjstip" }, "pingEnabled": { - "label": "Aktivér simpel ping" + "label": "Aktiver statustjek" } }, "error": { @@ -2052,6 +2052,10 @@ "description": "Du kan tilføje brugerdefinerede klasser til dine tavle elementer i de avancerede muligheder for hvert element og bruge dem i den brugerdefinerede CSS ovenfor." } }, + "disableStatus": { + "label": "Deaktiver app status", + "description": "Deaktiverer statustjek for alle apps på denne tavle" + }, "columnCount": { "label": "Kolonne antal" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Brugerdefineret CSS" }, + "behavior": { + "title": "Virkemåde" + }, "access": { "title": "Adgangskontrol", "permission": { @@ -2476,6 +2483,17 @@ "label": "Global hjemmetavle", "mobileLabel": "Global mobiltavle", "description": "Kun offentlige tavler er tilgængelige til udvælgelse" + }, + "status": { + "title": "App status", + "enableStatusByDefault": { + "label": "Aktiver status som standard", + "description": "Når du tilføjer et app element, vil status blive aktiveret som standard" + }, + "forceDisableStatus": { + "label": "Gennemtving status deaktivering", + "description": "Status for apps vil blive deaktiveret for alle brugere og kan ikke blive aktiveret" + } } }, "search": { diff --git a/packages/translation/src/lang/de.json b/packages/translation/src/lang/de.json index b83f2d38b..921ed67cd 100644 --- a/packages/translation/src/lang/de.json +++ b/packages/translation/src/lang/de.json @@ -2052,6 +2052,10 @@ "description": "Sie können in den erweiterten Optionen jedes Elements eigene Klassen zu Ihren Board-Elementen hinzufügen und diese in dem benutzerdefinierten CSS oben verwenden." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "Anzahl der Spalten" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Benutzerdefiniertes CSS" }, + "behavior": { + "title": "" + }, "access": { "title": "Zugriffskontrolle", "permission": { @@ -2476,6 +2483,17 @@ "label": "Globales Home Board", "mobileLabel": "Globales Mobil Board", "description": "Nur öffentliche Boards stehen zur Auswahl" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/el.json b/packages/translation/src/lang/el.json index 0ae755c19..60fc47849 100644 --- a/packages/translation/src/lang/el.json +++ b/packages/translation/src/lang/el.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 379fcd243..f3ad7d017 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -1048,7 +1048,7 @@ "label": "Show description tooltip" }, "pingEnabled": { - "label": "Enable simple ping" + "label": "Enable status check" } }, "error": { @@ -2052,6 +2052,10 @@ "description": "You can add custom classes to your board items in the advanced options of each item and use them in the custom CSS above." } }, + "disableStatus": { + "label": "Disable app status", + "description": "Disables the status check for all apps on this board" + }, "columnCount": { "label": "Column count" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Custom css" }, + "behavior": { + "title": "Behavior" + }, "access": { "title": "Access control", "permission": { @@ -2476,6 +2483,17 @@ "label": "Global home board", "mobileLabel": "Global mobile board", "description": "Only public boards are available for selection" + }, + "status": { + "title": "App status", + "enableStatusByDefault": { + "label": "Enable status by default", + "description": "When adding an app item, the status will be enabled by default" + }, + "forceDisableStatus": { + "label": "Force disable status", + "description": "Status for apps will be disabled for all users and can't be enabled" + } } }, "search": { diff --git a/packages/translation/src/lang/es.json b/packages/translation/src/lang/es.json index 63a5ddf52..e09f25bc8 100644 --- a/packages/translation/src/lang/es.json +++ b/packages/translation/src/lang/es.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/et.json b/packages/translation/src/lang/et.json index e7768a3ae..02873e986 100644 --- a/packages/translation/src/lang/et.json +++ b/packages/translation/src/lang/et.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/fr.json b/packages/translation/src/lang/fr.json index 79918ac94..3793290fb 100644 --- a/packages/translation/src/lang/fr.json +++ b/packages/translation/src/lang/fr.json @@ -78,11 +78,11 @@ }, "group": { "title": "Groupe externe", - "subtitle": "", + "subtitle": "Spécifie le groupe à utiliser pour les utilisateurs externes.", "form": { "name": { "label": "Nom du groupe", - "description": "" + "description": "Le nom doit correspondre au groupe administrateur du fournisseur externe" } } }, @@ -95,8 +95,8 @@ "subtitle": "Vous êtes prêt !", "description": "Vous avez terminé avec succès le processus d'installation. Vous pouvez maintenant commencer à utiliser Homarr. Sélectionnez votre prochaine action :", "action": { - "goToBoard": "", - "createBoard": "", + "goToBoard": "Accéder au tableau {name}", + "createBoard": "Créez votre premier tableau", "inviteUser": "Inviter d'autres utilisateurs", "docs": "Lire la documentation" } @@ -147,16 +147,16 @@ "label": "Ancien mot de passe" }, "homeBoard": { - "label": "" + "label": "Tableau de bord" }, "pingIconsEnabled": { - "label": "" + "label": "Utiliser les icônes pour les pings" }, "defaultSearchEngine": { - "label": "" + "label": "Moteur de recherche par défaut" }, "openSearchInNewTab": { - "label": "" + "label": "Ouvrir les résultats de recherche dans un nouvel onglet" } }, "error": { @@ -173,7 +173,7 @@ }, "error": { "title": "Échec de la connexion", - "message": "" + "message": "Échec de la connexion" } }, "forgotPassword": { @@ -186,10 +186,10 @@ "notification": { "success": { "title": "Compte créé", - "message": "" + "message": "Veuillez vous connecter pour continuer" }, "error": { - "title": "", + "title": "Échec de la création du compte", "message": "Votre compte n'a pas pu être créé" } } @@ -209,40 +209,40 @@ "changeHomeBoard": { "notification": { "success": { - "message": "" + "message": "Tableau de bord modifié avec succès" }, "error": { - "message": "" + "message": "Impossible de modifier le tableau de bord" } } }, "changeSearchPreferences": { "notification": { "success": { - "message": "" + "message": "Les préférences de recherche ont été modifiées avec succès" }, "error": { - "message": "" + "message": "Impossible de modifier les préférences de recherche" } } }, "changeFirstDayOfWeek": { "notification": { "success": { - "message": "" + "message": "Le premier jour de la semaine a été modifié avec succès" }, "error": { - "message": "" + "message": "Impossible de modifier le premier jour de la semaine" } } }, "changePingIconsEnabled": { "notification": { "success": { - "message": "" + "message": "Icônes de ping activés avec succès" }, "error": { - "message": "" + "message": "Impossible d'activer les icônes de ping" } } }, @@ -326,15 +326,15 @@ }, "use-all": { "label": "Utiliser toutes les apps", - "description": "" + "description": "Autoriser les membres à ajouter des applications à leur tableau" }, "modify-all": { "label": "Modifier toutes les apps", - "description": "" + "description": "Autoriser les membres à modifier toutes les applications" }, "full-all": { - "label": "", - "description": "" + "label": "Accès complet à l'application", + "description": "Autoriser les membres à gérer, utiliser et supprimer n'importe quelle application" } } }, @@ -342,20 +342,20 @@ "title": "Tableaux de bord", "item": { "create": { - "label": "", - "description": "" + "label": "Créer des tableaux", + "description": "Autoriser les membres à créer des tableaux" }, "view-all": { - "label": "", - "description": "" + "label": "Voir tous les tableaux", + "description": "Autoriser les membres à voir tous les tableaux" }, "modify-all": { - "label": "", - "description": "" + "label": "Modifier tous les tableaux", + "description": "Autoriser les membres à modifier tous les tableaux (n'inclut pas le contrôle d'accès et la zone de danger)" }, "full-all": { - "label": "", - "description": "" + "label": "Accès complet au tableau", + "description": "Autoriser les membres à visualiser, modifier et supprimer tous les tableaux (y compris le contrôle d'accès et la zone de danger)" } } }, @@ -367,12 +367,12 @@ "description": "Autoriser les membres à créer des intégrations" }, "use-all": { - "label": "", - "description": "" + "label": "Utiliser toutes les intégrations", + "description": "Autoriser les membres à ajouter des intégrations à leurs tableaux" }, "interact-all": { - "label": "", - "description": "" + "label": "Interagir avec n'importe quelle intégration", + "description": "Autoriser les membres à interagir avec n'importe quelle intégration" }, "full-all": { "label": "", @@ -715,17 +715,17 @@ "title": "", "lastUpdated": "", "notSet": { - "label": "", - "tooltip": "" + "label": "Aucune valeur définie", + "tooltip": "Le secret requis n'a pas encore été défini" }, - "secureNotice": "", + "secureNotice": "Ce secret ne peut pas être récupéré après la création", "reset": { - "title": "", - "message": "" + "title": "Réinitialiser le secret", + "message": "Souhaitez-vous vraiment réinitialiser ce secret ?" }, "noSecretsRequired": { - "segmentTitle": "", - "text": "" + "segmentTitle": "Aucuns secrets", + "text": "Aucun secret requis pour cette intégration" }, "kind": { "username": { @@ -751,14 +751,14 @@ } }, "permission": { - "use": "", - "interact": "", - "full": "" + "use": "Sélectionner les intégrations dans les éléments", + "interact": "Interagir avec les intégrations", + "full": "Accès intégral à l'intégration" } }, "media": { - "plural": "", - "search": "", + "plural": "Médias", + "search": "Rechercher un média", "field": { "name": "Nom", "size": "Taille", @@ -766,26 +766,26 @@ }, "action": { "upload": { - "label": "", - "file": "", + "label": "Téléverser un média", + "file": "Sélectionner un fichier", "notification": { "success": { - "message": "" + "message": "Le média a été téléversé avec succès" }, "error": { - "message": "" + "message": "Le média n’a pas pu être téléversé" } } }, "delete": { - "label": "", - "description": "", + "label": "Supprimer le média", + "description": "Êtes-vous sûr de vouloir supprimer le média ?", "notification": { "success": { - "message": "" + "message": "Le média a été supprimé avec succès" }, "error": { - "message": "" + "message": "Le média n'a pas pu être supprimé" } } }, @@ -793,7 +793,7 @@ "label": "Copier l'URL" }, "open": { - "label": "" + "label": "Ouvrir le média" } } }, @@ -803,9 +803,9 @@ "action": { "add": "Ajouter", "apply": "Appliquer", - "backToOverview": "", + "backToOverview": "Retourner à l'aperçu", "create": "Créer", - "createAnother": "", + "createAnother": "Créer et recommencer", "edit": "Modifier", "import": "Importer", "insert": "Insérer", @@ -814,7 +814,7 @@ "saveChanges": "Sauvegarder les modifications", "cancel": "Annuler", "delete": "Supprimer", - "discard": "", + "discard": "Abandonner", "confirm": "Confirmer", "continue": "Continuer", "previous": "Précédent", @@ -826,8 +826,8 @@ }, "here": "ici", "iconPicker": { - "label": "", - "header": "" + "label": "URL de l'icône :", + "header": "Tapez le nom ou les objets pour filtrer les icônes... Homarr recherchera les icônes {countIcons} pour vous." }, "colorScheme": { "options": { @@ -844,33 +844,33 @@ }, "notification": { "create": { - "success": "", - "error": "" + "success": "Création réussie", + "error": "Échec de la création" }, "delete": { - "success": "", - "error": "" + "success": "Suppression réussie", + "error": "Échec de la suppression" }, "update": { - "success": "", - "error": "" + "success": "Modifications appliquées avec succès", + "error": "Impossible d'appliquer les changements" }, "transfer": { - "success": "", - "error": "" + "success": "Transfert réussi", + "error": "Le transfert a échoué" } }, "multiSelect": { - "placeholder": "" + "placeholder": "Choisissez une ou plusieurs valeurs" }, "multiText": { - "placeholder": "", + "placeholder": "Ajouter des valeurs supplémentaires", "addLabel": "Ajouter {value}" }, "select": { - "placeholder": "", + "placeholder": "Choisir une valeur", "badge": { - "recommended": "" + "recommended": "Recommandé" } }, "userAvatar": { @@ -881,16 +881,16 @@ "preferences": "Vos préférences", "logout": "Se déconnecter", "login": "Connexion", - "homeBoard": "", - "loggedOut": "", - "updateAvailable": "" + "homeBoard": "Votre tableau de bord", + "loggedOut": "Déconnecté", + "updateAvailable": "Mises à jour {countUpdates} disponibles : {tag}" } }, "dangerZone": "Zone de danger", "noResults": "Aucun résultat trouvé", "preview": { - "show": "", - "hide": "" + "show": "Afficher l’aperçu", + "hide": "Masquer l'aperçu" }, "zod": { "errors": { @@ -900,7 +900,7 @@ "startsWith": "Ce champ doit commencer par {startsWith}", "endsWith": "Ce champ doit terminer par {endsWith}", "includes": "Ce champ doit inclure {includes}", - "invalidEmail": "" + "invalidEmail": "Ce champ doit être une adresse e-mail valide" }, "tooSmall": { "string": "Ce champ doit faire au moins {minimum} caractères", @@ -911,8 +911,8 @@ "number": "Ce champ doit être inférieur ou égal à {maximum}" }, "custom": { - "passwordsDoNotMatch": "", - "passwordRequirements": "", + "passwordsDoNotMatch": "Les mots de passe ne correspondent pas.", + "passwordRequirements": "Le mot de passe ne respecte pas les exigences requises.", "boardAlreadyExists": "", "invalidFileType": "", "invalidFileName": "", @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/he.json b/packages/translation/src/lang/he.json index c936d6c49..377db6d31 100644 --- a/packages/translation/src/lang/he.json +++ b/packages/translation/src/lang/he.json @@ -805,7 +805,7 @@ "apply": "החל", "backToOverview": "חזרה לסקירה כללית", "create": "צור", - "createAnother": "", + "createAnother": "צור והתחל מחדש", "edit": "עריכה", "import": "ייבוא", "insert": "הוספה", @@ -948,7 +948,7 @@ "moveDown": "הזזה למטה", "createAbove": "קטגוריה חדשה למעלה", "createBelow": "קטגוריה חדשה למטה", - "openAllInNewTabs": "" + "openAllInNewTabs": "פתח הכל בכרטיסיות" }, "create": { "title": "קטגוריה חדשה", @@ -969,8 +969,8 @@ } }, "openAllInNewTabs": { - "title": "", - "text": "" + "title": "פתח הכל בכרטיסיות", + "text": "דפדפנים מסוימים עשויים לחסום פתיחה בכמות גדולה של כרטיסיות מסיבות אבטחה. Homarr לא הצליח לפתוח את כל החלונות, מכיוון שהדפדפן שלך חסם את הפעולה הזו. אפשר \"פתח חלונות קופצים\" ונסה שוב." } } }, @@ -1200,12 +1200,12 @@ "description": "איך צריך להיראות התאריך" }, "customTimeFormat": { - "label": "", - "description": "" + "label": "פורמט זמן מותאם אישית", + "description": "השתמש ב-ISO 8601 כדי לעצב תצוגת זמן (זה ידרוס אפשרויות אחרות)" }, "customDateFormat": { - "label": "", - "description": "" + "label": "פורמט זמן מותאם אישית", + "description": "השתמש ב-ISO 8601 כדי לעצב תצוגת זמן (זה ידרוס אפשרויות אחרות)" } } }, @@ -2052,6 +2052,10 @@ "description": "אתה יכול להוסיף מחלקות מותאמות אישית לפריטי הלוח שלך באפשרויות המתקדמות של כל פריט ולהשתמש בהן בעיצוב המותאם אישית למעלה." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "ספירת עמודות" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "עיצוב מותאם אישית" }, + "behavior": { + "title": "" + }, "access": { "title": "בקרת גישה", "permission": { @@ -2476,6 +2483,17 @@ "label": "לוח בית גלובלי", "mobileLabel": "לוח גלובלי למכשיר נייד", "description": "רק לוחות ציבוריים זמינים לבחירה" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { @@ -2586,15 +2604,15 @@ }, "modal": { "delete": { - "title": "", - "text": "" + "title": "מחיקת מפתח API", + "text": "פעולה זו תמחק לצמיתות את אסימון ה-API. לקוחות API המשתמשים באסימון זה אינם יכולים עוד לאמת ולבצע בקשות API. לא ניתן לבטל פעולה זו." } }, "table": { "header": { "id": "מספר מזהה", "createdBy": "נוצר על ידי", - "actions": "" + "actions": "פעולות" } } } diff --git a/packages/translation/src/lang/hr.json b/packages/translation/src/lang/hr.json index a9de11cd5..d49d6e1e4 100644 --- a/packages/translation/src/lang/hr.json +++ b/packages/translation/src/lang/hr.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/hu.json b/packages/translation/src/lang/hu.json index c78e347ca..175f53354 100644 --- a/packages/translation/src/lang/hu.json +++ b/packages/translation/src/lang/hu.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/it.json b/packages/translation/src/lang/it.json index 7f583f511..934e2823f 100644 --- a/packages/translation/src/lang/it.json +++ b/packages/translation/src/lang/it.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/ja.json b/packages/translation/src/lang/ja.json index 442c6d28c..c056a42fb 100644 --- a/packages/translation/src/lang/ja.json +++ b/packages/translation/src/lang/ja.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/ko.json b/packages/translation/src/lang/ko.json index 86647d5e1..4f7d0c3f0 100644 --- a/packages/translation/src/lang/ko.json +++ b/packages/translation/src/lang/ko.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/lt.json b/packages/translation/src/lang/lt.json index 8a4a81512..7a7083662 100644 --- a/packages/translation/src/lang/lt.json +++ b/packages/translation/src/lang/lt.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/lv.json b/packages/translation/src/lang/lv.json index 1a45bd121..50e58432d 100644 --- a/packages/translation/src/lang/lv.json +++ b/packages/translation/src/lang/lv.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/nl.json b/packages/translation/src/lang/nl.json index c85bb7b2f..48331dde1 100644 --- a/packages/translation/src/lang/nl.json +++ b/packages/translation/src/lang/nl.json @@ -2052,6 +2052,10 @@ "description": "Je kunt aangepaste classes toevoegen aan je borditems in de geavanceerde opties van elk item en ze gebruiken in de aangepaste CSS hierboven." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "Kolom aantal" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Aangepaste CSS" }, + "behavior": { + "title": "" + }, "access": { "title": "Toegangsbeheer", "permission": { @@ -2476,6 +2483,17 @@ "label": "Globaal home-bord", "mobileLabel": "Globaal mobiel bord", "description": "Alleen openbare borden zijn beschikbaar voor selectie" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/no.json b/packages/translation/src/lang/no.json index b7cef9fa0..7611a7767 100644 --- a/packages/translation/src/lang/no.json +++ b/packages/translation/src/lang/no.json @@ -2052,6 +2052,10 @@ "description": "Du kan legge til egendefinerte css-klasser i tavleelementene dine i de avanserte alternativene for hvert element og bruke dem i egendefinert CSS ovenfor." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "Antall kolonner" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Egendefinert css" }, + "behavior": { + "title": "" + }, "access": { "title": "Adgangskontroll", "permission": { @@ -2476,6 +2483,17 @@ "label": "Global hjemtavle", "mobileLabel": "Global mobiltavle", "description": "Bare offentlige tavler er tilgjengelige for valg" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/pl.json b/packages/translation/src/lang/pl.json index c45ba684b..b41f881ee 100644 --- a/packages/translation/src/lang/pl.json +++ b/packages/translation/src/lang/pl.json @@ -153,10 +153,10 @@ "label": "Użyj ikon dla pingów" }, "defaultSearchEngine": { - "label": "" + "label": "Domyślna wyszukiwarka" }, "openSearchInNewTab": { - "label": "" + "label": "Otwórz wyniki wyszukiwania w nowej karcie" } }, "error": { @@ -219,10 +219,10 @@ "changeSearchPreferences": { "notification": { "success": { - "message": "" + "message": "Ustawienia wyszukiwania zostały zmienione" }, "error": { - "message": "" + "message": "Nie można zmienić preferencji wyszukiwania" } } }, @@ -741,8 +741,8 @@ "newLabel": "Nowe hasło" }, "tokenId": { - "label": "", - "newLabel": "" + "label": "Token ID", + "newLabel": "Nowy token ID" }, "realm": { "label": "", @@ -915,7 +915,7 @@ "passwordRequirements": "Twoje hasło nie spełnia wymagań.", "boardAlreadyExists": "Tablica o tej nazwie już istnieje", "invalidFileType": "Nieprawidłowy typ pliku, oczekiwany {expected}", - "invalidFileName": "", + "invalidFileName": "Nieprawidłowa nazwa pliku", "fileTooLarge": "Plik jest zbyt duży, maksymalny rozmiar to {maxSize}", "invalidConfiguration": "Nieprawidłowa konfiguracja", "groupNameTaken": "Nazwa użytkownika jest już zajęta" @@ -948,7 +948,7 @@ "moveDown": "Przenieś w dół", "createAbove": "Nowa kategoria powyżej", "createBelow": "Nowa kategoria poniżej", - "openAllInNewTabs": "" + "openAllInNewTabs": "Otwórz wszystkie w kartach" }, "create": { "title": "Nowa kategoria", @@ -969,7 +969,7 @@ } }, "openAllInNewTabs": { - "title": "", + "title": "Otwórz wszystkie w kartach", "text": "" } } @@ -1080,13 +1080,13 @@ } }, "hideIcon": { - "label": "" + "label": "Ukryj ikony" }, "hideHostname": { "label": "" }, "openNewTab": { - "label": "" + "label": "Otwórz w nowej karcie" }, "items": { "label": "Zakładki", @@ -1200,8 +1200,8 @@ "description": "Jak powinna wyglądać data" }, "customTimeFormat": { - "label": "", - "description": "" + "label": "Własny format czasu", + "description": "Użyj ISO 8601 do formatu czasu (spowoduje nadpisanie innych opcji)" }, "customDateFormat": { "label": "", @@ -1414,8 +1414,8 @@ }, "currentWindSpeed": "", "dailyForecast": { - "sunrise": "", - "sunset": "", + "sunrise": "Wschód słońca", + "sunset": "Zachód słońca", "maxWindSpeed": "", "maxWindGusts": "" }, @@ -1454,7 +1454,7 @@ "name": "Monitorowanie zdrowia systemu", "description": "Wyświetla informacje o stanie Twojego systemu(ów).", "tab": { - "system": "", + "system": "System", "cluster": "" }, "option": { @@ -1497,8 +1497,8 @@ }, "cluster": { "summary": { - "cpu": "", - "memory": "" + "cpu": "CPU", + "memory": "RAM" }, "resource": { "node": { @@ -1518,16 +1518,16 @@ "rightSection": { "node": "", "vmId": "", - "plugin": "" + "plugin": "Wtyczka" }, "detail": { "cpu": "", - "memory": "", - "storage": "", - "uptime": "", - "haState": "", + "memory": "Pamięć", + "storage": "Magazyn", + "uptime": "Czas pracy", + "haState": "Stan HA", "storageType": { - "local": "", + "local": "Magazyn lokalny", "shared": "" } } @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/pt.json b/packages/translation/src/lang/pt.json index c86cab1f3..890d6a15e 100644 --- a/packages/translation/src/lang/pt.json +++ b/packages/translation/src/lang/pt.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/ro.json b/packages/translation/src/lang/ro.json index 5bf03cd4d..a580e644c 100644 --- a/packages/translation/src/lang/ro.json +++ b/packages/translation/src/lang/ro.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/ru.json b/packages/translation/src/lang/ru.json index 35ecfbde7..236c53cb6 100644 --- a/packages/translation/src/lang/ru.json +++ b/packages/translation/src/lang/ru.json @@ -2052,6 +2052,10 @@ "description": "Вы можете добавлять пользовательские классы к элементам панели в расширенных настройках каждого элемента и использовать их в пользовательском CSS выше." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "Количество столбцов" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Пользовательский CSS" }, + "behavior": { + "title": "" + }, "access": { "title": "Управление доступом", "permission": { @@ -2476,6 +2483,17 @@ "label": "Глобальная домашняя панель", "mobileLabel": "Глобальная мобильная панель", "description": "Для выбора доступны только публичные панели" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/sk.json b/packages/translation/src/lang/sk.json index 9c5540417..fda26a2f2 100644 --- a/packages/translation/src/lang/sk.json +++ b/packages/translation/src/lang/sk.json @@ -2052,6 +2052,10 @@ "description": "Vlastné triedy môžete pridať k položkám nástenky v rozšírených možnostiach každej položky a použiť ich vo vlastnom CSS vyššie." } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "Počet stĺpcov" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Vlastné css" }, + "behavior": { + "title": "" + }, "access": { "title": "Kontrola prístupu", "permission": { @@ -2476,6 +2483,17 @@ "label": "Globálna domovská nástenka", "mobileLabel": "Globálna mobilná doska", "description": "Na výber sú k dispozícii iba verejné tabule" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/sl.json b/packages/translation/src/lang/sl.json index edf17eb69..c586b46ec 100644 --- a/packages/translation/src/lang/sl.json +++ b/packages/translation/src/lang/sl.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/sv.json b/packages/translation/src/lang/sv.json index ef59abf3f..cc1ef814c 100644 --- a/packages/translation/src/lang/sv.json +++ b/packages/translation/src/lang/sv.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/tr.json b/packages/translation/src/lang/tr.json index b8bb0d524..273fb51f7 100644 --- a/packages/translation/src/lang/tr.json +++ b/packages/translation/src/lang/tr.json @@ -1048,7 +1048,7 @@ "label": "Açıklama ipucunu göster" }, "pingEnabled": { - "label": "Basit ping'i etkinleştir" + "label": "Durum denetimini etkinleştir" } }, "error": { @@ -2052,6 +2052,10 @@ "description": "Düzenlenen her aracın gelişmiş seçenekler sekmesinde bulunan alanı kullanarak panel öğelerinizi CSS ile özelleştirebilir ve ya yukarıdaki özel CSS alanını kullanabilirsiniz." } }, + "disableStatus": { + "label": "Uygulama durumunu devre dışı bırak", + "description": "Bu paneldeki tüm uygulamaların durum denetimini devre dışı bırakır" + }, "columnCount": { "label": "Sütun Sayısı" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "Özel Css" }, + "behavior": { + "title": "Davranış" + }, "access": { "title": "Erişim Kontrolü", "permission": { @@ -2164,7 +2171,7 @@ "admin": { "description": "Sunucu için henüz öntanımlı panel belirlemediniz.", "link": "Sunucu geneli için öntanımlı panel atayın", - "notice": "Bu sayfayı tüm kullanıcılardan gizlemek için sunucu için bir ana panel ayarlayın" + "notice": "Bu sayfayı tüm kullanıcılardan gizlemek için sunucuya öntanımlı panel atayın" }, "user": { "description": "Henüz bir ev paneli belirlemediniz.", @@ -2476,6 +2483,17 @@ "label": "Genel öntanımlı panel", "mobileLabel": "Genel öntanımlı mobil panel", "description": "Seçim yalnızca herkese açık paneller için kullanılabilir" + }, + "status": { + "title": "Uygulama durumu", + "enableStatusByDefault": { + "label": "Varsayılan olarak durumu etkinleştir", + "description": "Bir uygulama öğesi eklerken, durum varsayılan olarak etkinleştirilecektir" + }, + "forceDisableStatus": { + "label": "Durumu zorla devre dışı bırak", + "description": "Uygulamalar için durum tüm kullanıcılar için devre dışı bırakılacak ve etkinleştirilemeyecek" + } } }, "search": { diff --git a/packages/translation/src/lang/uk.json b/packages/translation/src/lang/uk.json index e2ed954ac..40a27e253 100644 --- a/packages/translation/src/lang/uk.json +++ b/packages/translation/src/lang/uk.json @@ -836,8 +836,8 @@ } }, "information": { - "min": "", - "max": "", + "min": "Мін", + "max": "Макс", "days": "Днів", "hours": "Годин", "minutes": "Хвилин" @@ -1391,7 +1391,7 @@ "label": "" }, "showCurrentWindSpeed": { - "label": "", + "label": "Показати поточну швидкість вітру", "description": "" }, "location": { @@ -1409,14 +1409,14 @@ }, "dateFormat": { "label": "Формат дати", - "description": "" + "description": "Як має виглядати дата" } }, - "currentWindSpeed": "", + "currentWindSpeed": "{currentWindSpeed} км/год", "dailyForecast": { "sunrise": "", "sunset": "", - "maxWindSpeed": "", + "maxWindSpeed": "Максимальна швидкість вітру: {maxWindSpeed} км/год", "maxWindGusts": "" }, "kind": { @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "Управління доступом", "permission": { @@ -2285,7 +2292,7 @@ }, "visibility": { "public": "Ця дошка є публічною", - "private": "" + "private": "Ця дошка є приватною" }, "modal": { "createBoard": { @@ -2339,7 +2346,7 @@ "title": "Створити нового користувача", "step": { "personalInformation": { - "label": "" + "label": "Особиста інформація" }, "security": { "label": "Безпека" @@ -2476,6 +2483,17 @@ "label": "Глобальна домашня дошка", "mobileLabel": "Глобальна мобільна дошка", "description": "Тут доступні тільки публічні дошки" + }, + "status": { + "title": "Статус додатка", + "enableStatusByDefault": { + "label": "Увімкнути статус за замовчуванням", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { @@ -2525,7 +2543,7 @@ "label": "" }, "ping": { - "label": "" + "label": "Пінги" }, "mediaServer": { "label": "Медіа сервер" @@ -2534,7 +2552,7 @@ "label": "" }, "downloads": { - "label": "" + "label": "Завантаження" }, "mediaRequestStats": { "label": "" @@ -2779,13 +2797,13 @@ "label": "Редагувати" }, "new": { - "label": "" + "label": "Нова" } }, "search-engines": { "label": "Пошукові системи", "new": { - "label": "" + "label": "Нова" }, "edit": { "label": "Редагувати" @@ -2797,7 +2815,7 @@ "apps": { "label": "Додатки", "new": { - "label": "" + "label": "Новий" }, "edit": { "label": "Редагувати" @@ -2898,7 +2916,7 @@ "title": "Локальні команди" }, "globalCommand": { - "title": "", + "title": "Глобальні команди", "option": { "colorScheme": { "light": "Перемикнути на світлу тему", diff --git a/packages/translation/src/lang/vi.json b/packages/translation/src/lang/vi.json index 7a8af54f6..2f0763ce9 100644 --- a/packages/translation/src/lang/vi.json +++ b/packages/translation/src/lang/vi.json @@ -2052,6 +2052,10 @@ "description": "" } }, + "disableStatus": { + "label": "", + "description": "" + }, "columnCount": { "label": "" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "" }, + "behavior": { + "title": "" + }, "access": { "title": "", "permission": { @@ -2476,6 +2483,17 @@ "label": "", "mobileLabel": "", "description": "" + }, + "status": { + "title": "", + "enableStatusByDefault": { + "label": "", + "description": "" + }, + "forceDisableStatus": { + "label": "", + "description": "" + } } }, "search": { diff --git a/packages/translation/src/lang/zh.json b/packages/translation/src/lang/zh.json index 562e03493..5848f7fde 100644 --- a/packages/translation/src/lang/zh.json +++ b/packages/translation/src/lang/zh.json @@ -2052,6 +2052,10 @@ "description": "可以於每個項目中的進階選項中新增自定義類別至面板,並於自定義 CSS html 中使用他們" } }, + "disableStatus": { + "label": "停用應用程式狀態", + "description": "停用此面板上所有應用程式的狀態檢查" + }, "columnCount": { "label": "列數" }, @@ -2085,6 +2089,9 @@ "customCss": { "title": "自定義 CSS html" }, + "behavior": { + "title": "行為" + }, "access": { "title": "訪問控制", "permission": { @@ -2476,6 +2483,17 @@ "label": "全局主面板", "mobileLabel": "全局移動裝置主面板", "description": "只有公開面板可供選擇" + }, + "status": { + "title": "應用程式狀態", + "enableStatusByDefault": { + "label": "啟用狀態為預設", + "description": "新增應用程式時,狀態將預設為啟用" + }, + "forceDisableStatus": { + "label": "強制停用狀態", + "description": "所有使用者的應用程式狀態將被停用,且無法使用" + } } }, "search": { diff --git a/packages/translation/src/mantine-react-table/ca.json b/packages/translation/src/mantine-react-table/ca.json new file mode 100644 index 000000000..d74395864 --- /dev/null +++ b/packages/translation/src/mantine-react-table/ca.json @@ -0,0 +1,93 @@ +{ + "actions": "", + "and": "", + "cancel": "", + "changeFilterMode": "", + "changeSearchMode": "", + "clearFilter": "", + "clearSearch": "", + "clearSelection": "", + "clearSort": "", + "clickToCopy": "", + "copy": "", + "collapse": "", + "collapseAll": "", + "columnActions": "", + "copiedToClipboard": "", + "dropToGroupBy": "", + "edit": "", + "expand": "", + "expandAll": "", + "filterArrIncludes": "", + "filterArrIncludesAll": "", + "filterArrIncludesSome": "", + "filterBetween": "", + "filterBetweenInclusive": "", + "filterByColumn": "", + "filterContains": "", + "filterEmpty": "", + "filterEndsWith": "", + "filterEquals": "", + "filterEqualsString": "", + "filterFuzzy": "", + "filterGreaterThan": "", + "filterGreaterThanOrEqualTo": "", + "filterInNumberRange": "", + "filterIncludesString": "", + "filterIncludesStringSensitive": "", + "filterLessThan": "", + "filterLessThanOrEqualTo": "", + "filterMode": "", + "filterNotEmpty": "", + "filterNotEquals": "", + "filterStartsWith": "", + "filterWeakEquals": "", + "filteringByColumn": "", + "goToFirstPage": "", + "goToLastPage": "", + "goToNextPage": "", + "goToPreviousPage": "", + "grab": "", + "groupByColumn": "", + "groupedBy": "", + "hideAll": "", + "hideColumn": "", + "max": "", + "min": "", + "move": "", + "noRecordsToDisplay": "", + "noResultsFound": "", + "of": "", + "or": "", + "pin": "", + "pinToLeft": "", + "pinToRight": "", + "resetColumnSize": "", + "resetOrder": "", + "rowActions": "", + "rowNumber": "", + "rowNumbers": "", + "rowsPerPage": "", + "save": "", + "search": "", + "selectedCountOfRowCountRowsSelected": "", + "select": "", + "showAll": "", + "showAllColumns": "", + "showHideColumns": "", + "showHideFilters": "", + "showHideSearch": "", + "sortByColumnAsc": "", + "sortByColumnDesc": "", + "sortedByColumnAsc": "", + "sortedByColumnDesc": "", + "thenBy": "", + "toggleDensity": "", + "toggleFullScreen": "", + "toggleSelectAll": "", + "toggleSelectRow": "", + "toggleVisibility": "", + "ungroupByColumn": "", + "unpin": "", + "unpinAll": "" +} diff --git a/packages/ui/package.json b/packages/ui/package.json index 37767bbac..7489fcdaa 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -29,12 +29,12 @@ "@homarr/log": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", - "@mantine/dates": "^7.16.2", - "@mantine/hooks": "^7.16.2", + "@mantine/core": "^7.16.3", + "@mantine/dates": "^7.16.3", + "@mantine/hooks": "^7.16.3", "@tabler/icons-react": "^3.30.0", "mantine-react-table": "2.0.0-beta.8", - "next": "15.1.6", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0" }, @@ -43,7 +43,7 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", "@types/css-modules": "^1.0.5", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/validation/package.json b/packages/validation/package.json index c5edcc35f..f6ec2ded0 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -25,14 +25,14 @@ "dependencies": { "@homarr/definitions": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", - "zod": "^3.24.1", + "zod": "^3.24.2", "zod-form-data": "^2.0.5" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/validation/src/board.ts b/packages/validation/src/board.ts index 1fd121a95..50b4113c2 100644 --- a/packages/validation/src/board.ts +++ b/packages/validation/src/board.ts @@ -58,6 +58,7 @@ const savePartialSettingsSchema = z opacity: z.number().min(0).max(100), customCss: z.string().max(16384), columnCount: z.number().min(1).max(24), + disableStatus: z.boolean(), }) .partial(); diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index 99464364e..91eae05eb 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -7,7 +7,8 @@ import type { TranslationObject } from "@homarr/translation"; import { zodEnumFromArray } from "./enums"; import { createCustomErrorParams } from "./form/i18n"; -const usernameSchema = z.string().min(3).max(255); +// We always want the lowercase version of the username to compare it in a case-insensitive way +const usernameSchema = z.string().trim().toLowerCase().min(3).max(255); const regexCheck = (regex: RegExp) => (value: string) => regex.test(value); export const passwordRequirements = [ diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 045d00927..63eb9e645 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -28,6 +28,7 @@ "@dnd-kit/sortable": "^10.0.0", "@homarr/api": "workspace:^0.1.0", "@homarr/auth": "workspace:^0.1.0", + "@homarr/boards": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/db": "workspace:^0.1.0", "@homarr/definitions": "workspace:^0.1.0", @@ -36,13 +37,14 @@ "@homarr/modals": "workspace:^0.1.0", "@homarr/notifications": "workspace:^0.1.0", "@homarr/redis": "workspace:^0.1.0", + "@homarr/server-settings": "workspace:^0.1.0", "@homarr/settings": "workspace:^0.1.0", "@homarr/spotlight": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/core": "^7.16.2", - "@mantine/hooks": "^7.16.2", + "@mantine/core": "^7.16.3", + "@mantine/hooks": "^7.16.3", "@tabler/icons-react": "^3.30.0", "@tiptap/extension-color": "2.11.5", "@tiptap/extension-highlight": "2.11.5", @@ -62,18 +64,18 @@ "clsx": "^2.1.1", "dayjs": "^1.11.13", "mantine-react-table": "2.0.0-beta.8", - "next": "15.1.6", + "next": "15.1.7", "react": "19.0.0", "react-dom": "19.0.0", "video.js": "^8.21.0", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "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.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx index 77039a7af..33e111619 100644 --- a/packages/widgets/src/app/component.tsx +++ b/packages/widgets/src/app/component.tsx @@ -7,6 +7,8 @@ import { IconLoader } from "@tabler/icons-react"; import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; +import { useRequiredBoard } from "@homarr/boards/context"; +import { useSettings } from "@homarr/settings"; import { useRegisterSpotlightContextResults } from "@homarr/spotlight"; import { useI18n } from "@homarr/translation/client"; @@ -17,6 +19,8 @@ import { PingIndicator } from "./ping/ping-indicator"; export default function AppWidget({ options, isEditMode }: WidgetComponentProps<"app">) { const t = useI18n(); + const settings = useSettings(); + const board = useRequiredBoard(); const [app] = clientApi.app.byId.useSuspenseQuery( { id: options.appId, @@ -81,7 +85,7 @@ export default function AppWidget({ options, isEditMode }: WidgetComponentProps< {app.name} - {options.pingEnabled && app.href ? ( + {options.pingEnabled && !settings.forceDisableStatus && !board.disableStatus && app.href ? ( }> diff --git a/packages/widgets/src/app/index.ts b/packages/widgets/src/app/index.ts index 66d7a0ecb..463f7c00b 100644 --- a/packages/widgets/src/app/index.ts +++ b/packages/widgets/src/app/index.ts @@ -5,13 +5,24 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("app", { icon: IconApps, - options: optionsBuilder.from((factory) => ({ - appId: factory.app(), - openInNewTab: factory.switch({ defaultValue: true }), - showTitle: factory.switch({ defaultValue: true }), - showDescriptionTooltip: factory.switch({ defaultValue: false }), - pingEnabled: factory.switch({ defaultValue: false }), - })), + createOptions(settings) { + return optionsBuilder.from( + (factory) => ({ + appId: factory.app(), + openInNewTab: factory.switch({ defaultValue: true }), + showTitle: factory.switch({ defaultValue: true }), + showDescriptionTooltip: factory.switch({ defaultValue: false }), + pingEnabled: factory.switch({ defaultValue: settings.enableStatusByDefault }), + }), + { + pingEnabled: { + shouldHide() { + return settings.forceDisableStatus; + }, + }, + }, + ); + }, errors: { NOT_FOUND: { icon: IconDeviceDesktopX, diff --git a/packages/widgets/src/bookmarks/index.tsx b/packages/widgets/src/bookmarks/index.tsx index 959a8601d..763b0a3ad 100644 --- a/packages/widgets/src/bookmarks/index.tsx +++ b/packages/widgets/src/bookmarks/index.tsx @@ -10,50 +10,52 @@ import { BookmarkAddButton } from "./add-button"; export const { definition, componentLoader } = createWidgetDefinition("bookmarks", { icon: IconClock, - options: optionsBuilder.from((factory) => ({ - title: factory.text(), - layout: factory.select({ - options: (["grid", "row", "column"] as const).map((value) => ({ - value, - label: (t) => t(`widget.bookmarks.option.layout.option.${value}.label`), - })), - defaultValue: "column", - }), - hideIcon: factory.switch({ defaultValue: false }), - hideHostname: factory.switch({ defaultValue: false }), - openNewTab: factory.switch({ defaultValue: true }), - items: factory.sortableItemList({ - ItemComponent: ({ item, handle: Handle, removeItem, rootAttributes }) => { - return ( - - - + createOptions() { + return optionsBuilder.from((factory) => ({ + title: factory.text(), + layout: factory.select({ + options: (["grid", "row", "column"] as const).map((value) => ({ + value, + label: (t) => t(`widget.bookmarks.option.layout.option.${value}.label`), + })), + defaultValue: "column", + }), + hideIcon: factory.switch({ defaultValue: false }), + hideHostname: factory.switch({ defaultValue: false }), + openNewTab: factory.switch({ defaultValue: true }), + items: factory.sortableItemList({ + ItemComponent: ({ item, handle: Handle, removeItem, rootAttributes }) => { + return ( + + + - - - - {item.name} - + + + + {item.name} + + + + + + + ); + }, + AddButton: BookmarkAddButton, + uniqueIdentifier: (item) => item.id, + useData: (initialIds) => { + const { data, error, isLoading } = clientApi.app.byIds.useQuery(initialIds); - - - - - ); - }, - AddButton: BookmarkAddButton, - uniqueIdentifier: (item) => item.id, - useData: (initialIds) => { - const { data, error, isLoading } = clientApi.app.byIds.useQuery(initialIds); - - return { - data, - error, - isLoading, - }; - }, - }), - })), + return { + data, + error, + isLoading, + }; + }, + }), + })); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/calendar/calender-day.tsx b/packages/widgets/src/calendar/calender-day.tsx index 95303a704..698cfba3a 100644 --- a/packages/widgets/src/calendar/calender-day.tsx +++ b/packages/widgets/src/calendar/calender-day.tsx @@ -1,5 +1,5 @@ +import { useState } from "react"; import { Container, Popover, useMantineTheme } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; import type { CalendarEvent } from "@homarr/integrations/types"; @@ -12,7 +12,7 @@ interface CalendarDayProps { } export const CalendarDay = ({ date, events, disabled }: CalendarDayProps) => { - const [opened, { close, open }] = useDisclosure(false); + const [opened, setOpend] = useState(false); const { primaryColor } = useMantineTheme(); return ( @@ -25,13 +25,12 @@ export const CalendarDay = ({ date, events, disabled }: CalendarDayProps) => { transitionProps={{ transition: "pop", }} - onClose={close} + onChange={setOpend} opened={opened} disabled={disabled} > 0 && !opened ? open : close} h="100%" w="100%" p={0} @@ -40,7 +39,12 @@ export const CalendarDay = ({ date, events, disabled }: CalendarDayProps) => { style={{ alignContent: "center", borderRadius: "3.5cqmin", - cursor: events.length === 0 || disabled ? "default" : "pointer", + cursor: disabled ? "default" : "pointer", + }} + onClick={() => { + if (disabled) return; + + setOpend((prev) => !prev); }} >
Boolean(event.date)); - return ; + return ( + + ); }} /> ); diff --git a/packages/widgets/src/calendar/index.ts b/packages/widgets/src/calendar/index.ts index 333d47a99..275b2d605 100644 --- a/packages/widgets/src/calendar/index.ts +++ b/packages/widgets/src/calendar/index.ts @@ -9,23 +9,25 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("calendar", { icon: IconCalendar, - options: optionsBuilder.from((factory) => ({ - releaseType: factory.multiSelect({ - defaultValue: ["inCinemas", "digitalRelease"], - options: radarrReleaseTypes.map((value) => ({ - value, - label: (t) => t(`widget.calendar.option.releaseType.options.${value}`), - })), - }), - filterPastMonths: factory.number({ - validate: z.number().min(2).max(9999), - defaultValue: 2, - }), - filterFutureMonths: factory.number({ - validate: z.number().min(2).max(9999), - defaultValue: 2, - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + releaseType: factory.multiSelect({ + defaultValue: ["inCinemas", "digitalRelease"], + options: radarrReleaseTypes.map((value) => ({ + value, + label: (t) => t(`widget.calendar.option.releaseType.options.${value}`), + })), + }), + filterPastMonths: factory.number({ + validate: z.number().min(2).max(9999), + defaultValue: 2, + }), + filterFutureMonths: factory.number({ + validate: z.number().min(2).max(9999), + defaultValue: 2, + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("calendar"), integrationsRequired: false, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/clock/index.ts b/packages/widgets/src/clock/index.ts index 47125609c..d80055a89 100644 --- a/packages/widgets/src/clock/index.ts +++ b/packages/widgets/src/clock/index.ts @@ -6,65 +6,67 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("clock", { icon: IconClock, - options: optionsBuilder.from( - (factory) => ({ - customTitleToggle: factory.switch({ - defaultValue: false, - withDescription: true, + createOptions() { + return optionsBuilder.from( + (factory) => ({ + customTitleToggle: factory.switch({ + defaultValue: false, + withDescription: true, + }), + customTitle: factory.text({ + defaultValue: "", + }), + is24HourFormat: factory.switch({ + defaultValue: true, + withDescription: true, + }), + showSeconds: factory.switch({ + defaultValue: false, + }), + useCustomTimezone: factory.switch({ defaultValue: false }), + timezone: factory.select({ + options: Intl.supportedValuesOf("timeZone").map((value) => value), + defaultValue: "Europe/London", + searchable: true, + withDescription: true, + }), + showDate: factory.switch({ + defaultValue: true, + }), + dateFormat: factory.select({ + options: [ + { value: "dddd, MMMM D", label: dayjs().format("dddd, MMMM D") }, + { value: "dddd, D MMMM", label: dayjs().format("dddd, D MMMM") }, + { value: "MMM D", label: dayjs().format("MMM D") }, + { value: "D MMM", label: dayjs().format("D MMM") }, + { value: "DD/MM/YYYY", label: dayjs().format("DD/MM/YYYY") }, + { value: "MM/DD/YYYY", label: dayjs().format("MM/DD/YYYY") }, + { value: "DD/MM", label: dayjs().format("DD/MM") }, + { value: "MM/DD", label: dayjs().format("MM/DD") }, + ], + defaultValue: "dddd, MMMM D", + withDescription: true, + }), + customTimeFormat: factory.text({ + defaultValue: "", + withDescription: true, + }), + customDateFormat: factory.text({ + defaultValue: "", + withDescription: true, + }), }), - customTitle: factory.text({ - defaultValue: "", - }), - is24HourFormat: factory.switch({ - defaultValue: true, - withDescription: true, - }), - showSeconds: factory.switch({ - defaultValue: false, - }), - useCustomTimezone: factory.switch({ defaultValue: false }), - timezone: factory.select({ - options: Intl.supportedValuesOf("timeZone").map((value) => value), - defaultValue: "Europe/London", - searchable: true, - withDescription: true, - }), - showDate: factory.switch({ - defaultValue: true, - }), - dateFormat: factory.select({ - options: [ - { value: "dddd, MMMM D", label: dayjs().format("dddd, MMMM D") }, - { value: "dddd, D MMMM", label: dayjs().format("dddd, D MMMM") }, - { value: "MMM D", label: dayjs().format("MMM D") }, - { value: "D MMM", label: dayjs().format("D MMM") }, - { value: "DD/MM/YYYY", label: dayjs().format("DD/MM/YYYY") }, - { value: "MM/DD/YYYY", label: dayjs().format("MM/DD/YYYY") }, - { value: "DD/MM", label: dayjs().format("DD/MM") }, - { value: "MM/DD", label: dayjs().format("MM/DD") }, - ], - defaultValue: "dddd, MMMM D", - withDescription: true, - }), - customTimeFormat: factory.text({ - defaultValue: "", - withDescription: true, - }), - customDateFormat: factory.text({ - defaultValue: "", - withDescription: true, - }), - }), - { - customTitle: { - shouldHide: (options) => !options.customTitleToggle, + { + customTitle: { + shouldHide: (options) => !options.customTitleToggle, + }, + timezone: { + shouldHide: (options) => !options.useCustomTimezone, + }, + dateFormat: { + shouldHide: (options) => !options.showDate, + }, }, - timezone: { - shouldHide: (options) => !options.useCustomTimezone, - }, - dateFormat: { - shouldHide: (options) => !options.showDate, - }, - }, - ), + ); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/definition.ts b/packages/widgets/src/definition.ts index 7ee07ed37..85e2de5ad 100644 --- a/packages/widgets/src/definition.ts +++ b/packages/widgets/src/definition.ts @@ -2,11 +2,13 @@ import type { LoaderComponent } from "next/dynamic"; import type { DefaultErrorData } from "@trpc/server/unstable-core-do-not-import"; import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; +import type { ServerSettings } from "@homarr/server-settings"; +import type { SettingsContextProps } from "@homarr/settings"; import type { stringOrTranslation } from "@homarr/translation"; import type { TablerIcon } from "@homarr/ui"; import type { WidgetImports } from "."; -import type { inferOptionsFromDefinition, WidgetOptionsRecord } from "./options"; +import type { inferOptionsFromCreator, WidgetOptionsRecord } from "./options"; const createWithDynamicImport = (kind: TKind, definition: TDefinition) => @@ -30,7 +32,7 @@ export interface WidgetDefinition { icon: TablerIcon; supportedIntegrations?: IntegrationKind[]; integrationsRequired?: boolean; - options: WidgetOptionsRecord; + createOptions: (settings: SettingsContextProps) => WidgetOptionsRecord; errors?: Partial< Record< DefaultErrorData["code"], @@ -44,7 +46,7 @@ export interface WidgetDefinition { } export interface WidgetProps { - options: inferOptionsFromDefinition>; + options: inferOptionsFromCreator>; integrationIds: string[]; itemId: string | undefined; // undefined when in preview mode } @@ -52,13 +54,19 @@ export interface WidgetProps { export type WidgetComponentProps = WidgetProps & { boardId: string | undefined; // undefined when in preview mode isEditMode: boolean; - setOptions: ({ - newOptions, - }: { - newOptions: Partial>>; - }) => void; + setOptions: ({ newOptions }: { newOptions: Partial>> }) => void; width: number; height: number; }; -export type WidgetOptionsRecordOf = WidgetImports[TKind]["definition"]["options"]; +export type WidgetOptionsRecordOf = WidgetImports[TKind]["definition"]["createOptions"]; + +/** + * The following type should only include values that can be available for user (including anonymous). + * Because they need to be provided to the client to for example set certain default values. + */ +export interface WidgetOptionsSettings { + server: { + board: Pick; + }; +} diff --git a/packages/widgets/src/dns-hole/controls/index.ts b/packages/widgets/src/dns-hole/controls/index.ts index 27f126ee9..50a3c3c80 100644 --- a/packages/widgets/src/dns-hole/controls/index.ts +++ b/packages/widgets/src/dns-hole/controls/index.ts @@ -9,11 +9,13 @@ export const widgetKind = "dnsHoleControls"; export const { definition, componentLoader } = createWidgetDefinition(widgetKind, { icon: IconDeviceGamepad, - options: optionsBuilder.from((factory) => ({ - showToggleAllButtons: factory.switch({ - defaultValue: true, - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + showToggleAllButtons: factory.switch({ + defaultValue: true, + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("dnsHole"), errors: { INTERNAL_SERVER_ERROR: { diff --git a/packages/widgets/src/dns-hole/summary/index.ts b/packages/widgets/src/dns-hole/summary/index.ts index 25246d23f..fe1c8b8a1 100644 --- a/packages/widgets/src/dns-hole/summary/index.ts +++ b/packages/widgets/src/dns-hole/summary/index.ts @@ -9,18 +9,20 @@ export const widgetKind = "dnsHoleSummary"; export const { definition, componentLoader } = createWidgetDefinition(widgetKind, { icon: IconAd, - options: optionsBuilder.from((factory) => ({ - usePiHoleColors: factory.switch({ - defaultValue: true, - }), - layout: factory.select({ - options: (["grid", "row", "column"] as const).map((value) => ({ - value, - label: (t) => t(`widget.dnsHoleSummary.option.layout.option.${value}.label`), - })), - defaultValue: "grid", - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + usePiHoleColors: factory.switch({ + defaultValue: true, + }), + layout: factory.select({ + options: (["grid", "row", "column"] as const).map((value) => ({ + value, + label: (t) => t(`widget.dnsHoleSummary.option.layout.option.${value}.label`), + })), + defaultValue: "grid", + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("dnsHole"), errors: { INTERNAL_SERVER_ERROR: { diff --git a/packages/widgets/src/downloads/index.ts b/packages/widgets/src/downloads/index.ts index c5161463e..e4b8831b6 100644 --- a/packages/widgets/src/downloads/index.ts +++ b/packages/widgets/src/downloads/index.ts @@ -33,76 +33,78 @@ const columnsSort = columnsList.filter((column) => export const { definition, componentLoader } = createWidgetDefinition("downloads", { icon: IconDownload, - options: optionsBuilder.from( - (factory) => ({ - columns: factory.multiSelect({ - defaultValue: ["integration", "name", "progress", "time", "actions"], - options: columnsList.map((value) => ({ - value, - label: (t) => t(`widget.downloads.items.${value}.columnTitle`), - })), - searchable: true, + createOptions() { + return optionsBuilder.from( + (factory) => ({ + columns: factory.multiSelect({ + defaultValue: ["integration", "name", "progress", "time", "actions"], + options: columnsList.map((value) => ({ + value, + label: (t) => t(`widget.downloads.items.${value}.columnTitle`), + })), + searchable: true, + }), + enableRowSorting: factory.switch({ + defaultValue: false, + }), + defaultSort: factory.select({ + defaultValue: "type", + options: columnsSort.map((value) => ({ + value, + label: (t) => t(`widget.downloads.items.${value}.columnTitle`), + })), + }), + descendingDefaultSort: factory.switch({ + defaultValue: false, + }), + showCompletedUsenet: factory.switch({ + defaultValue: true, + }), + showCompletedTorrent: factory.switch({ + defaultValue: true, + }), + activeTorrentThreshold: factory.number({ + //in KiB/s + validate: z.number().min(0), + defaultValue: 0, + step: 1, + }), + categoryFilter: factory.multiText({ + defaultValue: [] as string[], + validate: z.string(), + }), + filterIsWhitelist: factory.switch({ + defaultValue: false, + }), + applyFilterToRatio: factory.switch({ + defaultValue: true, + }), }), - enableRowSorting: factory.switch({ - defaultValue: false, - }), - defaultSort: factory.select({ - defaultValue: "type", - options: columnsSort.map((value) => ({ - value, - label: (t) => t(`widget.downloads.items.${value}.columnTitle`), - })), - }), - descendingDefaultSort: factory.switch({ - defaultValue: false, - }), - showCompletedUsenet: factory.switch({ - defaultValue: true, - }), - showCompletedTorrent: factory.switch({ - defaultValue: true, - }), - activeTorrentThreshold: factory.number({ - //in KiB/s - validate: z.number().min(0), - defaultValue: 0, - step: 1, - }), - categoryFilter: factory.multiText({ - defaultValue: [] as string[], - validate: z.string(), - }), - filterIsWhitelist: factory.switch({ - defaultValue: false, - }), - applyFilterToRatio: factory.switch({ - defaultValue: true, - }), - }), - { - defaultSort: { - shouldHide: (options) => !options.enableRowSorting, + { + defaultSort: { + shouldHide: (options) => !options.enableRowSorting, + }, + descendingDefaultSort: { + shouldHide: (options) => !options.enableRowSorting, + }, + showCompletedUsenet: { + shouldHide: (_, integrationKinds) => + !getIntegrationKindsByCategory("usenet").some((kinds) => integrationKinds.includes(kinds)), + }, + showCompletedTorrent: { + shouldHide: (_, integrationKinds) => + !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), + }, + activeTorrentThreshold: { + shouldHide: (_, integrationKinds) => + !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), + }, + applyFilterToRatio: { + shouldHide: (_, integrationKinds) => + !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), + }, }, - descendingDefaultSort: { - shouldHide: (options) => !options.enableRowSorting, - }, - showCompletedUsenet: { - shouldHide: (_, integrationKinds) => - !getIntegrationKindsByCategory("usenet").some((kinds) => integrationKinds.includes(kinds)), - }, - showCompletedTorrent: { - shouldHide: (_, integrationKinds) => - !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), - }, - activeTorrentThreshold: { - shouldHide: (_, integrationKinds) => - !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), - }, - applyFilterToRatio: { - shouldHide: (_, integrationKinds) => - !getIntegrationKindsByCategory("torrent").some((kinds) => integrationKinds.includes(kinds)), - }, - }, - ), + ); + }, supportedIntegrations: getIntegrationKindsByCategory("downloadClient"), }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/health-monitoring/index.ts b/packages/widgets/src/health-monitoring/index.ts index 2d9c9e895..b3bc28980 100644 --- a/packages/widgets/src/health-monitoring/index.ts +++ b/packages/widgets/src/health-monitoring/index.ts @@ -7,34 +7,36 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("healthMonitoring", { icon: IconHeartRateMonitor, - options: optionsBuilder.from((factory) => ({ - fahrenheit: factory.switch({ - defaultValue: false, - }), - cpu: factory.switch({ - defaultValue: true, - }), - memory: factory.switch({ - defaultValue: true, - }), - fileSystem: factory.switch({ - defaultValue: true, - }), - defaultTab: factory.select({ - defaultValue: "system", - options: [ - { value: "system", label: "System" }, - { value: "cluster", label: "Cluster" }, - ] as const, - }), - sectionIndicatorRequirement: factory.select({ - defaultValue: "all", - options: [ - { value: "all", label: "All active" }, - { value: "any", label: "Any active" }, - ] as const, - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + fahrenheit: factory.switch({ + defaultValue: false, + }), + cpu: factory.switch({ + defaultValue: true, + }), + memory: factory.switch({ + defaultValue: true, + }), + fileSystem: factory.switch({ + defaultValue: true, + }), + defaultTab: factory.select({ + defaultValue: "system", + options: [ + { value: "system", label: "System" }, + { value: "cluster", label: "Cluster" }, + ] as const, + }), + sectionIndicatorRequirement: factory.select({ + defaultValue: "all", + options: [ + { value: "all", label: "All active" }, + { value: "any", label: "Any active" }, + ] as const, + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("healthMonitoring"), errors: { INTERNAL_SERVER_ERROR: { diff --git a/packages/widgets/src/iframe/index.ts b/packages/widgets/src/iframe/index.ts index 97b277ff8..725e1b3fc 100644 --- a/packages/widgets/src/iframe/index.ts +++ b/packages/widgets/src/iframe/index.ts @@ -5,17 +5,19 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("iframe", { icon: IconBrowser, - options: optionsBuilder.from((factory) => ({ - embedUrl: factory.text(), - allowFullScreen: factory.switch(), - allowScrolling: factory.switch({ - defaultValue: true, - }), - allowTransparency: factory.switch(), - allowPayment: factory.switch(), - allowAutoPlay: factory.switch(), - allowMicrophone: factory.switch(), - allowCamera: factory.switch(), - allowGeolocation: factory.switch(), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + embedUrl: factory.text(), + allowFullScreen: factory.switch(), + allowScrolling: factory.switch({ + defaultValue: true, + }), + allowTransparency: factory.switch(), + allowPayment: factory.switch(), + allowAutoPlay: factory.switch(), + allowMicrophone: factory.switch(), + allowCamera: factory.switch(), + allowGeolocation: factory.switch(), + })); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index b041c11ba..e5ca8edf0 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -5,6 +5,7 @@ import { Center, Loader as UiLoader } from "@mantine/core"; import { objectEntries } from "@homarr/common"; import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; +import type { SettingsContextProps } from "@homarr/settings"; import * as app from "./app"; import * as bookmarks from "./bookmarks"; @@ -31,7 +32,7 @@ import * as smartHomeExecuteAutomation from "./smart-home/execute-automation"; import * as video from "./video"; import * as weather from "./weather"; -export type { WidgetDefinition } from "./definition"; +export type { WidgetDefinition, WidgetOptionsSettings } from "./definition"; export type { WidgetComponentProps }; export const widgetImports = { @@ -94,9 +95,13 @@ export type inferSupportedIntegrationsStrict = (Widget ? WidgetImports[TKind]["definition"]["supportedIntegrations"] : never[])[number]; -export const reduceWidgetOptionsWithDefaultValues = (kind: WidgetKind, currentValue: Record = {}) => { +export const reduceWidgetOptionsWithDefaultValues = ( + kind: WidgetKind, + settings: SettingsContextProps, + currentValue: Record = {}, +) => { const definition = widgetImports[kind].definition; - const options = definition.options as Record; + const options = definition.createOptions(settings) as Record; return objectEntries(options).reduce( (prev, [key, value]) => ({ ...prev, diff --git a/packages/widgets/src/indexer-manager/index.ts b/packages/widgets/src/indexer-manager/index.ts index d0539194e..c2160999f 100644 --- a/packages/widgets/src/indexer-manager/index.ts +++ b/packages/widgets/src/indexer-manager/index.ts @@ -7,11 +7,13 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("indexerManager", { icon: IconReportSearch, - options: optionsBuilder.from((factory) => ({ - openIndexerSiteInNewTab: factory.switch({ - defaultValue: true, - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + openIndexerSiteInNewTab: factory.switch({ + defaultValue: true, + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("indexerManager"), errors: { INTERNAL_SERVER_ERROR: { diff --git a/packages/widgets/src/media-requests/list/index.ts b/packages/widgets/src/media-requests/list/index.ts index 93243e0df..8f1a88575 100644 --- a/packages/widgets/src/media-requests/list/index.ts +++ b/packages/widgets/src/media-requests/list/index.ts @@ -7,10 +7,12 @@ import { optionsBuilder } from "../../options"; export const { componentLoader, definition } = createWidgetDefinition("mediaRequests-requestList", { icon: IconZoomQuestion, - options: optionsBuilder.from((factory) => ({ - linksTargetNewTab: factory.switch({ - defaultValue: true, - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + linksTargetNewTab: factory.switch({ + defaultValue: true, + }), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"), }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-requests/stats/index.ts b/packages/widgets/src/media-requests/stats/index.ts index b8504c7d2..25911c894 100644 --- a/packages/widgets/src/media-requests/stats/index.ts +++ b/packages/widgets/src/media-requests/stats/index.ts @@ -6,6 +6,8 @@ import { createWidgetDefinition } from "../../definition"; export const { componentLoader, definition } = createWidgetDefinition("mediaRequests-requestStats", { icon: IconChartBar, - options: {}, + createOptions() { + return {}; + }, supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"), }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-server/index.ts b/packages/widgets/src/media-server/index.ts index f5cd3ad57..5e9fe1f3a 100644 --- a/packages/widgets/src/media-server/index.ts +++ b/packages/widgets/src/media-server/index.ts @@ -4,6 +4,8 @@ import { createWidgetDefinition } from "../definition"; export const { componentLoader, definition } = createWidgetDefinition("mediaServer", { icon: IconVideo, - options: {}, + createOptions() { + return {}; + }, supportedIntegrations: ["jellyfin", "plex"], }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-transcoding/index.ts b/packages/widgets/src/media-transcoding/index.ts index 53e523645..355f3d9d3 100644 --- a/packages/widgets/src/media-transcoding/index.ts +++ b/packages/widgets/src/media-transcoding/index.ts @@ -6,16 +6,18 @@ import { optionsBuilder } from "../options"; export const { componentLoader, definition } = createWidgetDefinition("mediaTranscoding", { icon: IconTransform, - options: optionsBuilder.from((factory) => ({ - defaultView: factory.select({ - defaultValue: "statistics", - options: [ - { label: "Workers", value: "workers" }, - { label: "Queue", value: "queue" }, - { label: "Statistics", value: "statistics" }, - ], - }), - queuePageSize: factory.number({ defaultValue: 10, validate: z.number().min(1).max(30) }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + defaultView: factory.select({ + defaultValue: "statistics", + options: [ + { label: "Workers", value: "workers" }, + { label: "Queue", value: "queue" }, + { label: "Statistics", value: "statistics" }, + ], + }), + queuePageSize: factory.number({ defaultValue: 10, validate: z.number().min(1).max(30) }), + })); + }, supportedIntegrations: ["tdarr"], }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/minecraft/server-status/index.ts b/packages/widgets/src/minecraft/server-status/index.ts index d929f40da..1f258e75c 100644 --- a/packages/widgets/src/minecraft/server-status/index.ts +++ b/packages/widgets/src/minecraft/server-status/index.ts @@ -6,9 +6,11 @@ import { optionsBuilder } from "../../options"; export const { componentLoader, definition } = createWidgetDefinition("minecraftServerStatus", { icon: IconBrandMinecraft, - options: optionsBuilder.from((factory) => ({ - title: factory.text({ defaultValue: "" }), - domain: factory.text({ defaultValue: "hypixel.net", validate: z.string().nonempty() }), - isBedrockServer: factory.switch({ defaultValue: false }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + title: factory.text({ defaultValue: "" }), + domain: factory.text({ defaultValue: "hypixel.net", validate: z.string().nonempty() }), + isBedrockServer: factory.switch({ defaultValue: false }), + })); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/modals/widget-edit-modal.tsx b/packages/widgets/src/modals/widget-edit-modal.tsx index f3d5f6f45..446d8c6c0 100644 --- a/packages/widgets/src/modals/widget-edit-modal.tsx +++ b/packages/widgets/src/modals/widget-edit-modal.tsx @@ -8,6 +8,7 @@ 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"; import { useI18n } from "@homarr/translation/client"; import { zodErrorMap } from "@homarr/validation/form"; @@ -32,6 +33,7 @@ interface ModalProps { onSuccessfulEdit: (value: WidgetEditModalState) => void; integrationData: IntegrationSelectOption[]; integrationSupport: boolean; + settings: SettingsContextProps; } export const WidgetEditModal = createModal>(({ actions, innerProps }) => { @@ -40,13 +42,16 @@ export const WidgetEditModal = createModal>(({ actions, i // Translate the error messages z.setErrorMap(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( z.object({ options: z.object( - objectEntries(widgetImports[innerProps.kind].definition.options).reduce( + objectEntries(options).reduce( (acc, [key, value]: [string, { type: string; validate?: z.ZodType }]) => { if (value.validate) { acc[key] = value.type === "multiText" ? z.array(value.validate).optional() : value.validate; @@ -68,8 +73,6 @@ export const WidgetEditModal = createModal>(({ actions, i }); const { openModal } = useModalAction(WidgetAdvancedOptionsModal); - const { definition } = widgetImports[innerProps.kind]; - return (
{ @@ -89,7 +92,7 @@ export const WidgetEditModal = createModal>(({ actions, i {...form.getInputProps("integrationIds")} /> )} - {Object.entries(definition.options).map(([key, value]: [string, OptionsBuilderResult[string]]) => { + {Object.entries(options).map(([key, value]) => { const Input = getInputForType(value.type); if ( diff --git a/packages/widgets/src/notebook/index.ts b/packages/widgets/src/notebook/index.ts index 5258ee78d..6b85f3e33 100644 --- a/packages/widgets/src/notebook/index.ts +++ b/packages/widgets/src/notebook/index.ts @@ -6,22 +6,24 @@ import { defaultContent } from "./default-content"; export const { definition, componentLoader } = createWidgetDefinition("notebook", { icon: IconNotes, - options: optionsBuilder.from( - (factory) => ({ - showToolbar: factory.switch({ - defaultValue: true, + createOptions() { + return optionsBuilder.from( + (factory) => ({ + showToolbar: factory.switch({ + defaultValue: true, + }), + allowReadOnlyCheck: factory.switch({ + defaultValue: true, + }), + content: factory.text({ + defaultValue: defaultContent, + }), }), - allowReadOnlyCheck: factory.switch({ - defaultValue: true, - }), - content: factory.text({ - defaultValue: defaultContent, - }), - }), - { - content: { - shouldHide: () => true, // Hide the content option as it can be modified in the editor + { + content: { + shouldHide: () => true, // Hide the content option as it can be modified in the editor + }, }, - }, - ), + ); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/options.ts b/packages/widgets/src/options.ts index 20a5330c2..4f74a13a7 100644 --- a/packages/widgets/src/options.ts +++ b/packages/widgets/src/options.ts @@ -149,6 +149,10 @@ export type WidgetOptionType = WidgetOptionDefinition["type"]; export type WidgetOptionOfType = Extract; type inferOptionFromDefinition = TDefinition["defaultValue"]; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type inferOptionsFromCreator WidgetOptionsRecord> = + inferOptionsFromDefinition>; export type inferOptionsFromDefinition = { [key in keyof TOptions]: inferOptionFromDefinition; }; diff --git a/packages/widgets/src/rssFeed/index.ts b/packages/widgets/src/rssFeed/index.ts index 267547631..cd6a66c06 100644 --- a/packages/widgets/src/rssFeed/index.ts +++ b/packages/widgets/src/rssFeed/index.ts @@ -12,21 +12,23 @@ import { optionsBuilder } from "../options"; */ export const { definition, componentLoader } = createWidgetDefinition("rssFeed", { icon: IconRss, - options: optionsBuilder.from((factory) => ({ - feedUrls: factory.multiText({ - defaultValue: [], - validate: z.string().url(), - }), - enableRtl: factory.switch({ - defaultValue: false, - }), - textLinesClamp: factory.number({ - defaultValue: 5, - validate: z.number().min(1).max(50), - }), - maximumAmountPosts: factory.number({ - defaultValue: 100, - validate: z.number().min(1).max(9999), - }), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + feedUrls: factory.multiText({ + defaultValue: [], + validate: z.string().url(), + }), + enableRtl: factory.switch({ + defaultValue: false, + }), + textLinesClamp: factory.number({ + defaultValue: 5, + validate: z.number().min(1).max(50), + }), + maximumAmountPosts: factory.number({ + defaultValue: 100, + validate: z.number().min(1).max(9999), + }), + })); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/smart-home/entity-state/index.ts b/packages/widgets/src/smart-home/entity-state/index.ts index 4bfdaaaff..a4dd32921 100644 --- a/packages/widgets/src/smart-home/entity-state/index.ts +++ b/packages/widgets/src/smart-home/entity-state/index.ts @@ -7,15 +7,17 @@ import { optionsBuilder } from "../../options"; export const { definition, componentLoader } = createWidgetDefinition("smartHome-entityState", { icon: IconBinaryTree, - options: optionsBuilder.from((factory) => ({ - entityId: factory.text({ - defaultValue: "sun.sun", - }), - displayName: factory.text({ - defaultValue: "Sun", - }), - entityUnit: factory.text(), - clickable: factory.switch(), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + entityId: factory.text({ + defaultValue: "sun.sun", + }), + displayName: factory.text({ + defaultValue: "Sun", + }), + entityUnit: factory.text(), + clickable: factory.switch(), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("smartHomeServer"), }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/smart-home/execute-automation/index.ts b/packages/widgets/src/smart-home/execute-automation/index.ts index 96c6f8394..ea957fab9 100644 --- a/packages/widgets/src/smart-home/execute-automation/index.ts +++ b/packages/widgets/src/smart-home/execute-automation/index.ts @@ -7,9 +7,11 @@ import { optionsBuilder } from "../../options"; export const { definition, componentLoader } = createWidgetDefinition("smartHome-executeAutomation", { icon: IconBinaryTree, - options: optionsBuilder.from((factory) => ({ - displayName: factory.text(), - automationId: factory.text(), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + displayName: factory.text(), + automationId: factory.text(), + })); + }, supportedIntegrations: getIntegrationKindsByCategory("smartHomeServer"), }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/test/translation.spec.ts b/packages/widgets/src/test/translation.spec.ts index 967c5de85..70a6721b8 100644 --- a/packages/widgets/src/test/translation.spec.ts +++ b/packages/widgets/src/test/translation.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { objectEntries } from "@homarr/common"; +import type { SettingsContextProps } from "@homarr/settings"; import { createLanguageMapping } from "@homarr/translation"; import { widgetImports } from ".."; @@ -8,26 +9,25 @@ import { widgetImports } from ".."; describe("Widget properties with description should have matching translations", async () => { const enTranslation = await createLanguageMapping().en(); objectEntries(widgetImports).forEach(([key, value]) => { - Object.entries(value.definition.options).forEach( - ([optionKey, optionValue]: [string, { withDescription?: boolean }]) => { - it(`should have matching translations for ${optionKey} option description of ${key} widget`, () => { - const option = enTranslation.default.widget[key].option; - if (!(optionKey in option)) { - throw new Error(`Option ${optionKey} not found in translation`); - } - const value = option[optionKey as keyof typeof option]; + Object.entries(value.definition.createOptions({} as SettingsContextProps)).forEach(([optionKey, optionValue_]) => { + const optionValue = optionValue_ as { withDescription: boolean }; + it(`should have matching translations for ${optionKey} option description of ${key} widget`, () => { + const option = enTranslation.default.widget[key].option; + if (!(optionKey in option)) { + throw new Error(`Option ${optionKey} not found in translation`); + } + const value = option[optionKey as keyof typeof option]; - expect("description" in value).toBe(optionValue.withDescription); - }); - }, - ); + expect("description" in value).toBe(optionValue.withDescription); + }); + }); }); }); describe("Widget properties should have matching name translations", async () => { const enTranslation = await createLanguageMapping().en(); objectEntries(widgetImports).forEach(([key, value]) => { - Object.keys(value.definition.options).forEach((optionKey) => { + Object.keys(value.definition.createOptions({} as SettingsContextProps)).forEach((optionKey) => { it(`should have matching translations for ${optionKey} option name of ${key} widget`, () => { const option = enTranslation.default.widget[key].option; if (!(optionKey in option)) { diff --git a/packages/widgets/src/video/index.ts b/packages/widgets/src/video/index.ts index 616ca62ba..d35a83dd5 100644 --- a/packages/widgets/src/video/index.ts +++ b/packages/widgets/src/video/index.ts @@ -5,16 +5,18 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("video", { icon: IconDeviceCctv, - options: optionsBuilder.from((factory) => ({ - feedUrl: factory.text({ - defaultValue: "", - }), - hasAutoPlay: factory.switch({ - withDescription: true, - }), - isMuted: factory.switch({ - defaultValue: true, - }), - hasControls: factory.switch(), - })), + createOptions() { + return optionsBuilder.from((factory) => ({ + feedUrl: factory.text({ + defaultValue: "", + }), + hasAutoPlay: factory.switch({ + withDescription: true, + }), + isMuted: factory.switch({ + defaultValue: true, + }), + hasControls: factory.switch(), + })); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/weather/index.ts b/packages/widgets/src/weather/index.ts index 96bb83031..e120c5783 100644 --- a/packages/widgets/src/weather/index.ts +++ b/packages/widgets/src/weather/index.ts @@ -7,47 +7,49 @@ import { optionsBuilder } from "../options"; export const { definition, componentLoader } = createWidgetDefinition("weather", { icon: IconCloud, - options: optionsBuilder.from( - (factory) => ({ - isFormatFahrenheit: factory.switch(), - disableTemperatureDecimals: factory.switch(), - showCurrentWindSpeed: factory.switch({ withDescription: true }), - location: factory.location({ - defaultValue: { - name: "Paris", - latitude: 48.85341, - longitude: 2.3488, - }, + createOptions() { + return optionsBuilder.from( + (factory) => ({ + isFormatFahrenheit: factory.switch(), + disableTemperatureDecimals: factory.switch(), + showCurrentWindSpeed: factory.switch({ withDescription: true }), + location: factory.location({ + defaultValue: { + name: "Paris", + latitude: 48.85341, + longitude: 2.3488, + }, + }), + dateFormat: factory.select({ + options: [ + { value: "dddd, MMMM D", label: dayjs().format("dddd, MMMM D") }, + { value: "dddd, D MMMM", label: dayjs().format("dddd, D MMMM") }, + { value: "MMM D", label: dayjs().format("MMM D") }, + { value: "D MMM", label: dayjs().format("D MMM") }, + { value: "DD/MM/YYYY", label: dayjs().format("DD/MM/YYYY") }, + { value: "MM/DD/YYYY", label: dayjs().format("MM/DD/YYYY") }, + { value: "DD/MM", label: dayjs().format("DD/MM") }, + { value: "MM/DD", label: dayjs().format("MM/DD") }, + ], + defaultValue: "dddd, MMMM D", + withDescription: true, + }), + showCity: factory.switch(), + hasForecast: factory.switch(), + forecastDayCount: factory.slider({ + defaultValue: 5, + validate: z.number().min(1).max(7), + step: 1, + withDescription: true, + }), }), - dateFormat: factory.select({ - options: [ - { value: "dddd, MMMM D", label: dayjs().format("dddd, MMMM D") }, - { value: "dddd, D MMMM", label: dayjs().format("dddd, D MMMM") }, - { value: "MMM D", label: dayjs().format("MMM D") }, - { value: "D MMM", label: dayjs().format("D MMM") }, - { value: "DD/MM/YYYY", label: dayjs().format("DD/MM/YYYY") }, - { value: "MM/DD/YYYY", label: dayjs().format("MM/DD/YYYY") }, - { value: "DD/MM", label: dayjs().format("DD/MM") }, - { value: "MM/DD", label: dayjs().format("MM/DD") }, - ], - defaultValue: "dddd, MMMM D", - withDescription: true, - }), - showCity: factory.switch(), - hasForecast: factory.switch(), - forecastDayCount: factory.slider({ - defaultValue: 5, - validate: z.number().min(1).max(7), - step: 1, - withDescription: true, - }), - }), - { - forecastDayCount: { - shouldHide({ hasForecast }) { - return !hasForecast; + { + forecastDayCount: { + shouldHide({ hasForecast }) { + return !hasForecast; + }, }, }, - }, - ), + ); + }, }).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/tsconfig.json b/packages/widgets/tsconfig.json index cbe8483d9..e205abceb 100644 --- a/packages/widgets/tsconfig.json +++ b/packages/widgets/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" }, - "include": ["*.ts", "src"], + "include": ["*.ts", "src", "*.tsx"], "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e044fb4c0..235e22592 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ overrides: patchedDependencies: pretty-print-error: - hash: 4arrfgbz7em6s4gqywse7esg4u + hash: d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d path: patches/pretty-print-error.patch importers: @@ -21,28 +21,28 @@ importers: version: link:tooling/prettier '@semantic-release/changelog': specifier: ^6.0.3 - version: 6.0.3(semantic-release@24.2.1(typescript@5.7.3)) + version: 6.0.3(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/commit-analyzer': specifier: ^13.0.1 - version: 13.0.1(semantic-release@24.2.1(typescript@5.7.3)) + version: 13.0.1(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/git': specifier: ^10.0.1 - version: 10.0.1(semantic-release@24.2.1(typescript@5.7.3)) + version: 10.0.1(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/github': specifier: ^11.0.1 - version: 11.0.1(semantic-release@24.2.1(typescript@5.7.3)) + version: 11.0.1(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/npm': specifier: ^12.0.1 - version: 12.0.1(semantic-release@24.2.1(typescript@5.7.3)) + version: 12.0.1(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/release-notes-generator': specifier: ^14.0.3 - version: 14.0.3(semantic-release@24.2.1(typescript@5.7.3)) + version: 14.0.3(semantic-release@24.2.2(typescript@5.7.3)) '@turbo/gen': - specifier: ^2.4.0 - version: 2.4.0(@types/node@22.13.1)(typescript@5.7.3) + specifier: ^2.4.2 + version: 2.4.2(@types/node@22.13.4)(typescript@5.7.3) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + version: 4.3.4(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/coverage-v8': specifier: ^3.0.5 version: 3.0.5(vitest@3.0.5) @@ -62,23 +62,23 @@ importers: specifier: ^3.4.2 version: 3.4.2 semantic-release: - specifier: ^24.2.1 - version: 24.2.1(typescript@5.7.3) + specifier: ^24.2.2 + version: 24.2.2(typescript@5.7.3) testcontainers: specifier: ^10.18.0 version: 10.18.0 turbo: - specifier: ^2.4.0 - version: 2.4.0 + specifier: ^2.4.2 + version: 2.4.2 typescript: specifier: ^5.7.3 version: 5.7.3 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + version: 5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) vitest: specifier: ^3.0.5 - version: 3.0.5(@types/node@22.13.1)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + version: 3.0.5(@types/node@22.13.4)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) apps/nextjs: dependencies: @@ -91,6 +91,9 @@ importers: '@homarr/auth': specifier: workspace:^0.1.0 version: link:../../packages/auth + '@homarr/boards': + specifier: workspace:^0.1.0 + version: link:../../packages/boards '@homarr/certificates': specifier: workspace:^0.1.0 version: link:../../packages/certificates @@ -164,29 +167,29 @@ importers: specifier: workspace:^0.1.0 version: link:../../packages/widgets '@mantine/colors-generator': - specifier: ^7.16.2 - version: 7.16.2(chroma-js@3.1.2) + specifier: ^7.16.3 + version: 7.16.3(chroma-js@3.1.2) '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/dropzone': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) '@mantine/modals': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/tiptap': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tiptap/extension-link@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tiptap/extension-link@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@million/lint': specifier: 1.0.14 version: 1.0.14(rollup@4.21.3)(webpack-sources@3.2.3) '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.7.3)(zod@3.24.1) + version: 0.12.0(typescript@5.7.3)(zod@3.24.2) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) @@ -198,19 +201,19 @@ importers: version: 5.66.0(@tanstack/react-query@5.66.0(react@19.0.0))(react@19.0.0) '@tanstack/react-query-next-experimental': specifier: ^5.66.0 - version: 5.66.0(@tanstack/react-query@5.66.0(react@19.0.0))(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0) + version: 5.66.0(@tanstack/react-query@5.66.0(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0) '@trpc/client': specifier: next - version: 11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3) + version: 11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3) '@trpc/next': specifier: next - version: 11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/react-query': specifier: next - version: 11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/server': specifier: next - version: 11.0.0-rc.744(typescript@5.7.3) + version: 11.0.0-rc.768(typescript@5.7.3) '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -239,14 +242,14 @@ importers: specifier: ^11.0.1 version: 11.0.1 jotai: - specifier: ^2.11.3 - version: 2.11.3(@types/react@19.0.8)(react@19.0.0) + specifier: ^2.12.0 + version: 2.12.0(@types/react@19.0.8)(react@19.0.0) mantine-react-table: specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.0.0-beta.8(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) postcss-preset-mantine: specifier: ^1.17.0 version: 1.17.0(postcss@8.4.47) @@ -266,8 +269,8 @@ importers: specifier: ^0.14.1 version: 0.14.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: - specifier: ^1.84.0 - version: 1.84.0 + specifier: ^1.85.0 + version: 1.85.0 superjson: specifier: 2.2.2 version: 2.2.2 @@ -278,8 +281,8 @@ importers: specifier: ^1.8.1 version: 1.8.1(react@19.0.0) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -294,8 +297,8 @@ importers: specifier: 3.1.1 version: 3.1.1 '@types/node': - specifier: ^22.13.1 - version: 22.13.1 + specifier: ^22.13.4 + version: 22.13.4 '@types/prismjs': specifier: ^1.26.5 version: 1.26.5 @@ -312,8 +315,8 @@ importers: specifier: ^9.1.2 version: 9.1.2 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 node-loader: specifier: ^2.1.0 version: 2.1.0(webpack@5.94.0) @@ -394,14 +397,14 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript '@types/node': - specifier: ^22.13.1 - version: 22.13.1 + specifier: ^22.13.4 + version: 22.13.4 dotenv-cli: specifier: ^8.0.0 version: 8.0.0 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -461,8 +464,8 @@ importers: specifier: ^8.5.14 version: 8.5.14 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -498,8 +501,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -565,22 +568,22 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3) + version: 11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3) '@trpc/react-query': specifier: next - version: 11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@trpc/server': specifier: next - version: 11.0.0-rc.744(typescript@5.7.3) + version: 11.0.0-rc.768(typescript@5.7.3) lodash.clonedeep: specifier: ^4.5.0 version: 4.5.0 next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) pretty-print-error: specifier: ^1.1.2 - version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) + version: 1.1.2(patch_hash=d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d) react: specifier: 19.0.0 version: 19.0.0 @@ -592,10 +595,10 @@ importers: version: 2.2.2 trpc-to-openapi: specifier: ^2.1.3 - version: 2.1.3(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1) + version: 2.1.3(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.2))(zod@3.24.2) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -607,8 +610,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -641,7 +644,7 @@ importers: version: link:../validation '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.7.3)(zod@3.24.1) + version: 0.12.0(typescript@5.7.3)(zod@3.24.2) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -652,14 +655,14 @@ importers: specifier: 7.3.1 version: 7.3.1 next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) next-auth: specifier: 5.0.0-beta.25 - version: 5.0.0-beta.25(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0) + version: 5.0.0-beta.25(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0) pretty-print-error: specifier: ^1.1.2 - version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) + version: 1.1.2(patch_hash=d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d) react: specifier: 19.0.0 version: 19.0.0 @@ -667,8 +670,8 @@ importers: specifier: 19.0.0 version: 19.0.0(react@19.0.0) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -686,8 +689,8 @@ importers: specifier: 0.9.0 version: 0.9.0 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -695,6 +698,34 @@ importers: specifier: ^5.7.3 version: 5.7.3 + packages/boards: + dependencies: + '@homarr/api': + specifier: workspace:^0.1.0 + version: link:../api + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@homarr/eslint-config': + specifier: workspace:^0.2.0 + version: link:../../tooling/eslint + '@homarr/prettier-config': + specifier: workspace:^0.1.0 + version: link:../../tooling/prettier + '@homarr/tsconfig': + specifier: workspace:^0.1.0 + version: link:../../tooling/typescript + eslint: + specifier: ^9.20.1 + version: 9.20.1 + typescript: + specifier: ^5.7.3 + version: 5.7.3 + packages/certificates: dependencies: '@homarr/common': @@ -714,8 +745,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -748,8 +779,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -763,8 +794,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -775,8 +806,8 @@ importers: specifier: 7.3.0 version: 7.3.0 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -788,8 +819,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -816,8 +847,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -838,8 +869,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -908,8 +939,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -936,8 +967,8 @@ importers: specifier: ^3.0.11 version: 3.0.11 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -964,7 +995,7 @@ importers: version: 2.2.2 '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.7.3)(zod@3.24.1) + version: 0.12.0(typescript@5.7.3)(zod@3.24.2) '@testcontainers/mysql': specifier: ^10.18.0 version: 10.18.0 @@ -978,11 +1009,11 @@ importers: specifier: ^0.30.4 version: 0.30.4 drizzle-orm: - specifier: ^0.39.2 - version: 0.39.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.8)(better-sqlite3@11.8.1)(mysql2@3.12.0)(react@19.0.0) + specifier: ^0.39.3 + version: 0.39.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(mysql2@3.12.0) drizzle-zod: specifier: ^0.7.0 - version: 0.7.0(drizzle-orm@0.39.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.8)(better-sqlite3@11.8.1)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1) + version: 0.7.0(drizzle-orm@0.39.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(mysql2@3.12.0))(zod@3.24.2) mysql2: specifier: 3.12.0 version: 3.12.0 @@ -1003,8 +1034,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 prettier: specifier: ^3.4.2 version: 3.4.2 @@ -1031,8 +1062,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1044,7 +1075,7 @@ importers: version: link:../common '@t3-oss/env-nextjs': specifier: ^0.12.0 - version: 0.12.0(typescript@5.7.3)(zod@3.24.1) + version: 0.12.0(typescript@5.7.3)(zod@3.24.2) dockerode: specifier: ^4.0.4 version: 4.0.4 @@ -1062,8 +1093,8 @@ importers: specifier: ^3.3.34 version: 3.3.34 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1080,11 +1111,11 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/form': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1096,8 +1127,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1124,8 +1155,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1136,8 +1167,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 '@ctrl/qbittorrent': - specifier: ^9.2.0 - version: 9.2.0 + specifier: ^9.4.0 + version: 9.4.0 '@ctrl/transmission': specifier: ^7.2.0 version: 7.2.0 @@ -1178,8 +1209,8 @@ importers: specifier: ^0.6.2 version: 0.6.2 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1194,8 +1225,8 @@ importers: specifier: ^0.4.14 version: 0.4.14 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1222,8 +1253,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1237,11 +1268,11 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1256,8 +1287,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1295,8 +1326,8 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) @@ -1304,8 +1335,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1313,8 +1344,8 @@ importers: specifier: 19.0.0 version: 19.0.0(react@19.0.0) zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1326,8 +1357,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1338,8 +1369,8 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/notifications': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) @@ -1354,8 +1385,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1396,17 +1427,17 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) adm-zip: specifier: 0.5.16 version: 0.5.16 next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1417,11 +1448,11 @@ importers: specifier: 2.2.2 version: 2.2.2 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 zod-form-data: specifier: ^2.0.5 - version: 2.0.5(zod@3.24.1) + version: 2.0.5(zod@3.24.2) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1436,8 +1467,8 @@ importers: specifier: 0.5.7 version: 0.5.7 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1448,8 +1479,8 @@ importers: specifier: workspace:^0.1.0 version: link:../common zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1461,8 +1492,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1480,7 +1511,7 @@ importers: version: link:../log pretty-print-error: specifier: ^1.1.2 - version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) + version: 1.1.2(patch_hash=d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1492,8 +1523,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1529,8 +1560,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1538,8 +1569,8 @@ importers: packages/request-handler: dependencies: '@extractus/feed-extractor': - specifier: 7.1.3 - version: 7.1.3 + specifier: 7.1.4 + version: 7.1.4 '@homarr/common': specifier: workspace:^0.1.0 version: link:../common @@ -1566,7 +1597,7 @@ importers: version: 4.1.1 pretty-print-error: specifier: ^1.1.2 - version: 1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u) + version: 1.1.2(patch_hash=d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d) superjson: specifier: 2.2.2 version: 2.2.2 @@ -1581,8 +1612,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1606,8 +1637,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1624,11 +1655,11 @@ importers: specifier: workspace:^0.1.0 version: link:../server-settings '@mantine/dates': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1646,8 +1677,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1685,23 +1716,23 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) '@mantine/spotlight': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) jotai: - specifier: ^2.11.3 - version: 2.11.3(@types/react@19.0.8)(react@19.0.0) + specifier: ^2.12.0 + version: 2.12.0(@types/react@19.0.8)(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1722,8 +1753,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1744,13 +1775,13 @@ importers: version: 4.3.1 mantine-react-table: specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.0.0-beta.8(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) next-intl: specifier: 3.26.3 - version: 3.26.3(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0) + version: 3.26.3(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1768,8 +1799,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1792,23 +1823,23 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/dates': - specifier: ^7.16.2 - version: 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) mantine-react-table: specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.0.0-beta.8(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1829,8 +1860,8 @@ importers: specifier: ^1.0.5 version: 1.0.5 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1844,11 +1875,11 @@ importers: specifier: workspace:^0.1.0 version: link:../translation zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 zod-form-data: specifier: ^2.0.5 - version: 2.0.5(zod@3.24.1) + version: 2.0.5(zod@3.24.2) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1860,8 +1891,8 @@ importers: specifier: workspace:^0.1.0 version: link:../../tooling/typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -1880,6 +1911,9 @@ importers: '@homarr/auth': specifier: workspace:^0.1.0 version: link:../auth + '@homarr/boards': + specifier: workspace:^0.1.0 + version: link:../boards '@homarr/common': specifier: workspace:^0.1.0 version: link:../common @@ -1904,6 +1938,9 @@ importers: '@homarr/redis': specifier: workspace:^0.1.0 version: link:../redis + '@homarr/server-settings': + specifier: workspace:^0.1.0 + version: link:../server-settings '@homarr/settings': specifier: workspace:^0.1.0 version: link:../settings @@ -1920,11 +1957,11 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.16.2 - version: 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@mantine/hooks': - specifier: ^7.16.2 - version: 7.16.2(react@19.0.0) + specifier: ^7.16.3 + version: 7.16.3(react@19.0.0) '@tabler/icons-react': specifier: ^3.30.0 version: 3.30.0(react@19.0.0) @@ -1981,10 +2018,10 @@ importers: version: 1.11.13 mantine-react-table: specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.0.0-beta.8(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: - specifier: 15.1.6 - version: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + specifier: 15.1.7 + version: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -1995,8 +2032,8 @@ importers: specifier: ^8.21.0 version: 8.21.0 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2011,8 +2048,8 @@ importers: specifier: ^7.3.58 version: 7.3.58 eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -2020,29 +2057,29 @@ importers: tooling/eslint: dependencies: '@next/eslint-plugin-next': - specifier: ^15.1.6 - version: 15.1.6 + specifier: ^15.1.7 + version: 15.1.7 eslint-config-prettier: specifier: ^10.0.1 - version: 10.0.1(eslint@9.19.0) + version: 10.0.1(eslint@9.20.1) eslint-config-turbo: - specifier: ^2.4.0 - version: 2.4.0(eslint@9.19.0)(turbo@2.4.0) + specifier: ^2.4.2 + version: 2.4.2(eslint@9.20.1)(turbo@2.4.2) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) + version: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.19.0) + version: 6.10.2(eslint@9.20.1) eslint-plugin-react: specifier: ^7.37.4 - version: 7.37.4(eslint@9.19.0) + version: 7.37.4(eslint@9.20.1) eslint-plugin-react-hooks: specifier: ^5.1.0 - version: 5.1.0(eslint@9.19.0) + version: 5.1.0(eslint@9.20.1) typescript-eslint: - specifier: ^8.23.0 - version: 8.23.0(eslint@9.19.0)(typescript@5.7.3) + specifier: ^8.24.0 + version: 8.24.0(eslint@9.20.1)(typescript@5.7.3) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -2051,8 +2088,8 @@ importers: specifier: workspace:^0.1.0 version: link:../typescript eslint: - specifier: ^9.19.0 - version: 9.19.0 + specifier: ^9.20.1 + version: 9.20.1 typescript: specifier: ^5.7.3 version: 5.7.3 @@ -2284,8 +2321,8 @@ packages: resolution: {integrity: sha512-wENP7LH4BmCjz+gXVq7Nzz20zMjY/huuG7aDk/yu/LhFdC84e/l8222rCIAo0lwhU451lFcJKLcOmtG6TNrBAQ==} engines: {node: '>=18'} - '@ctrl/qbittorrent@9.2.0': - resolution: {integrity: sha512-95hcrot7lRPZ/HpDwjDS0qNIDBk015uPX/RastT1AWFGWfZmN/TijUfvwEXHHh6lHziZE2pdT2NQMgvrE1Gg4g==} + '@ctrl/qbittorrent@9.4.0': + resolution: {integrity: sha512-oyxeUed82WED+l36C+2SCKGJEU3quTgH/EYl4kAnwID95dDbfd3UDyTYdsg8OqrDpUPKs7+JI2Gn9hJaPh3lAA==} engines: {node: '>=18'} '@ctrl/shared-torrent@6.2.1': @@ -3050,12 +3087,16 @@ packages: resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.11.0': + resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.19.0': - resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} + '@eslint/js@9.20.0': + resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -3066,8 +3107,8 @@ packages: resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@extractus/feed-extractor@7.1.3': - resolution: {integrity: sha512-USRVpGw4fWlnz8O8gB95UDJJaU5wg2EFESDe9nut0mHFJ8bOxDKGoo3g6EaKU24YzaPUBweKENdEJfuTUgr/uA==} + '@extractus/feed-extractor@7.1.4': + resolution: {integrity: sha512-DyB0WXKAX2TAa8Wsv/6GUbMWveUOF1WI2qQTJIhs49P0VKQ7PUoUB08RNZo/8Emc/9ZLvtRGGe4LkpgxjzdqYg==} engines: {node: '>= 18'} '@fastify/busboy@2.1.1': @@ -3316,79 +3357,79 @@ packages: '@libsql/core@0.14.0': resolution: {integrity: sha512-nhbuXf7GP3PSZgdCY2Ecj8vz187ptHlZQ0VRc751oB2C1W8jQUXKKklvt7t1LJiUTQBVJuadF628eUk+3cRi4Q==} - '@mantine/colors-generator@7.16.2': - resolution: {integrity: sha512-IZFKqZr5bG9/otmpq3EVTmZ7JyWEUcoCTB5yHNoKxGBAP3oR92K0sDGwPmiLrOSbLi1joUJ4YhCouUOSmEP39Q==} + '@mantine/colors-generator@7.16.3': + resolution: {integrity: sha512-xD94h02a197xDyd/IE3MPADefGCgjI20tKF6CV4mZf+WR8A/GhDLT0CL2O84B/2jN0ZHEHU5v9Gdp47qPLb4kg==} peerDependencies: chroma-js: '>=2.4.2' - '@mantine/core@7.16.2': - resolution: {integrity: sha512-6dwFz+8HrOqFan7GezgpoWyZSCxedh10S8iILGVsc3GXiD4gzo+3VZndZKccktkYZ3GVC9E3cCS3SxbiyKSAVw==} + '@mantine/core@7.16.3': + resolution: {integrity: sha512-cxhIpfd2i0Zmk9TKdejYAoIvWouMGhzK3OOX+VRViZ5HEjnTQCGl2h3db56ThqB6NfVPCno6BPbt5lwekTtmuQ==} peerDependencies: - '@mantine/hooks': 7.16.2 + '@mantine/hooks': 7.16.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/dates@7.16.2': - resolution: {integrity: sha512-TmAEqMwC1wKpQnxgfDQK7Ao3p9SdSAYbm2orN9wqzDiqZI9NGepWMa1VJWfykDu4XAkVIjjznAdLOzXpuXhouQ==} + '@mantine/dates@7.16.3': + resolution: {integrity: sha512-YI8aW3GFBmLJz0eu9Q6tFFXaubZIZMccA+6Jla8K8K8KMdx5wEPBrCCOHZnL3r0RcVLhARLa0VEmEyaQB+DTjQ==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 dayjs: '>=1.0.0' react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/dropzone@7.16.2': - resolution: {integrity: sha512-iRZJI/zzRrsSES+dVdqHInXnuxHQ6a7YPBwIP1Td9pBdaVHqF6Nvd/I2OVQSYhseYTxFT5ythdw32wFeCgpRSg==} + '@mantine/dropzone@7.16.3': + resolution: {integrity: sha512-JWKmRMuV0DfgIQWvvtRfokaIopezg2AwxxcXrHs5xxxN1EfiTQWB+aQjz0ISwcAk1gtjLEKHowqsBNbna+BEKw==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/form@7.16.2': - resolution: {integrity: sha512-JZkLbZ7xWAZndPrxObkf10gjHj57x8yvI/vobjDhfWN3zFPTSWmSSF6yBE1FpITseOs3oR03hlkqG6EclK6g+g==} + '@mantine/form@7.16.3': + resolution: {integrity: sha512-GqomUG2Ri5adxYsTU1S5IhKRPcqTG5JkPvMERns8PQAcUz/lvzsnk3wY1v4K5CEbCAdpimle4bSsZTM9g697vg==} peerDependencies: react: ^18.x || ^19.x - '@mantine/hooks@7.16.2': - resolution: {integrity: sha512-ZFHQhDi9T+r6VR5NEeE47gigPPIAHVIKDOCWsCsbCqHc3yz5l8kiO2RdfUmsTKV2KD/AiXnAw4b6pjQEP58GOg==} + '@mantine/hooks@7.16.3': + resolution: {integrity: sha512-B94FBWk5Sc81tAjV+B3dGh/gKzfqzpzVC/KHyBRWOOyJRqeeRbI/FAaJo4zwppyQo1POSl5ArdyjtDRrRIj2SQ==} peerDependencies: react: ^18.x || ^19.x - '@mantine/modals@7.16.2': - resolution: {integrity: sha512-REwAV53Fcz021EE3zLyYdkdFlfG+b24y279Y+eA1jCCH9VMLivXL+gacrox4BcpzREsic9nGVInSNv3VJwPlAQ==} + '@mantine/modals@7.16.3': + resolution: {integrity: sha512-BJuDzRugK6xLbuFTTo8NLJumVvVmSYsNVcEtmlXOWTE3NkDGktBXGKo8V1B0XfJ9/d/rZw7HCE0p4i76MtA+bQ==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/notifications@7.16.2': - resolution: {integrity: sha512-U342XWiiRI1NvOlLsI6PH/pSNe0rxNClJ2w5orvjOMXvaAfDe52mhnzRmtzRxYENp06++3b/G7MjPH+466rF9Q==} + '@mantine/notifications@7.16.3': + resolution: {integrity: sha512-wtEME9kSYfXWYmAmQUZ8c+rwNmhdWRBaW1mlPdQsPkzMqkv4q6yy0IpgwcnuHStSG9EHaQBXazmVxMZJdEAWBQ==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/spotlight@7.16.2': - resolution: {integrity: sha512-KJwnewO9f150X0eTdOfjaKfbBZ6yoRtqQtcx0TyOVSHMTKaNwRfL/T9/kgvLMo5kSKFjOsNHAqQmNm4Nidnn0A==} + '@mantine/spotlight@7.16.3': + resolution: {integrity: sha512-YZOmkNrMm5L/zQMsVmIaTts5avb5tlpMR+T2h23T19KehLRnfBQWWnsMOOqFa3PvadIG+Lzk5fXLRkP6VtmOOg==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 react: ^18.x || ^19.x react-dom: ^18.x || ^19.x - '@mantine/store@7.16.2': - resolution: {integrity: sha512-9dEGLosrYSePlAwhfx3CxTLcWu2M98TtuYnelAiHEdNEkyafirvZxNt4paMoFXLKR1XPm5wdjDK7bdTaE0t7Og==} + '@mantine/store@7.16.3': + resolution: {integrity: sha512-6M2M5+0BrRtnVv+PUmr04tY1RjPqyapaHplo90uK1NMhP/1EIqrwTL9KoEtCNCJ5pog1AQtu0bj0QPbqUvxwLg==} peerDependencies: react: ^18.x || ^19.x - '@mantine/tiptap@7.16.2': - resolution: {integrity: sha512-a5SPQR6rTT/OCs9N4iOS30LZsEX416z06R3tcnVP8wpULfdiXe42g719j2NsRqSRKm4I0zkDsby1FixXqeL+KA==} + '@mantine/tiptap@7.16.3': + resolution: {integrity: sha512-A0KPYhdVF1yVCHGnfiw7Zkc+SYMkq2k3ByV4YDrWLss2G1XpLL9mFsWbhJh1Gqbt+z06xumenDo3eQ1aO/xI0Q==} peerDependencies: - '@mantine/core': 7.16.2 - '@mantine/hooks': 7.16.2 + '@mantine/core': 7.16.3 + '@mantine/hooks': 7.16.3 '@tiptap/extension-link': '>=2.1.12' '@tiptap/react': '>=2.1.12' react: ^18.x || ^19.x @@ -3406,56 +3447,56 @@ packages: resolution: {integrity: sha512-u6/kglVwZRu5+GMmtkNlGLqJVkgTl0TtM+hLa9rBg7pldx+5NG5bk45NvL37uZmAr2Xfa1C6qHb7GrFwfP372g==} hasBin: true - '@next/env@15.1.6': - resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} + '@next/env@15.1.7': + resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==} - '@next/eslint-plugin-next@15.1.6': - resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} + '@next/eslint-plugin-next@15.1.7': + resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==} - '@next/swc-darwin-arm64@15.1.6': - resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} + '@next/swc-darwin-arm64@15.1.7': + resolution: {integrity: sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.6': - resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} + '@next/swc-darwin-x64@15.1.7': + resolution: {integrity: sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.6': - resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} + '@next/swc-linux-arm64-gnu@15.1.7': + resolution: {integrity: sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.6': - resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} + '@next/swc-linux-arm64-musl@15.1.7': + resolution: {integrity: sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.6': - resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} + '@next/swc-linux-x64-gnu@15.1.7': + resolution: {integrity: sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.6': - resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} + '@next/swc-linux-x64-musl@15.1.7': + resolution: {integrity: sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.6': - resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} + '@next/swc-win32-arm64-msvc@15.1.7': + resolution: {integrity: sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.6': - resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} + '@next/swc-win32-x64-msvc@15.1.7': + resolution: {integrity: sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4317,19 +4358,19 @@ packages: tree-sitter: optional: true - '@trpc/client@11.0.0-rc.744': - resolution: {integrity: sha512-ht17ibSyyYcNKFUqhdKyBuOmTtHA+DWEySWhmYkqD/bjervkxhMKSWjZirH1yAtzFtcW0YXshUJRVQ0srV5KqQ==} + '@trpc/client@11.0.0-rc.768': + resolution: {integrity: sha512-eZNNjQQhP6nsr1tniI/84P1SKyh6BjvKNMq0vXKnKFV57El27XTfn6wfmdLNcyL3f24ZmDxm/sMxXlzM+zaG/g==} peerDependencies: - '@trpc/server': 11.0.0-rc.744+972d78b51 + '@trpc/server': 11.0.0-rc.768+de6335c47 typescript: '>=5.7.2' - '@trpc/next@11.0.0-rc.744': - resolution: {integrity: sha512-WvvCbgnZ63b+0ZdhXtywTcT7bQKCsekUHzvYjyS0AFyLiRdh7fmx6kQFTw0cg8HdcPiD8Gjxu+WR0BGIUVQltg==} + '@trpc/next@11.0.0-rc.768': + resolution: {integrity: sha512-e+m17Qzw5vb+XfdEwg2jMc5Ejt6Nc2imG/8JyevfGcqFEiHTQosPj5ASOlVJXV5X2P/F+e0oljWb6/vc6xfFWw==} peerDependencies: '@tanstack/react-query': ^5.59.15 - '@trpc/client': 11.0.0-rc.744+972d78b51 - '@trpc/react-query': 11.0.0-rc.744+972d78b51 - '@trpc/server': 11.0.0-rc.744+972d78b51 + '@trpc/client': 11.0.0-rc.768+de6335c47 + '@trpc/react-query': 11.0.0-rc.768+de6335c47 + '@trpc/server': 11.0.0-rc.768+de6335c47 next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -4340,18 +4381,18 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.744': - resolution: {integrity: sha512-0pz40z9Ci6jlajX6YNpUicQ7UET1IW6z0PaFTt3iYBvQ3qBUdpvW9PYafVK//xOWml2FjaknAGP8LbqXAPlOCw==} + '@trpc/react-query@11.0.0-rc.768': + resolution: {integrity: sha512-9ATcL+jq1dQMDA+Egf0BHx8bf0/2t2Ng+3x338N+y9BvYvxa20vXtlZzv9IogXjaC8dUdKsGCu5MqGy9XaPnmA==} peerDependencies: '@tanstack/react-query': ^5.62.8 - '@trpc/client': 11.0.0-rc.744+972d78b51 - '@trpc/server': 11.0.0-rc.744+972d78b51 + '@trpc/client': 11.0.0-rc.768+de6335c47 + '@trpc/server': 11.0.0-rc.768+de6335c47 react: '>=18.2.0' react-dom: '>=18.2.0' typescript: '>=5.7.2' - '@trpc/server@11.0.0-rc.744': - resolution: {integrity: sha512-iDNdSwrqUGN4stkN8ZyKsVmh4dOtjlHjiFHGOH730CMpoiGlDPl4f4ShpqwQY59u2Vx7YwjVgKdwzEHUraEyrA==} + '@trpc/server@11.0.0-rc.768': + resolution: {integrity: sha512-+2du6a3uZEcQBj1OdT6EfWxa6dw/vqBG37aNR7YReTJ/UOMnheOmI/bskHkbK+x/kAcHPj8YN+/xc01QJDxwXQ==} peerDependencies: typescript: '>=5.7.2' @@ -4370,12 +4411,12 @@ packages: '@tsconfig/svelte@1.0.13': resolution: {integrity: sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA==} - '@turbo/gen@2.4.0': - resolution: {integrity: sha512-MR3uInO+5bozTEPyd+0QLepfGwrE14QOa3eohPb5Vg6pLdw0/G9ZfAodE+b7uiJev0zPPG2Md5jVZhWLEreptA==} + '@turbo/gen@2.4.2': + resolution: {integrity: sha512-iAndpPDVI5GxAd6a2c3WtVhjGeVDBGYml6DV+fLDTrElHc4MtvMa2EeU19mR0RzCscCZbATeAGzDxdnHtuxlJA==} hasBin: true - '@turbo/workspaces@2.4.0': - resolution: {integrity: sha512-WHKtnPoT9fVqS0oWG9P3JeQvNCloz2oZWEsEn2LbGyMSU89isCJ6dKlHxqjfGSNdm8+b1fwT5JuE1AW6uYp1TQ==} + '@turbo/workspaces@2.4.2': + resolution: {integrity: sha512-HdXoW7LxCL+cvoEx8SBdg98o7DupN48hEvoEeUJ08R0ud8cLHCO8/2heyG/X/Y60pY9uxhpwjsmn9l5Dx75uMA==} hasBin: true '@types/adm-zip@0.5.7': @@ -4492,8 +4533,8 @@ packages: '@types/node@18.19.50': resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} - '@types/node@22.13.1': - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/node@22.13.4': + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4566,51 +4607,51 @@ packages: '@types/xml2js@0.4.14': resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - '@typescript-eslint/eslint-plugin@8.23.0': - resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} + '@typescript-eslint/eslint-plugin@8.24.0': + resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.23.0': - resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} + '@typescript-eslint/parser@8.24.0': + resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.23.0': - resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} + '@typescript-eslint/scope-manager@8.24.0': + resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.23.0': - resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} + '@typescript-eslint/type-utils@8.24.0': + resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.23.0': - resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} + '@typescript-eslint/types@8.24.0': + resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.23.0': - resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} + '@typescript-eslint/typescript-estree@8.24.0': + resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.23.0': - resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} + '@typescript-eslint/utils@8.24.0': + resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.23.0': - resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} + '@typescript-eslint/visitor-keys@8.24.0': + resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -5453,8 +5494,8 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true - cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -5716,8 +5757,8 @@ packages: resolution: {integrity: sha512-B2oJN5UkvwwNHscPWXDG5KqAixu7AUzZ3qbe++KU9SsQ+cZWR4DXEPYcvWplyFAno0dhRJECNEhNxiDmFaPGyQ==} hasBin: true - drizzle-orm@0.39.2: - resolution: {integrity: sha512-cuopo+udkKEGGpSxCML9ZRQ43R01zYCTsbqCrb9kJkabx1QEwFlPIFoQfx6E6tuawtiX930Gwyrkwj4inlpzDg==} + drizzle-orm@0.39.3: + resolution: {integrity: sha512-EZ8ZpYvDIvKU9C56JYLOmUskazhad+uXZCTCRN4OnRMsL+xAJ05dv1eCpAG5xzhsm1hqiuC5kAZUCS924u2DTw==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -5732,7 +5773,6 @@ packages: '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' '@types/pg': '*' - '@types/react': '>=18' '@types/sql.js': '*' '@vercel/postgres': '>=0.8.0' '@xata.io/client': '*' @@ -5745,7 +5785,6 @@ packages: pg: '>=8' postgres: '>=3' prisma: '*' - react: '>=18' sql.js: '>=1' sqlite3: '>=5' peerDependenciesMeta: @@ -5775,8 +5814,6 @@ packages: optional: true '@types/pg': optional: true - '@types/react': - optional: true '@types/sql.js': optional: true '@vercel/postgres': @@ -5801,8 +5838,6 @@ packages: optional: true prisma: optional: true - react: - optional: true sql.js: optional: true sqlite3: @@ -5990,8 +6025,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.4.0: - resolution: {integrity: sha512-AiRdy83iwyG4+iMSxXQGUbEClxkGxSlXYH8E2a+0972ao75OWnlDBiiuLMOzDpJubR+QVGC4zonn29AIFCSbFw==} + eslint-config-turbo@2.4.2: + resolution: {integrity: sha512-yPiW5grffSWETp/3bVPUXWQkHfiLoOBb3wuBbM90HlKkLOhggySn9C6/yUccprqRguMgR5OzXIuzDuUnX6bulw==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -6048,8 +6083,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.4.0: - resolution: {integrity: sha512-qCgoRi/OTc1VMxab7+sdKiV1xlkY4qjK9sM+kS7+WogrB1DxLguJSQXvk4HA13SD5VmJsq+8FYOw5q4EUk6Ixg==} + eslint-plugin-turbo@2.4.2: + resolution: {integrity: sha512-67IZtvOFaWDnUmYMV3luRIE1kqL+ok5MxPEsIPUqH2vQggML7jmZFZx/P9jhXAoFH+pViEz5QEzDa2DBLHqzQg==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -6070,8 +6105,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.19.0: - resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} + eslint@9.20.1: + resolution: {integrity: sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -6173,8 +6208,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-xml-parser@4.5.0: - resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==} + fast-xml-parser@4.5.1: + resolution: {integrity: sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==} hasBin: true faster-babel-types@0.1.0: @@ -7027,8 +7062,8 @@ packages: jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} - jotai@2.11.3: - resolution: {integrity: sha512-B/PsewAQ0UOS5e2+TTWegUPQ3SCLPCjPY24LYUjfn2EorGlluTA2dFjVLgF1+xHLjK9Jit3y5mKHyMG3Xq/GZg==} + jotai@2.12.0: + resolution: {integrity: sha512-j5B4NmUw8gbuN7AG4NufWw00rfpm6hexL2CVhKD7juoP2YyD9FEUV5ar921JMvadyrxQhU1NpuKUL3QfsAlVpA==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -7519,8 +7554,8 @@ packages: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - next@15.1.6: - resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} + next@15.1.7: + resolution: {integrity: sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -7586,6 +7621,9 @@ packages: node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + node-fetch-native@1.6.6: + resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -8641,8 +8679,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.84.0: - resolution: {integrity: sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==} + sass@1.85.0: + resolution: {integrity: sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==} engines: {node: '>=14.0.0'} hasBin: true @@ -8660,8 +8698,8 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} - semantic-release@24.2.1: - resolution: {integrity: sha512-z0/3cutKNkLQ4Oy0HTi3lubnjTsdjjgOqmxdPjeYWe6lhFqUPfwslZxRHv3HDZlN4MhnZitb9SLihDkZNxOXfQ==} + semantic-release@24.2.2: + resolution: {integrity: sha512-f1PLgDKbSrZ1i1jFgHO/qJavv0SSZgahJdusPH0eUkWXcm0qYHAr1qFFC69ELYVCPzLUd5UZJuhEaQP/QOd1jw==} engines: {node: '>=20.8.1'} hasBin: true @@ -9326,38 +9364,38 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.4.0: - resolution: {integrity: sha512-kVMScnPUa3R4n7woNmkR15kOY0aUwCLJcUyH5UC59ggKqr5HIHwweKYK8N1pwBQso0LQF4I9i93hIzfJguCcwQ==} + turbo-darwin-64@2.4.2: + resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.0: - resolution: {integrity: sha512-8JObIpfun1guA7UlFR5jC/SOVm49lRscxMxfg5jZ5ABft79rhFC+ygN9AwAhGKv6W2DUhIh2xENkSgu4EDmUyg==} + turbo-darwin-arm64@2.4.2: + resolution: {integrity: sha512-uwSx1dsBSSFeEC0nxyx2O219FEsS/haiESaWwE9JI8mHkQK61s6w6fN2G586krKxyNam4AIxRltleL+O2Em94g==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.0: - resolution: {integrity: sha512-xWDGGcRlBuGV7HXWAVuTY6vsQi4aZxGMAnuiuNDg8Ij1aHGohOM0RUsWMXjxz4vuJmjk9+/D6NQqHH3AJEXezg==} + turbo-linux-64@2.4.2: + resolution: {integrity: sha512-Fy/uL8z/LAYcPbm7a1LwFnTY9pIi5FAi12iuHsgB7zHjdh4eeIKS2NIg4nroAmTcUTUZ0/cVTo4bDOCUcS3aKw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.0: - resolution: {integrity: sha512-c3En99xMguc/Pdtk/rZP53LnDdw0W6lgUc04he8r8F+UHYSNvgzHh0WGXXmCC6lGbBH72kPhhGx4bAwyvi7dug==} + turbo-linux-arm64@2.4.2: + resolution: {integrity: sha512-AEA0d8h5W/K6iiXfEgiNwWt0yqRL1NpBs8zQCLdc4/L7WeYeJW3sORWX8zt7xhutF/KW9gTm8ehKpiK6cCIsAA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.0: - resolution: {integrity: sha512-/gOORuOlyA8JDPzyA16CD3wvyRcuBFePa1URAnFUof9hXQmKxK0VvSDO79cYZFsJSchCKNJpckUS0gYxGsWwoA==} + turbo-windows-64@2.4.2: + resolution: {integrity: sha512-CybtIZ9wRgnnNFVN9En9G+rxsO+mwU81fvW4RpE8BWyNEkhQ8J28qYf4PaimueMxGHHp/28i/G7Kcdn2GAWG0g==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.0: - resolution: {integrity: sha512-/DJIdTFijEMM5LSiEpSfarDOMOlYqJV+EzmppqWtHqDsOLF4hbbIBH9sJR6OOp5dURAu5eURBYdmvBRz9Lo6TA==} + turbo-windows-arm64@2.4.2: + resolution: {integrity: sha512-7V0yneVPL8Y3TgrkUIjw7Odmwu1tHnyIiPHFM7eFcA7U+H6hPXyCxge7nC3wOKfjhKCQqUm+Vf/k6kjmLz5G4g==} cpu: [arm64] os: [win32] - turbo@2.4.0: - resolution: {integrity: sha512-ah/yQp2oMif1X0u7fBJ4MLMygnkbKnW5O8SG6pJvloPCpHfFoZctkSVQiJ3VnvNTq71V2JJIdwmOeu1i34OQyg==} + turbo@2.4.2: + resolution: {integrity: sha512-Qxi0ioQCxMRUCcHKHZkTnYH8e7XCpNfg9QiJcyfWIc+ZXeaCjzV5rCGlbQlTXMAtI8qgfP8fZADv3CFtPwqdPQ==} hasBin: true tweetnacl@0.14.5: @@ -9387,6 +9425,10 @@ packages: resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} engines: {node: '>=16'} + type-fest@4.34.1: + resolution: {integrity: sha512-6kSc32kT0rbwxD6QL1CYe8IqdzN/J/ILMrNK+HMQCKH3insCDRY/3ITb0vcBss0a3t72fzh2YSzj8ko1HgwT3g==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -9429,8 +9471,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.23.0: - resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} + typescript-eslint@8.24.0: + resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9993,8 +10035,8 @@ packages: peerDependencies: zod: ^3.21.4 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} snapshots: @@ -10231,15 +10273,15 @@ snapshots: rfc4648: 1.5.3 uint8array-extras: 1.4.0 - '@ctrl/qbittorrent@9.2.0': + '@ctrl/qbittorrent@9.4.0': dependencies: '@ctrl/magnet-link': 4.0.2 '@ctrl/shared-torrent': 6.2.1 '@ctrl/torrent-file': 4.1.0 cookie: 1.0.2 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.6 ofetch: 1.4.1 - type-fest: 4.30.2 + type-fest: 4.34.1 ufo: 1.5.4 uint8array-extras: 1.4.0 @@ -10653,9 +10695,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.19.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.20.1)': dependencies: - eslint: 9.19.0 + eslint: 9.20.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -10672,6 +10714,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.11.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 @@ -10686,7 +10732,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.19.0': {} + '@eslint/js@9.20.0': {} '@eslint/object-schema@2.1.4': {} @@ -10695,11 +10741,11 @@ snapshots: '@eslint/core': 0.10.0 levn: 0.4.1 - '@extractus/feed-extractor@7.1.3': + '@extractus/feed-extractor@7.1.4': dependencies: bellajs: 11.2.0 - cross-fetch: 4.0.0 - fast-xml-parser: 4.5.0 + cross-fetch: 4.1.0 + fast-xml-parser: 4.5.1 html-entities: 2.5.2 transitivePeerDependencies: - encoding @@ -10932,14 +10978,14 @@ snapshots: js-base64: 3.7.7 optional: true - '@mantine/colors-generator@7.16.2(chroma-js@3.1.2)': + '@mantine/colors-generator@7.16.3(chroma-js@3.1.2)': dependencies: chroma-js: 3.1.2 - '@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -10950,65 +10996,65 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) clsx: 2.1.1 dayjs: 1.11.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/dropzone@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/dropzone@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-dropzone-esm: 15.2.0(react@19.0.0) - '@mantine/form@7.16.2(react@19.0.0)': + '@mantine/form@7.16.3(react@19.0.0)': dependencies: fast-deep-equal: 3.1.3 klona: 2.0.6 react: 19.0.0 - '@mantine/hooks@7.16.2(react@19.0.0)': + '@mantine/hooks@7.16.3(react@19.0.0)': dependencies: react: 19.0.0 - '@mantine/modals@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/modals@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/notifications@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/notifications@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) - '@mantine/store': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) + '@mantine/store': 7.16.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/spotlight@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/spotlight@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) - '@mantine/store': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) + '@mantine/store': 7.16.3(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mantine/store@7.16.2(react@19.0.0)': + '@mantine/store@7.16.3(react@19.0.0)': dependencies: react: 19.0.0 - '@mantine/tiptap@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tiptap/extension-link@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@mantine/tiptap@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tiptap/extension-link@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5))(@tiptap/react@2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) '@tiptap/extension-link': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5) '@tiptap/react': 2.11.5(@tiptap/core@2.11.5(@tiptap/pm@2.11.5))(@tiptap/pm@2.11.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 @@ -11082,34 +11128,34 @@ snapshots: - utf-8-validate - webpack-sources - '@next/env@15.1.6': {} + '@next/env@15.1.7': {} - '@next/eslint-plugin-next@15.1.6': + '@next/eslint-plugin-next@15.1.7': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.6': + '@next/swc-darwin-arm64@15.1.7': optional: true - '@next/swc-darwin-x64@15.1.6': + '@next/swc-darwin-x64@15.1.7': optional: true - '@next/swc-linux-arm64-gnu@15.1.6': + '@next/swc-linux-arm64-gnu@15.1.7': optional: true - '@next/swc-linux-arm64-musl@15.1.6': + '@next/swc-linux-arm64-musl@15.1.7': optional: true - '@next/swc-linux-x64-gnu@15.1.6': + '@next/swc-linux-x64-gnu@15.1.7': optional: true - '@next/swc-linux-x64-musl@15.1.6': + '@next/swc-linux-x64-musl@15.1.7': optional: true - '@next/swc-win32-arm64-msvc@15.1.6': + '@next/swc-win32-arm64-msvc@15.1.7': optional: true - '@next/swc-win32-x64-msvc@15.1.6': + '@next/swc-win32-x64-msvc@15.1.7': optional: true '@noble/hashes@1.5.0': {} @@ -11497,15 +11543,15 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@semantic-release/changelog@6.0.3(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/changelog@6.0.3(semantic-release@24.2.2(typescript@5.7.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 fs-extra: 11.2.0 lodash: 4.17.21 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) - '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.2(typescript@5.7.3))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -11515,7 +11561,7 @@ snapshots: import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) transitivePeerDependencies: - supports-color @@ -11523,7 +11569,7 @@ snapshots: '@semantic-release/error@4.0.0': {} - '@semantic-release/git@10.0.1(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/git@10.0.1(semantic-release@24.2.2(typescript@5.7.3))': dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 @@ -11533,11 +11579,11 @@ snapshots: lodash: 4.17.21 micromatch: 4.0.8 p-reduce: 2.1.0 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) transitivePeerDependencies: - supports-color - '@semantic-release/github@11.0.1(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/github@11.0.1(semantic-release@24.2.2(typescript@5.7.3))': dependencies: '@octokit/core': 6.1.2 '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) @@ -11554,12 +11600,12 @@ snapshots: lodash-es: 4.17.21 mime: 4.0.4 p-filter: 4.1.0 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) url-join: 5.0.0 transitivePeerDependencies: - supports-color - '@semantic-release/npm@12.0.1(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/npm@12.0.1(semantic-release@24.2.2(typescript@5.7.3))': dependencies: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 @@ -11572,11 +11618,11 @@ snapshots: rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.0.2 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) semver: 7.6.3 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.1(typescript@5.7.3))': + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.2(typescript@5.7.3))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -11588,7 +11634,7 @@ snapshots: into-stream: 7.0.0 lodash-es: 4.17.21 read-package-up: 11.0.0 - semantic-release: 24.2.1(typescript@5.7.3) + semantic-release: 24.2.2(typescript@5.7.3) transitivePeerDependencies: - supports-color @@ -11963,17 +12009,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@t3-oss/env-core@0.12.0(typescript@5.7.3)(zod@3.24.1)': + '@t3-oss/env-core@0.12.0(typescript@5.7.3)(zod@3.24.2)': optionalDependencies: typescript: 5.7.3 - zod: 3.24.1 + zod: 3.24.2 - '@t3-oss/env-nextjs@0.12.0(typescript@5.7.3)(zod@3.24.1)': + '@t3-oss/env-nextjs@0.12.0(typescript@5.7.3)(zod@3.24.2)': dependencies: - '@t3-oss/env-core': 0.12.0(typescript@5.7.3)(zod@3.24.1) + '@t3-oss/env-core': 0.12.0(typescript@5.7.3)(zod@3.24.2) optionalDependencies: typescript: 5.7.3 - zod: 3.24.1 + zod: 3.24.2 '@tabler/icons-react@3.30.0(react@19.0.0)': dependencies: @@ -11996,10 +12042,10 @@ snapshots: '@tanstack/react-query': 5.66.0(react@19.0.0) react: 19.0.0 - '@tanstack/react-query-next-experimental@5.66.0(@tanstack/react-query@5.66.0(react@19.0.0))(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0)': + '@tanstack/react-query-next-experimental@5.66.0(@tanstack/react-query@5.66.0(react@19.0.0))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0)': dependencies: '@tanstack/react-query': 5.66.0(react@19.0.0) - next: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + next: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: 19.0.0 '@tanstack/react-query@5.66.0(react@19.0.0)': @@ -12246,33 +12292,33 @@ snapshots: tree-sitter: 0.22.1 optional: true - '@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3)': + '@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3)': dependencies: - '@trpc/server': 11.0.0-rc.744(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.768(typescript@5.7.3) typescript: 5.7.3 - '@trpc/next@11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@trpc/next@11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/react-query@11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@trpc/client': 11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3) - '@trpc/server': 11.0.0-rc.744(typescript@5.7.3) - next: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + '@trpc/client': 11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.768(typescript@5.7.3) + next: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) typescript: 5.7.3 optionalDependencies: '@tanstack/react-query': 5.66.0(react@19.0.0) - '@trpc/react-query': 11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@trpc/react-query': 11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@trpc/react-query@11.0.0-rc.744(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@trpc/react-query@11.0.0-rc.768(@tanstack/react-query@5.66.0(react@19.0.0))(@trpc/client@11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3))(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@tanstack/react-query': 5.66.0(react@19.0.0) - '@trpc/client': 11.0.0-rc.744(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(typescript@5.7.3) - '@trpc/server': 11.0.0-rc.744(typescript@5.7.3) + '@trpc/client': 11.0.0-rc.768(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.768(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) typescript: 5.7.3 - '@trpc/server@11.0.0-rc.744(typescript@5.7.3)': + '@trpc/server@11.0.0-rc.768(typescript@5.7.3)': dependencies: typescript: 5.7.3 @@ -12286,9 +12332,9 @@ snapshots: '@tsconfig/svelte@1.0.13': {} - '@turbo/gen@2.4.0(@types/node@22.13.1)(typescript@5.7.3)': + '@turbo/gen@2.4.2(@types/node@22.13.4)(typescript@5.7.3)': dependencies: - '@turbo/workspaces': 2.4.0 + '@turbo/workspaces': 2.4.2 commander: 10.0.1 fs-extra: 10.1.0 inquirer: 8.2.6 @@ -12296,7 +12342,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.4.0 - ts-node: 10.9.2(@types/node@22.13.1)(typescript@5.7.3) + ts-node: 10.9.2(@types/node@22.13.4)(typescript@5.7.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -12306,7 +12352,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@2.4.0': + '@turbo/workspaces@2.4.2': dependencies: commander: 10.0.1 execa: 5.1.1 @@ -12322,11 +12368,11 @@ snapshots: '@types/adm-zip@0.5.7': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/asn1@0.2.4': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/aws-lambda@8.10.146': {} @@ -12353,22 +12399,22 @@ snapshots: '@types/bcrypt@5.0.2': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/better-sqlite3@7.6.12': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/chroma-js@3.1.1': {} '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/cookie@0.4.1': {} @@ -12379,11 +12425,11 @@ snapshots: '@types/connect': 3.4.38 '@types/express': 4.17.21 '@types/keygrip': 1.0.6 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/cors@2.8.17': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/css-font-loading-module@0.0.7': {} @@ -12391,13 +12437,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/ssh2': 1.15.1 '@types/dockerode@3.3.34': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/ssh2': 1.15.1 '@types/estree@1.0.5': {} @@ -12406,7 +12452,7 @@ snapshots: '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -12421,7 +12467,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/hast@2.3.10': dependencies: @@ -12459,7 +12505,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.13.1': + '@types/node@22.13.4': dependencies: undici-types: 6.20.0 @@ -12488,21 +12534,21 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/send': 0.17.4 '@types/ssh2-streams@0.1.12': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/ssh2-streams': 0.1.12 '@types/ssh2@1.15.1': @@ -12515,7 +12561,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/tinycolor2@1.4.6': {} @@ -12531,21 +12577,21 @@ snapshots: '@types/ws@8.5.14': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@types/xml2js@0.4.14': dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 - '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/type-utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 - eslint: 9.19.0 + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 + eslint: 9.20.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -12554,40 +12600,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.24.0 debug: 4.4.0 - eslint: 9.19.0 + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.23.0': + '@typescript-eslint/scope-manager@8.24.0': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 - '@typescript-eslint/type-utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) debug: 4.4.0 - eslint: 9.19.0 + eslint: 9.20.1 ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.23.0': {} + '@typescript-eslint/types@8.24.0': {} - '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/visitor-keys': 8.24.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -12598,20 +12644,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.24.0(eslint@9.20.1)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - eslint: 9.19.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1) + '@typescript-eslint/scope-manager': 8.24.0 + '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.23.0': + '@typescript-eslint/visitor-keys@8.24.0': dependencies: - '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/types': 8.24.0 eslint-visitor-keys: 4.2.0 '@umami/node@0.4.0': {} @@ -12644,14 +12690,14 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@4.3.4(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitejs/plugin-react@4.3.4(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -12669,7 +12715,7 @@ snapshots: std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.5(@types/node@22.13.1)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 3.0.5(@types/node@22.13.4)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -12680,13 +12726,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitest/mocker@3.0.5(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) '@vitest/pretty-format@3.0.5': dependencies: @@ -12716,7 +12762,7 @@ snapshots: sirv: 3.0.0 tinyglobby: 0.2.10 tinyrainbow: 2.0.0 - vitest: 3.0.5(@types/node@22.13.1)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 3.0.5(@types/node@22.13.4)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) '@vitest/utils@3.0.5': dependencies: @@ -13588,7 +13634,7 @@ snapshots: dependencies: cross-spawn: 7.0.3 - cross-fetch@4.0.0: + cross-fetch@4.1.0: dependencies: node-fetch: 2.7.0 transitivePeerDependencies: @@ -13853,19 +13899,17 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.39.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.8)(better-sqlite3@11.8.1)(mysql2@3.12.0)(react@19.0.0): + drizzle-orm@0.39.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(mysql2@3.12.0): optionalDependencies: '@libsql/client-wasm': 0.14.0 '@types/better-sqlite3': 7.6.12 - '@types/react': 19.0.8 better-sqlite3: 11.8.1 mysql2: 3.12.0 - react: 19.0.0 - drizzle-zod@0.7.0(drizzle-orm@0.39.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.8)(better-sqlite3@11.8.1)(mysql2@3.12.0)(react@19.0.0))(zod@3.24.1): + drizzle-zod@0.7.0(drizzle-orm@0.39.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(mysql2@3.12.0))(zod@3.24.2): dependencies: - drizzle-orm: 0.39.2(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(@types/react@19.0.8)(better-sqlite3@11.8.1)(mysql2@3.12.0)(react@19.0.0) - zod: 3.24.1 + drizzle-orm: 0.39.3(@libsql/client-wasm@0.14.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.8.1)(mysql2@3.12.0) + zod: 3.24.2 dunder-proto@1.0.1: dependencies: @@ -13915,7 +13959,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 22.13.1 + '@types/node': 22.13.4 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -14257,15 +14301,15 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.1(eslint@9.19.0): + eslint-config-prettier@10.0.1(eslint@9.20.1): dependencies: - eslint: 9.19.0 + eslint: 9.20.1 - eslint-config-turbo@2.4.0(eslint@9.19.0)(turbo@2.4.0): + eslint-config-turbo@2.4.2(eslint@9.20.1)(turbo@2.4.2): dependencies: - eslint: 9.19.0 - eslint-plugin-turbo: 2.4.0(eslint@9.19.0)(turbo@2.4.0) - turbo: 2.4.0 + eslint: 9.20.1 + eslint-plugin-turbo: 2.4.2(eslint@9.20.1)(turbo@2.4.2) + turbo: 2.4.2 eslint-import-resolver-node@0.3.9: dependencies: @@ -14275,17 +14319,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - eslint: 9.19.0 + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + eslint: 9.20.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -14294,9 +14338,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.19.0 + eslint: 9.20.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.20.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -14308,13 +14352,13 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.19.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.20.1): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -14324,7 +14368,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.19.0 + eslint: 9.20.1 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -14333,11 +14377,11 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.19.0): + eslint-plugin-react-hooks@5.1.0(eslint@9.20.1): dependencies: - eslint: 9.19.0 + eslint: 9.20.1 - eslint-plugin-react@7.37.4(eslint@9.19.0): + eslint-plugin-react@7.37.4(eslint@9.20.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -14345,7 +14389,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.19.0 + eslint: 9.20.1 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -14359,11 +14403,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.0(eslint@9.19.0)(turbo@2.4.0): + eslint-plugin-turbo@2.4.2(eslint@9.20.1)(turbo@2.4.2): dependencies: dotenv: 16.0.3 - eslint: 9.19.0 - turbo: 2.4.0 + eslint: 9.20.1 + turbo: 2.4.2 eslint-scope@5.1.1: dependencies: @@ -14379,14 +14423,14 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.19.0: + eslint@9.20.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.19.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.1) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 - '@eslint/core': 0.10.0 + '@eslint/core': 0.11.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.19.0 + '@eslint/js': 9.20.0 '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -14527,7 +14571,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-xml-parser@4.5.0: + fast-xml-parser@4.5.1: dependencies: strnum: 1.0.5 @@ -15429,7 +15473,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15437,7 +15481,7 @@ snapshots: jose@5.9.6: {} - jotai@2.11.3(@types/react@19.0.8)(react@19.0.0): + jotai@2.12.0(@types/react@19.0.8)(react@19.0.0): optionalDependencies: '@types/react': 19.0.8 react: 19.0.0 @@ -15689,11 +15733,11 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.8(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + mantine-react-table@2.0.0-beta.8(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/dates@7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(@tabler/icons-react@3.30.0(react@19.0.0))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@mantine/core': 7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/dates': 7.16.2(@mantine/core@7.16.2(@mantine/hooks@7.16.2(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.2(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@mantine/hooks': 7.16.2(react@19.0.0) + '@mantine/core': 7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/dates': 7.16.3(@mantine/core@7.16.3(@mantine/hooks@7.16.3(react@19.0.0))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@mantine/hooks@7.16.3(react@19.0.0))(dayjs@1.11.13)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@mantine/hooks': 7.16.3(react@19.0.0) '@tabler/icons-react': 3.30.0(react@19.0.0) '@tanstack/match-sorter-utils': 8.19.4 '@tanstack/react-table': 8.20.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -15876,23 +15920,23 @@ snapshots: netmask@2.0.2: {} - next-auth@5.0.0-beta.25(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0): + next-auth@5.0.0-beta.25(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0): dependencies: '@auth/core': 0.37.2 - next: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + next: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: 19.0.0 - next-intl@3.26.3(next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0))(react@19.0.0): + next-intl@3.26.3(next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0))(react@19.0.0): dependencies: '@formatjs/intl-localematcher': 0.5.5 negotiator: 1.0.0 - next: 15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0) + next: 15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: 19.0.0 use-intl: 3.26.3(react@19.0.0) - next@15.1.6(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.84.0): + next@15.1.7(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0): dependencies: - '@next/env': 15.1.6 + '@next/env': 15.1.7 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -15902,16 +15946,16 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.6 - '@next/swc-darwin-x64': 15.1.6 - '@next/swc-linux-arm64-gnu': 15.1.6 - '@next/swc-linux-arm64-musl': 15.1.6 - '@next/swc-linux-x64-gnu': 15.1.6 - '@next/swc-linux-x64-musl': 15.1.6 - '@next/swc-win32-arm64-msvc': 15.1.6 - '@next/swc-win32-x64-msvc': 15.1.6 + '@next/swc-darwin-arm64': 15.1.7 + '@next/swc-darwin-x64': 15.1.7 + '@next/swc-linux-arm64-gnu': 15.1.7 + '@next/swc-linux-arm64-musl': 15.1.7 + '@next/swc-linux-x64-gnu': 15.1.7 + '@next/swc-linux-x64-musl': 15.1.7 + '@next/swc-win32-arm64-msvc': 15.1.7 + '@next/swc-win32-x64-msvc': 15.1.7 '@playwright/test': 1.49.1 - sass: 1.84.0 + sass: 1.85.0 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -15964,6 +16008,8 @@ snapshots: node-fetch-native@1.6.4: {} + node-fetch-native@1.6.6: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -16269,7 +16315,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 0.1.2 - type-fest: 4.30.2 + type-fest: 4.34.1 parse-ms@3.0.0: {} @@ -16465,7 +16511,7 @@ snapshots: dependencies: parse-ms: 4.0.0 - pretty-print-error@1.1.2(patch_hash=4arrfgbz7em6s4gqywse7esg4u): + pretty-print-error@1.1.2(patch_hash=d1432e02330bdaf8359eb0e54528a74ed6b7e5cce6bb65c13310c82e34fd1e4d): dependencies: kleur: 4.1.5 @@ -16624,7 +16670,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.13.1 + '@types/node': 22.13.4 long: 5.2.3 proxmox-api@1.1.1: @@ -16833,14 +16879,14 @@ snapshots: dependencies: find-up-simple: 1.0.0 read-pkg: 9.0.1 - type-fest: 4.30.2 + type-fest: 4.34.1 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.30.2 + type-fest: 4.34.1 unicorn-magic: 0.1.0 readable-stream@2.3.8: @@ -17094,7 +17140,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.84.0: + sass@1.85.0: dependencies: chokidar: 4.0.0 immutable: 5.0.2 @@ -17116,13 +17162,13 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - semantic-release@24.2.1(typescript@5.7.3): + semantic-release@24.2.2(typescript@5.7.3): dependencies: - '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.1(typescript@5.7.3)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.2(typescript@5.7.3)) '@semantic-release/error': 4.0.0 - '@semantic-release/github': 11.0.1(semantic-release@24.2.1(typescript@5.7.3)) - '@semantic-release/npm': 12.0.1(semantic-release@24.2.1(typescript@5.7.3)) - '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.1(typescript@5.7.3)) + '@semantic-release/github': 11.0.1(semantic-release@24.2.2(typescript@5.7.3)) + '@semantic-release/npm': 12.0.1(semantic-release@24.2.2(typescript@5.7.3)) + '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.2(typescript@5.7.3)) aggregate-error: 5.0.0 cosmiconfig: 9.0.0(typescript@5.7.3) debug: 4.4.0 @@ -17901,14 +17947,14 @@ snapshots: triple-beam@1.4.1: {} - trpc-to-openapi@2.1.3(@trpc/server@11.0.0-rc.744(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.1))(zod@3.24.1): + trpc-to-openapi@2.1.3(@trpc/server@11.0.0-rc.768(typescript@5.7.3))(zod-openapi@2.19.0(zod@3.24.2))(zod@3.24.2): dependencies: - '@trpc/server': 11.0.0-rc.744(typescript@5.7.3) + '@trpc/server': 11.0.0-rc.768(typescript@5.7.3) co-body: 6.2.0 h3: 1.13.0 openapi3-ts: 4.4.0 - zod: 3.24.1 - zod-openapi: 2.19.0(zod@3.24.1) + zod: 3.24.2 + zod-openapi: 2.19.0(zod@3.24.2) optionalDependencies: '@rollup/rollup-linux-x64-gnu': 4.6.1 @@ -17918,14 +17964,14 @@ snapshots: ts-mixer@6.0.4: {} - ts-node@10.9.2(@types/node@22.13.1)(typescript@5.7.3): + ts-node@10.9.2(@types/node@22.13.4)(typescript@5.7.3): 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.13.1 + '@types/node': 22.13.4 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -17968,32 +18014,32 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo-darwin-64@2.4.0: + turbo-darwin-64@2.4.2: optional: true - turbo-darwin-arm64@2.4.0: + turbo-darwin-arm64@2.4.2: optional: true - turbo-linux-64@2.4.0: + turbo-linux-64@2.4.2: optional: true - turbo-linux-arm64@2.4.0: + turbo-linux-arm64@2.4.2: optional: true - turbo-windows-64@2.4.0: + turbo-windows-64@2.4.2: optional: true - turbo-windows-arm64@2.4.0: + turbo-windows-arm64@2.4.2: optional: true - turbo@2.4.0: + turbo@2.4.2: optionalDependencies: - turbo-darwin-64: 2.4.0 - turbo-darwin-arm64: 2.4.0 - turbo-linux-64: 2.4.0 - turbo-linux-arm64: 2.4.0 - turbo-windows-64: 2.4.0 - turbo-windows-arm64: 2.4.0 + turbo-darwin-64: 2.4.2 + turbo-darwin-arm64: 2.4.2 + turbo-linux-64: 2.4.2 + turbo-linux-arm64: 2.4.2 + turbo-windows-64: 2.4.2 + turbo-windows-arm64: 2.4.2 tweetnacl@0.14.5: {} @@ -18011,6 +18057,8 @@ snapshots: type-fest@4.30.2: {} + type-fest@4.34.1: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -18089,12 +18137,12 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.23.0(eslint@9.19.0)(typescript@5.7.3): + typescript-eslint@8.24.0(eslint@9.20.1)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) - eslint: 9.19.0 + '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.1)(typescript@5.7.3))(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + '@typescript-eslint/utils': 8.24.0(eslint@9.20.1)(typescript@5.7.3) + eslint: 9.20.1 typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -18141,7 +18189,7 @@ snapshots: consola: 3.2.3 defu: 6.1.4 mime: 3.0.0 - node-fetch-native: 1.6.4 + node-fetch-native: 1.6.6 pathe: 1.1.2 unicode-emoji-modifier-base@1.0.0: {} @@ -18319,13 +18367,13 @@ snapshots: dependencies: global: 4.4.0 - vite-node@3.0.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite-node@3.0.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.2 - vite: 5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - '@types/node' - less @@ -18337,33 +18385,33 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)): + vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.3(typescript@5.7.3) optionalDependencies: - vite: 5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.21.3 optionalDependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 fsevents: 2.3.3 - sass: 1.84.0 + sass: 1.85.0 sugarss: 4.0.1(postcss@8.4.47) terser: 5.32.0 - vitest@3.0.5(@types/node@22.13.1)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vitest@3.0.5(@types/node@22.13.4)(@vitest/ui@3.0.5)(jsdom@26.0.0)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + '@vitest/mocker': 3.0.5(vite@5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/pretty-format': 3.0.5 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -18379,11 +18427,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 5.4.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - vite-node: 3.0.5(@types/node@22.13.1)(sass@1.84.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite: 5.4.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite-node: 3.0.5(@types/node@22.13.4)(sass@1.85.0)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.4 '@vitest/ui': 3.0.5(vitest@3.0.5) jsdom: 26.0.0 transitivePeerDependencies: @@ -18672,12 +18720,12 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.5.2 - zod-form-data@2.0.5(zod@3.24.1): + zod-form-data@2.0.5(zod@3.24.2): dependencies: - zod: 3.24.1 + zod: 3.24.2 - zod-openapi@2.19.0(zod@3.24.1): + zod-openapi@2.19.0(zod@3.24.2): dependencies: - zod: 3.24.1 + zod: 3.24.2 - zod@3.24.1: {} + zod@3.24.2: {} diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index a8bfd96b7..02fa24507 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -17,19 +17,19 @@ }, "prettier": "@homarr/prettier-config", "dependencies": { - "@next/eslint-plugin-next": "^15.1.6", + "@next/eslint-plugin-next": "^15.1.7", "eslint-config-prettier": "^10.0.1", - "eslint-config-turbo": "^2.4.0", + "eslint-config-turbo": "^2.4.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.4", "eslint-plugin-react-hooks": "^5.1.0", - "typescript-eslint": "^8.23.0" + "typescript-eslint": "^8.24.0" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.19.0", + "eslint": "^9.20.1", "typescript": "^5.7.3" } } diff --git a/turbo/generators/templates/package.json.hbs b/turbo/generators/templates/package.json.hbs index e288ab93c..3890eef64 100644 --- a/turbo/generators/templates/package.json.hbs +++ b/turbo/generators/templates/package.json.hbs @@ -24,7 +24,7 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.18.0", + "eslint": "^9.19.0", "typescript": "^5.7.3" }, "prettier": "@homarr/prettier-config"