From 0f8d9edb3e450f0b2d656bf926c2327fe7c824bf Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 11 Oct 2024 23:47:07 +0200 Subject: [PATCH 01/43] refactor: replace serverdata with suspense query (#1265) * refactor: replace serverdata with suspense query * fix: deepsource issues --- .../[locale]/boards/(content)/_creator.tsx | 1 - .../src/app/[locale]/boards/[name]/layout.tsx | 1 - .../app/[locale]/boards/_layout-creator.tsx | 31 ++--- .../components/board/items/item-content.tsx | 7 +- packages/api/src/router/widgets/calendar.ts | 3 +- packages/widgets/src/app/index.ts | 2 +- packages/widgets/src/calendar/component.tsx | 17 ++- packages/widgets/src/calendar/index.ts | 6 +- packages/widgets/src/calendar/serverData.ts | 35 ------ packages/widgets/src/definition.ts | 49 +------- .../src/dns-hole/controls/component.tsx | 115 +++++++++++++----- .../widgets/src/dns-hole/controls/index.ts | 6 +- .../src/dns-hole/controls/serverData.ts | 29 ----- .../src/dns-hole/summary/component.tsx | 54 +++++--- .../widgets/src/dns-hole/summary/index.ts | 6 +- .../src/dns-hole/summary/serverData.ts | 29 ----- packages/widgets/src/downloads/component.tsx | 66 +++++----- packages/widgets/src/downloads/index.ts | 6 +- packages/widgets/src/downloads/serverData.ts | 21 ---- .../src/health-monitoring/component.tsx | 22 ++-- .../widgets/src/health-monitoring/index.ts | 6 +- .../src/health-monitoring/serverData.ts | 27 ---- packages/widgets/src/index.tsx | 2 - .../widgets/src/indexer-manager/component.tsx | 27 ++-- packages/widgets/src/indexer-manager/index.ts | 6 +- .../widgets/src/indexer-manager/serverData.ts | 27 ---- .../src/media-requests/list/component.tsx | 10 +- .../widgets/src/media-requests/list/index.ts | 6 +- .../src/media-requests/list/serverData.ts | 22 ---- .../src/media-requests/stats/component.tsx | 8 +- .../widgets/src/media-requests/stats/index.ts | 6 +- .../src/media-requests/stats/serverData.ts | 25 ---- .../widgets/src/media-server/component.tsx | 40 +++--- packages/widgets/src/media-server/index.ts | 6 +- .../widgets/src/media-server/serverData.ts | 21 ---- packages/widgets/src/rssFeed/component.tsx | 24 +++- packages/widgets/src/rssFeed/index.ts | 6 +- packages/widgets/src/rssFeed/serverData.ts | 21 ---- packages/widgets/src/server/client.tsx | 13 -- packages/widgets/src/server/provider.tsx | 74 ----------- packages/widgets/src/server/runner.tsx | 51 -------- 41 files changed, 288 insertions(+), 646 deletions(-) delete mode 100644 packages/widgets/src/calendar/serverData.ts delete mode 100644 packages/widgets/src/dns-hole/controls/serverData.ts delete mode 100644 packages/widgets/src/dns-hole/summary/serverData.ts delete mode 100644 packages/widgets/src/downloads/serverData.ts delete mode 100644 packages/widgets/src/health-monitoring/serverData.ts delete mode 100644 packages/widgets/src/indexer-manager/serverData.ts delete mode 100644 packages/widgets/src/media-requests/list/serverData.ts delete mode 100644 packages/widgets/src/media-requests/stats/serverData.ts delete mode 100644 packages/widgets/src/media-server/serverData.ts delete mode 100644 packages/widgets/src/rssFeed/serverData.ts delete mode 100644 packages/widgets/src/server/client.tsx delete mode 100644 packages/widgets/src/server/provider.tsx delete mode 100644 packages/widgets/src/server/runner.tsx diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx index 6a6be9b42..15f386719 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_creator.tsx @@ -28,7 +28,6 @@ export const createBoardContentPage = >( layout: createBoardLayout({ headerActions: , getInitialBoardAsync: getInitialBoard, - isBoardContentPage: true, }), // eslint-disable-next-line no-restricted-syntax page: async () => { diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/layout.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/layout.tsx index 42107bf2d..1f129e4c1 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/layout.tsx @@ -8,5 +8,4 @@ export default createBoardLayout<{ locale: string; name: string }>({ async getInitialBoardAsync({ name }) { return await api.board.getBoardByName({ name }); }, - isBoardContentPage: false, }); diff --git a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx index 56dabdd88..4e8edd149 100644 --- a/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx +++ b/apps/nextjs/src/app/[locale]/boards/_layout-creator.tsx @@ -4,7 +4,6 @@ import { AppShellMain } from "@mantine/core"; import { TRPCError } from "@trpc/server"; import { logger } from "@homarr/log"; -import { GlobalItemServerDataRunner } from "@homarr/widgets"; import { MainHeader } from "~/components/layout/header"; import { BoardLogoWithTitle } from "~/components/layout/logo/board-logo"; @@ -18,13 +17,11 @@ import { BoardMantineProvider } from "./(content)/_theme"; interface CreateBoardLayoutProps { headerActions: JSX.Element; getInitialBoardAsync: (params: TParams) => Promise; - isBoardContentPage: boolean; } export const createBoardLayout = ({ headerActions, getInitialBoardAsync: getInitialBoard, - isBoardContentPage, }: CreateBoardLayoutProps) => { const Layout = async ({ params, @@ -42,21 +39,19 @@ export const createBoardLayout = ({ }); return ( - - - - - - } - actions={headerActions} - hasNavigation={false} - /> - {children} - - - - + + + + + } + actions={headerActions} + hasNavigation={false} + /> + {children} + + + ); }; diff --git a/apps/nextjs/src/components/board/items/item-content.tsx b/apps/nextjs/src/components/board/items/item-content.tsx index 2af6b3154..930cde473 100644 --- a/apps/nextjs/src/components/board/items/item-content.tsx +++ b/apps/nextjs/src/components/board/items/item-content.tsx @@ -4,7 +4,7 @@ import { QueryErrorResetBoundary } from "@tanstack/react-query"; import combineClasses from "clsx"; import { ErrorBoundary } from "react-error-boundary"; -import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues, useServerDataFor } from "@homarr/widgets"; +import { loadWidgetDynamic, reduceWidgetOptionsWithDefaultValues } from "@homarr/widgets"; import { WidgetError } from "@homarr/widgets/errors"; import type { Item } from "~/app/[locale]/boards/_types"; @@ -53,7 +53,6 @@ interface InnerContentProps { const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { const board = useRequiredBoard(); const [isEditMode] = useEditMode(); - const serverData = useServerDataFor(item.id); const Comp = loadWidgetDynamic(item.kind); const options = reduceWidgetOptionsWithDefaultValues(item.kind, item.options); const newItem = { ...item, options }; @@ -61,8 +60,6 @@ const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { const updateOptions = ({ newOptions }: { newOptions: Record }) => updateItemOptions({ itemId: item.id, newOptions }); - if (!serverData?.isReady) return null; - return ( {({ reset }) => ( @@ -79,8 +76,6 @@ const InnerContent = ({ item, ...dimensions }: InnerContentProps) => { { - return await Promise.all( + const result = await Promise.all( ctx.integrations.flatMap(async (integration) => { const cache = createItemAndIntegrationChannel("calendar", integration.id); return await cache.getAsync(); }), ); + return result.filter((item) => item !== null).flatMap((item) => item.data); }), }); diff --git a/packages/widgets/src/app/index.ts b/packages/widgets/src/app/index.ts index 506f654e5..66d7a0ecb 100644 --- a/packages/widgets/src/app/index.ts +++ b/packages/widgets/src/app/index.ts @@ -3,7 +3,7 @@ import { IconApps, IconDeviceDesktopX } from "@tabler/icons-react"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("app", { +export const { definition, componentLoader } = createWidgetDefinition("app", { icon: IconApps, options: optionsBuilder.from((factory) => ({ appId: factory.app(), diff --git a/packages/widgets/src/calendar/component.tsx b/packages/widgets/src/calendar/component.tsx index 1e21122e9..d773c7fe5 100644 --- a/packages/widgets/src/calendar/component.tsx +++ b/packages/widgets/src/calendar/component.tsx @@ -11,7 +11,20 @@ import type { WidgetComponentProps } from "../definition"; import { CalendarDay } from "./calender-day"; import classes from "./component.module.css"; -export default function CalendarWidget({ isEditMode, serverData }: WidgetComponentProps<"calendar">) { +export default function CalendarWidget({ isEditMode, integrationIds, itemId }: WidgetComponentProps<"calendar">) { + const [events] = clientApi.widget.calendar.findAllEvents.useSuspenseQuery( + { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + itemId: itemId!, + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + }, + ); const [month, setMonth] = useState(new Date()); const params = useParams(); const locale = params.locale as string; @@ -68,7 +81,7 @@ export default function CalendarWidget({ isEditMode, serverData }: WidgetCompone }, }} renderDay={(date) => { - const eventsForDate = (serverData?.initialData ?? []).filter((event) => dayjs(event.date).isSame(date, "day")); + const eventsForDate = events.filter((event) => dayjs(event.date).isSame(date, "day")); return ; }} /> diff --git a/packages/widgets/src/calendar/index.ts b/packages/widgets/src/calendar/index.ts index ff7d8d8a5..e3243038c 100644 --- a/packages/widgets/src/calendar/index.ts +++ b/packages/widgets/src/calendar/index.ts @@ -6,7 +6,7 @@ import { z } from "@homarr/validation"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("calendar", { +export const { definition, componentLoader } = createWidgetDefinition("calendar", { icon: IconCalendar, options: optionsBuilder.from((factory) => ({ filterPastMonths: factory.number({ @@ -19,6 +19,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef }), })), supportedIntegrations: getIntegrationKindsByCategory("calendar"), -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/calendar/serverData.ts b/packages/widgets/src/calendar/serverData.ts deleted file mode 100644 index 907efba2e..000000000 --- a/packages/widgets/src/calendar/serverData.ts +++ /dev/null @@ -1,35 +0,0 @@ -"use server"; - -import type { RouterOutputs } from "@homarr/api"; -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ integrationIds, itemId }: WidgetProps<"calendar">) { - if (!itemId) { - return { - initialData: [], - }; - } - try { - const data = await api.widget.calendar.findAllEvents({ - integrationIds, - itemId, - }); - - return { - initialData: data - .filter( - ( - item, - ): item is Exclude, undefined> => - item !== null, - ) - .flatMap((item) => item.data), - }; - } catch { - return { - initialData: [], - }; - } -} diff --git a/packages/widgets/src/definition.ts b/packages/widgets/src/definition.ts index 46346bddb..77238b469 100644 --- a/packages/widgets/src/definition.ts +++ b/packages/widgets/src/definition.ts @@ -8,57 +8,22 @@ import type { TablerIcon } from "@homarr/ui"; import type { WidgetImports } from "."; import type { inferOptionsFromDefinition, WidgetOptionsRecord } from "./options"; -type ServerDataLoader = () => Promise<{ - default: (props: WidgetProps) => Promise>; -}>; - const createWithDynamicImport = - < - TKind extends WidgetKind, - TDefinition extends WidgetDefinition, - TServerDataLoader extends ServerDataLoader | undefined, - >( - kind: TKind, - definition: TDefinition, - serverDataLoader: TServerDataLoader, - ) => - ( - componentLoader: () => LoaderComponent< - WidgetComponentProps & - (TServerDataLoader extends ServerDataLoader - ? { - serverData: Awaited>["default"]>>; - } - : never) - >, - ) => ({ - definition: { - ...definition, - kind, - }, - kind, - serverDataLoader, - componentLoader, - }); - -const createWithServerData = (kind: TKind, definition: TDefinition) => - >(serverDataLoader: TServerDataLoader) => ({ + (componentLoader: () => LoaderComponent>) => ({ definition: { ...definition, kind, }, kind, - serverDataLoader, - withDynamicImport: createWithDynamicImport(kind, definition, serverDataLoader), + componentLoader, }); export const createWidgetDefinition = ( kind: TKind, definition: TDefinition, ) => ({ - withServerData: createWithServerData(kind, definition), - withDynamicImport: createWithDynamicImport(kind, definition, undefined), + withDynamicImport: createWithDynamicImport(kind, definition), }); export interface WidgetDefinition { @@ -83,15 +48,7 @@ export interface WidgetProps { itemId: string | undefined; // undefined when in preview mode } -type inferServerDataForKind = WidgetImports[TKind] extends { - serverDataLoader: ServerDataLoader; -} - ? Awaited>["default"]>> - : undefined; - export type WidgetComponentProps = WidgetProps & { - serverData?: inferServerDataForKind; -} & { boardId: string | undefined; // undefined when in preview mode isEditMode: boolean; setOptions: ({ diff --git a/packages/widgets/src/dns-hole/controls/component.tsx b/packages/widgets/src/dns-hole/controls/component.tsx index b5f71b46e..06e41ea7b 100644 --- a/packages/widgets/src/dns-hole/controls/component.tsx +++ b/packages/widgets/src/dns-hole/controls/component.tsx @@ -39,16 +39,25 @@ export default function DnsHoleControlsWidget({ options, integrationIds, isEditMode, - serverData, }: WidgetComponentProps) { // DnsHole integrations with interaction permissions const integrationsWithInteractions = useIntegrationsWithInteractAccess() .map(({ id }) => id) .filter((id) => integrationIds.includes(id)); - // Initial summaries, null summary means disconnected, undefined status means processing - const [summaries, setSummaries] = useState(serverData?.initialData ?? []); - + const [summaries] = clientApi.widget.dnsHole.summary.useSuspenseQuery( + { + widgetKind: "dnsHoleControls", + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + }, + ); + const utils = clientApi.useUtils(); // Subscribe to summary updates clientApi.widget.dnsHole.subscribeToSummary.useSubscription( { @@ -57,8 +66,20 @@ export default function DnsHoleControlsWidget({ }, { onData: (data) => { - setSummaries((prevSummaries) => - prevSummaries.map((summary) => (summary.integration.id === data.integration.id ? data : summary)), + utils.widget.dnsHole.summary.setData( + { + widgetKind: "dnsHoleControls", + integrationIds, + }, + (prevData) => { + if (!prevData) return undefined; + + const newData = prevData.map((summary) => + summary.integration.id === data.integration.id ? { ...summary, summary: data.summary } : summary, + ); + + return newData; + }, ); }, }, @@ -67,39 +88,77 @@ export default function DnsHoleControlsWidget({ // Mutations for dnsHole state, set to undefined on click, and change again on settle const { mutate: enableDns } = clientApi.widget.dnsHole.enable.useMutation({ onSettled: (_, error, { integrationId }) => { - setSummaries((prevSummaries) => - prevSummaries.map((data) => ({ - ...data, - summary: - data.integration.id === integrationId && data.summary - ? { ...data.summary, status: error ? "disabled" : "enabled" } - : data.summary, - })), + utils.widget.dnsHole.summary.setData( + { + widgetKind: "dnsHoleControls", + integrationIds, + }, + (prevData) => { + if (!prevData) return []; + + return prevData.map((item) => + item.integration.id === integrationId && item.summary + ? { + ...item, + summary: { + ...item.summary, + status: error ? "disabled" : "enabled", + }, + } + : item, + ); + }, ); }, }); const { mutate: disableDns } = clientApi.widget.dnsHole.disable.useMutation({ onSettled: (_, error, { integrationId }) => { - setSummaries((prevSummaries) => - prevSummaries.map((data) => ({ - ...data, - summary: - data.integration.id === integrationId && data.summary - ? { ...data.summary, status: error ? "enabled" : "disabled" } - : data.summary, - })), + utils.widget.dnsHole.summary.setData( + { + widgetKind: "dnsHoleControls", + integrationIds, + }, + (prevData) => { + if (!prevData) return []; + + return prevData.map((item) => + item.integration.id === integrationId && item.summary + ? { + ...item, + summary: { + ...item.summary, + status: error ? "enabled" : "disabled", + }, + } + : item, + ); + }, ); }, }); const toggleDns = (integrationId: string) => { const integrationStatus = summaries.find(({ integration }) => integration.id === integrationId); if (!integrationStatus?.summary?.status) return; - setSummaries((prevSummaries) => - prevSummaries.map((data) => ({ - ...data, - summary: - data.integration.id === integrationId && data.summary ? { ...data.summary, status: undefined } : data.summary, - })), + utils.widget.dnsHole.summary.setData( + { + widgetKind: "dnsHoleControls", + integrationIds, + }, + (prevData) => { + if (!prevData) return []; + + return prevData.map((item) => + item.integration.id === integrationId && item.summary + ? { + ...item, + summary: { + ...item.summary, + status: undefined, + }, + } + : item, + ); + }, ); if (integrationStatus.summary.status === "enabled") { disableDns({ integrationId, duration: 0 }); diff --git a/packages/widgets/src/dns-hole/controls/index.ts b/packages/widgets/src/dns-hole/controls/index.ts index b190b1b24..27f126ee9 100644 --- a/packages/widgets/src/dns-hole/controls/index.ts +++ b/packages/widgets/src/dns-hole/controls/index.ts @@ -7,7 +7,7 @@ import { optionsBuilder } from "../../options"; export const widgetKind = "dnsHoleControls"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition(widgetKind, { +export const { definition, componentLoader } = createWidgetDefinition(widgetKind, { icon: IconDeviceGamepad, options: optionsBuilder.from((factory) => ({ showToggleAllButtons: factory.switch({ @@ -21,6 +21,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef message: (t) => t("widget.dnsHoleControls.error.internalServerError"), }, }, -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/dns-hole/controls/serverData.ts b/packages/widgets/src/dns-hole/controls/serverData.ts deleted file mode 100644 index 8212b9b9d..000000000 --- a/packages/widgets/src/dns-hole/controls/serverData.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import { widgetKind } from "."; -import type { WidgetProps } from "../../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps) { - if (integrationIds.length === 0) { - return { - initialData: [], - }; - } - - try { - const currentDns = await api.widget.dnsHole.summary({ - widgetKind, - integrationIds, - }); - - return { - initialData: currentDns, - }; - } catch { - return { - initialData: [], - }; - } -} diff --git a/packages/widgets/src/dns-hole/summary/component.tsx b/packages/widgets/src/dns-hole/summary/component.tsx index 513ecc712..650e144bc 100644 --- a/packages/widgets/src/dns-hole/summary/component.tsx +++ b/packages/widgets/src/dns-hole/summary/component.tsx @@ -1,6 +1,6 @@ "use client"; -import { useMemo, useState } from "react"; +import { useMemo } from "react"; import type { BoxProps } from "@mantine/core"; import { Avatar, AvatarGroup, Box, Card, Flex, Stack, Text, Tooltip } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; @@ -20,12 +20,20 @@ import { widgetKind } from "."; import type { WidgetComponentProps, WidgetProps } from "../../definition"; import { NoIntegrationSelectedError } from "../../errors"; -export default function DnsHoleSummaryWidget({ - options, - integrationIds, - serverData, -}: WidgetComponentProps) { - const [summaries, setSummaries] = useState(serverData?.initialData ?? []); +export default function DnsHoleSummaryWidget({ options, integrationIds }: WidgetComponentProps) { + const [summaries] = clientApi.widget.dnsHole.summary.useSuspenseQuery( + { + widgetKind, + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + }, + ); + const utils = clientApi.useUtils(); const t = useI18n(); @@ -36,8 +44,21 @@ export default function DnsHoleSummaryWidget({ }, { onData: (data) => { - setSummaries((prevSummaries) => - prevSummaries.map((summary) => (summary.integration.id === data.integration.id ? data : summary)), + utils.widget.dnsHole.summary.setData( + { + widgetKind, + integrationIds, + }, + (prevData) => { + if (!prevData) { + return undefined; + } + + const newData = prevData.map((item) => + item.integration.id === data.integration.id ? { ...item, summary: data.summary } : item, + ); + return newData; + }, ); }, }, @@ -46,17 +67,10 @@ export default function DnsHoleSummaryWidget({ const data = useMemo( () => summaries - .filter( - ( - pair, - ): pair is { - integration: typeof pair.integration; - timestamp: typeof pair.timestamp; - summary: DnsHoleSummary; - } => pair.summary !== null && Math.abs(dayjs(pair.timestamp).diff()) < 30000, - ) - .flatMap(({ summary }) => summary), - [summaries, serverData], + .filter((pair) => Math.abs(dayjs(pair.timestamp).diff()) < 30000) + .flatMap(({ summary }) => summary) + .filter((summary) => summary !== null), + [summaries], ); if (integrationIds.length === 0) { diff --git a/packages/widgets/src/dns-hole/summary/index.ts b/packages/widgets/src/dns-hole/summary/index.ts index d1c3ff18a..25246d23f 100644 --- a/packages/widgets/src/dns-hole/summary/index.ts +++ b/packages/widgets/src/dns-hole/summary/index.ts @@ -7,7 +7,7 @@ import { optionsBuilder } from "../../options"; export const widgetKind = "dnsHoleSummary"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition(widgetKind, { +export const { definition, componentLoader } = createWidgetDefinition(widgetKind, { icon: IconAd, options: optionsBuilder.from((factory) => ({ usePiHoleColors: factory.switch({ @@ -28,6 +28,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef message: (t) => t("widget.dnsHoleSummary.error.internalServerError"), }, }, -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/dns-hole/summary/serverData.ts b/packages/widgets/src/dns-hole/summary/serverData.ts deleted file mode 100644 index 8212b9b9d..000000000 --- a/packages/widgets/src/dns-hole/summary/serverData.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import { widgetKind } from "."; -import type { WidgetProps } from "../../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps) { - if (integrationIds.length === 0) { - return { - initialData: [], - }; - } - - try { - const currentDns = await api.widget.dnsHole.summary({ - widgetKind, - integrationIds, - }); - - return { - initialData: currentDns, - }; - } catch { - return { - initialData: [], - }; - } -} diff --git a/packages/widgets/src/downloads/component.tsx b/packages/widgets/src/downloads/component.tsx index 7fafc932a..329565e3f 100644 --- a/packages/widgets/src/downloads/component.tsx +++ b/packages/widgets/src/downloads/component.tsx @@ -21,7 +21,7 @@ import { Title, Tooltip, } from "@mantine/core"; -import { useDisclosure, useListState, useTimeout } from "@mantine/hooks"; +import { useDisclosure, useTimeout } from "@mantine/hooks"; import type { IconProps } from "@tabler/icons-react"; import { IconAlertTriangle, @@ -40,9 +40,6 @@ import { MantineReactTable, useMantineReactTable } from "mantine-react-table"; import { clientApi } from "@homarr/api/client"; import { useIntegrationsWithInteractAccess } from "@homarr/auth/client"; import { humanFileSize } from "@homarr/common"; -import type { Modify } from "@homarr/common/types"; -import type { Integration } from "@homarr/db/schema/sqlite"; -import type { IntegrationKindByCategory } from "@homarr/definitions"; import { getIconUrl, getIntegrationKindsByCategory } from "@homarr/definitions"; import type { DownloadClientJobsAndStatus, @@ -91,30 +88,35 @@ export default function DownloadClientsWidget({ isEditMode, integrationIds, options, - serverData, setOptions, }: WidgetComponentProps<"downloads">) { const integrationsWithInteractions = useIntegrationsWithInteractAccess().flatMap(({ id }) => integrationIds.includes(id) ? [id] : [], ); - const [currentItems, currentItemsHandlers] = useListState<{ - integration: Modify }>; - timestamp: Date; - data: DownloadClientJobsAndStatus | null; - }>( - //Automatically invalidate data older than 30 seconds - serverData?.initialData?.map((item) => - dayjs().diff(item.timestamp) < invalidateTime ? item : { ...item, timestamp: new Date(0), data: null }, - ) ?? [], + const [currentItems] = clientApi.widget.downloads.getJobsAndStatuses.useSuspenseQuery( + { + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + select(data) { + return data.map((item) => + dayjs().diff(item.timestamp) < invalidateTime ? item : { ...item, timestamp: new Date(0), data: null }, + ); + }, + }, ); + const utils = clientApi.useUtils(); //Invalidate all data after no update for 30 seconds using timer const invalidationTimer = useTimeout( () => { - currentItemsHandlers.applyWhere( - () => true, - (item) => ({ ...item, timestamp: new Date(0), data: null }), + utils.widget.downloads.getJobsAndStatuses.setData({ integrationIds }, (prevData) => + prevData?.map((item) => ({ ...item, timestamp: new Date(0), data: null })), ); }, invalidateTime, @@ -146,20 +148,24 @@ export default function DownloadClientsWidget({ //Don't update already invalid data (new Date (0)) .filter(({ timestamp }) => dayjs().diff(timestamp) > invalidateTime && timestamp > new Date(0)) .map(({ integration }) => integration.id); - currentItemsHandlers.applyWhere( - ({ integration }) => invalidIndexes.includes(integration.id), - //Set date to now so it won't update that integration for at least 30 seconds - (item) => ({ ...item, timestamp: new Date(0), data: null }), + utils.widget.downloads.getJobsAndStatuses.setData({ integrationIds }, (prevData) => + prevData?.map((item) => + invalidIndexes.includes(item.integration.id) ? item : { ...item, timestamp: new Date(0), data: null }, + ), ); - //Find id to update - const updateIndex = currentItems.findIndex((pair) => pair.integration.id === data.integration.id); - if (updateIndex >= 0) { - //Update found index - currentItemsHandlers.setItem(updateIndex, data); - } else if (integrationIds.includes(data.integration.id)) { - //Append index not found (new integration) - currentItemsHandlers.append(data); - } + utils.widget.downloads.getJobsAndStatuses.setData({ integrationIds }, (prevData) => { + const updateIndex = currentItems.findIndex((pair) => pair.integration.id === data.integration.id); + if (updateIndex >= 0) { + //Update found index + return prevData?.map((pair, index) => (index === updateIndex ? data : pair)); + } else if (integrationIds.includes(data.integration.id)) { + //Append index not found (new integration) + return [...(prevData ?? []), data]; + } + + return undefined; + }); + //Reset no update timer invalidationTimer.clear(); invalidationTimer.start(); diff --git a/packages/widgets/src/downloads/index.ts b/packages/widgets/src/downloads/index.ts index 1aa15f359..b6ea1ef6a 100644 --- a/packages/widgets/src/downloads/index.ts +++ b/packages/widgets/src/downloads/index.ts @@ -31,7 +31,7 @@ const columnsSort = columnsList.filter((column) => sortingExclusion.some((exclusion) => exclusion !== column), ) as Exclude; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("downloads", { +export const { definition, componentLoader } = createWidgetDefinition("downloads", { icon: IconDownload, options: optionsBuilder.from( (factory) => ({ @@ -105,6 +105,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef }, ), supportedIntegrations: getIntegrationKindsByCategory("downloadClient"), -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/downloads/serverData.ts b/packages/widgets/src/downloads/serverData.ts deleted file mode 100644 index 8259fc5ac..000000000 --- a/packages/widgets/src/downloads/serverData.ts +++ /dev/null @@ -1,21 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps<"downloads">) { - if (integrationIds.length === 0) { - return { - initialData: undefined, - }; - } - - const jobsAndStatuses = await api.widget.downloads.getJobsAndStatuses({ - integrationIds, - }); - - return { - initialData: jobsAndStatuses, - }; -} diff --git a/packages/widgets/src/health-monitoring/component.tsx b/packages/widgets/src/health-monitoring/component.tsx index 5bea4996a..dec33ff08 100644 --- a/packages/widgets/src/health-monitoring/component.tsx +++ b/packages/widgets/src/health-monitoring/component.tsx @@ -17,7 +17,7 @@ import { Text, Tooltip, } from "@mantine/core"; -import { useDisclosure, useElementSize, useListState } from "@mantine/hooks"; +import { useDisclosure, useElementSize } from "@mantine/hooks"; import { IconBrain, IconClock, @@ -30,19 +30,27 @@ import { IconVersions, } from "@tabler/icons-react"; +import { clientApi } from "@homarr/api/client"; import type { TranslationFunction } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; import { NoIntegrationSelectedError } from "../errors"; -export default function HealthMonitoringWidget({ - options, - integrationIds, - serverData, -}: WidgetComponentProps<"healthMonitoring">) { +export default function HealthMonitoringWidget({ options, integrationIds }: WidgetComponentProps<"healthMonitoring">) { const t = useI18n(); - const [healthData] = useListState(serverData?.initialData ?? []); + const [healthData] = clientApi.widget.healthMonitoring.getHealthStatus.useSuspenseQuery( + { + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + select: (data) => data.filter((health) => health !== null), + }, + ); const [opened, { open, close }] = useDisclosure(false); if (integrationIds.length === 0) { diff --git a/packages/widgets/src/health-monitoring/index.ts b/packages/widgets/src/health-monitoring/index.ts index 3e7f9c548..5ad3c06cc 100644 --- a/packages/widgets/src/health-monitoring/index.ts +++ b/packages/widgets/src/health-monitoring/index.ts @@ -3,7 +3,7 @@ import { IconHeartRateMonitor, IconServerOff } from "@tabler/icons-react"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("healthMonitoring", { +export const { definition, componentLoader } = createWidgetDefinition("healthMonitoring", { icon: IconHeartRateMonitor, options: optionsBuilder.from((factory) => ({ fahrenheit: factory.switch({ @@ -26,6 +26,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef message: (t) => t("widget.healthMonitoring.error.internalServerError"), }, }, -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/health-monitoring/serverData.ts b/packages/widgets/src/health-monitoring/serverData.ts deleted file mode 100644 index 3e68f587a..000000000 --- a/packages/widgets/src/health-monitoring/serverData.ts +++ /dev/null @@ -1,27 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps<"healthMonitoring">) { - if (integrationIds.length === 0) { - return { - initialData: [], - }; - } - - try { - const currentHealthInfo = await api.widget.healthMonitoring.getHealthStatus({ - integrationIds, - }); - - return { - initialData: currentHealthInfo.filter((health) => health !== null), - }; - } catch { - return { - initialData: [], - }; - } -} diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index 645ba1df5..1f3050285 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -30,8 +30,6 @@ export { reduceWidgetOptionsWithDefaultValues } from "./options"; export type { WidgetDefinition } from "./definition"; export { WidgetEditModal } from "./modals/widget-edit-modal"; -export { useServerDataFor } from "./server/provider"; -export { GlobalItemServerDataRunner } from "./server/runner"; export type { WidgetComponentProps }; export const widgetImports = { diff --git a/packages/widgets/src/indexer-manager/component.tsx b/packages/widgets/src/indexer-manager/component.tsx index 6e487af5a..59b29bc7b 100644 --- a/packages/widgets/src/indexer-manager/component.tsx +++ b/packages/widgets/src/indexer-manager/component.tsx @@ -1,25 +1,26 @@ "use client"; -import { useState } from "react"; import { Anchor, Button, Card, Container, Flex, Group, ScrollArea, Text } from "@mantine/core"; import { IconCircleCheck, IconCircleX, IconReportSearch, IconTestPipe } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; -import type { Indexer } from "@homarr/integrations/types"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; import { NoIntegrationSelectedError } from "../errors"; -export default function IndexerManagerWidget({ - options, - integrationIds, - serverData, -}: WidgetComponentProps<"indexerManager">) { +export default function IndexerManagerWidget({ options, integrationIds }: WidgetComponentProps<"indexerManager">) { const t = useI18n(); - const [indexersData, setIndexersData] = useState<{ integrationId: string; indexers: Indexer[] }[]>( - serverData?.initialData ?? [], + const [indexersData] = clientApi.widget.indexerManager.getIndexersStatus.useSuspenseQuery( + { integrationIds }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + }, ); + const utils = clientApi.useUtils(); const { mutate: testAll, isPending } = clientApi.widget.indexerManager.testAllIndexers.useMutation(); @@ -27,11 +28,11 @@ export default function IndexerManagerWidget({ { integrationIds }, { onData(newData) { - setIndexersData((prevData) => { - return prevData.map((item) => + utils.widget.indexerManager.getIndexersStatus.setData({ integrationIds }, (previousData) => + previousData?.map((item) => item.integrationId === newData.integrationId ? { ...item, indexers: newData.indexers } : item, - ); - }); + ), + ); }, }, ); diff --git a/packages/widgets/src/indexer-manager/index.ts b/packages/widgets/src/indexer-manager/index.ts index 9885a1764..d0539194e 100644 --- a/packages/widgets/src/indexer-manager/index.ts +++ b/packages/widgets/src/indexer-manager/index.ts @@ -5,7 +5,7 @@ import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { createWidgetDefinition } from "../definition"; import { optionsBuilder } from "../options"; -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("indexerManager", { +export const { definition, componentLoader } = createWidgetDefinition("indexerManager", { icon: IconReportSearch, options: optionsBuilder.from((factory) => ({ openIndexerSiteInNewTab: factory.switch({ @@ -19,6 +19,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef message: (t) => t("widget.indexerManager.error.internalServerError"), }, }, -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/indexer-manager/serverData.ts b/packages/widgets/src/indexer-manager/serverData.ts deleted file mode 100644 index 4ec1c92d5..000000000 --- a/packages/widgets/src/indexer-manager/serverData.ts +++ /dev/null @@ -1,27 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps<"indexerManager">) { - if (integrationIds.length === 0) { - return { - initialData: [], - }; - } - - try { - const currentIndexers = await api.widget.indexerManager.getIndexersStatus({ - integrationIds, - }); - - return { - initialData: currentIndexers, - }; - } catch { - return { - initialData: [], - }; - } -} diff --git a/packages/widgets/src/media-requests/list/component.tsx b/packages/widgets/src/media-requests/list/component.tsx index 23208d209..bc6df6b25 100644 --- a/packages/widgets/src/media-requests/list/component.tsx +++ b/packages/widgets/src/media-requests/list/component.tsx @@ -15,30 +15,26 @@ export default function MediaServerWidget({ integrationIds, isEditMode, options, - serverData, itemId, }: WidgetComponentProps<"mediaRequests-requestList">) { const t = useScopedI18n("widget.mediaRequests-requestList"); - const isQueryEnabled = Boolean(itemId); - const { data: mediaRequests, isError: _isError } = clientApi.widget.mediaRequests.getLatestRequests.useQuery( + const [mediaRequests] = clientApi.widget.mediaRequests.getLatestRequests.useSuspenseQuery( { integrationIds, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion itemId: itemId!, }, { - initialData: !serverData ? undefined : serverData.initialData, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, - enabled: integrationIds.length > 0 && isQueryEnabled, }, ); const sortedMediaRequests = useMemo( () => mediaRequests - ?.filter((group) => group != null) + .filter((group) => group != null) .flatMap((group) => group.data) .flatMap(({ medias, integration }) => medias.map((media) => ({ ...media, integrationId: integration.id }))) .sort(({ status: statusA }, { status: statusB }) => { @@ -49,7 +45,7 @@ export default function MediaServerWidget({ return 1; } return 0; - }) ?? [], + }), [mediaRequests, integrationIds], ); diff --git a/packages/widgets/src/media-requests/list/index.ts b/packages/widgets/src/media-requests/list/index.ts index 47ad762d9..93243e0df 100644 --- a/packages/widgets/src/media-requests/list/index.ts +++ b/packages/widgets/src/media-requests/list/index.ts @@ -5,7 +5,7 @@ import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { createWidgetDefinition } from "../../definition"; import { optionsBuilder } from "../../options"; -export const { componentLoader, definition, serverDataLoader } = createWidgetDefinition("mediaRequests-requestList", { +export const { componentLoader, definition } = createWidgetDefinition("mediaRequests-requestList", { icon: IconZoomQuestion, options: optionsBuilder.from((factory) => ({ linksTargetNewTab: factory.switch({ @@ -13,6 +13,4 @@ export const { componentLoader, definition, serverDataLoader } = createWidgetDef }), })), supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"), -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-requests/list/serverData.ts b/packages/widgets/src/media-requests/list/serverData.ts deleted file mode 100644 index 8784e4dd3..000000000 --- a/packages/widgets/src/media-requests/list/serverData.ts +++ /dev/null @@ -1,22 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../../definition"; - -export default async function getServerDataAsync({ integrationIds, itemId }: WidgetProps<"mediaRequests-requestList">) { - if (integrationIds.length === 0 || !itemId) { - return { - initialData: undefined, - }; - } - - const requests = await api.widget.mediaRequests.getLatestRequests({ - integrationIds, - itemId, - }); - - return { - initialData: requests.filter((group) => group != null), - }; -} diff --git a/packages/widgets/src/media-requests/stats/component.tsx b/packages/widgets/src/media-requests/stats/component.tsx index 75296856a..288bf1dc8 100644 --- a/packages/widgets/src/media-requests/stats/component.tsx +++ b/packages/widgets/src/media-requests/stats/component.tsx @@ -27,30 +27,26 @@ import classes from "./component.module.css"; export default function MediaServerWidget({ integrationIds, isEditMode, - serverData, itemId, }: WidgetComponentProps<"mediaRequests-requestStats">) { const t = useScopedI18n("widget.mediaRequests-requestStats"); - const isQueryEnabled = Boolean(itemId); - const { data: requestStats, isError: _isError } = clientApi.widget.mediaRequests.getStats.useQuery( + const [requestStats] = clientApi.widget.mediaRequests.getStats.useSuspenseQuery( { integrationIds, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion itemId: itemId!, }, { - initialData: !serverData ? undefined : serverData.initialData, refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, - enabled: integrationIds.length > 0 && isQueryEnabled, }, ); const { width, height, ref } = useElementSize(); const baseData = useMemo( - () => requestStats?.filter((group) => group != null).flatMap((group) => group.data) ?? [], + () => requestStats.filter((group) => group != null).flatMap((group) => group.data), [requestStats], ); diff --git a/packages/widgets/src/media-requests/stats/index.ts b/packages/widgets/src/media-requests/stats/index.ts index 3d5576147..b8504c7d2 100644 --- a/packages/widgets/src/media-requests/stats/index.ts +++ b/packages/widgets/src/media-requests/stats/index.ts @@ -4,10 +4,8 @@ import { getIntegrationKindsByCategory } from "@homarr/definitions"; import { createWidgetDefinition } from "../../definition"; -export const { componentLoader, definition, serverDataLoader } = createWidgetDefinition("mediaRequests-requestStats", { +export const { componentLoader, definition } = createWidgetDefinition("mediaRequests-requestStats", { icon: IconChartBar, options: {}, supportedIntegrations: getIntegrationKindsByCategory("mediaRequest"), -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-requests/stats/serverData.ts b/packages/widgets/src/media-requests/stats/serverData.ts deleted file mode 100644 index a534e0a6d..000000000 --- a/packages/widgets/src/media-requests/stats/serverData.ts +++ /dev/null @@ -1,25 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../../definition"; - -export default async function getServerDataAsync({ - integrationIds, - itemId, -}: WidgetProps<"mediaRequests-requestStats">) { - if (integrationIds.length === 0 || !itemId) { - return { - initialData: undefined, - }; - } - - const stats = await api.widget.mediaRequests.getStats({ - integrationIds, - itemId, - }); - - return { - initialData: stats.filter((group) => group != null), - }; -} diff --git a/packages/widgets/src/media-server/component.tsx b/packages/widgets/src/media-server/component.tsx index f70aa856c..b68b7f09c 100644 --- a/packages/widgets/src/media-server/component.tsx +++ b/packages/widgets/src/media-server/component.tsx @@ -2,7 +2,6 @@ import { useMemo } from "react"; import { Avatar, Box, Group, Text } from "@mantine/core"; -import { useListState } from "@mantine/hooks"; import type { MRT_ColumnDef } from "mantine-react-table"; import { MantineReactTable } from "mantine-react-table"; @@ -12,14 +11,19 @@ import { useTranslatedMantineReactTable } from "@homarr/ui/hooks"; import type { WidgetComponentProps } from "../definition"; -export default function MediaServerWidget({ - serverData, - integrationIds, - isEditMode, -}: WidgetComponentProps<"mediaServer">) { - const [currentStreams, currentStreamsHandlers] = useListState<{ integrationId: string; sessions: StreamSession[] }>( - serverData?.initialData ?? [], +export default function MediaServerWidget({ integrationIds, isEditMode }: WidgetComponentProps<"mediaServer">) { + const [currentStreams] = clientApi.widget.mediaServer.getCurrentStreams.useSuspenseQuery( + { + integrationIds, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + }, ); + const utils = clientApi.useUtils(); + const columns = useMemo[]>( () => [ { @@ -62,15 +66,17 @@ export default function MediaServerWidget({ { enabled: !isEditMode, onData(data) { - currentStreamsHandlers.applyWhere( - (pair) => pair.integrationId === data.integrationId, - (pair) => { - return { - ...pair, - sessions: data.data, - }; - }, - ); + utils.widget.mediaServer.getCurrentStreams.setData({ integrationIds }, (previousData) => { + return previousData?.map((pair) => { + if (pair.integrationId === data.integrationId) { + return { + ...pair, + sessions: data.data, + }; + } + return pair; + }); + }); }, }, ); diff --git a/packages/widgets/src/media-server/index.ts b/packages/widgets/src/media-server/index.ts index f5efac742..e69919927 100644 --- a/packages/widgets/src/media-server/index.ts +++ b/packages/widgets/src/media-server/index.ts @@ -2,10 +2,8 @@ import { IconVideo } from "@tabler/icons-react"; import { createWidgetDefinition } from "../definition"; -export const { componentLoader, definition, serverDataLoader } = createWidgetDefinition("mediaServer", { +export const { componentLoader, definition } = createWidgetDefinition("mediaServer", { icon: IconVideo, options: {}, supportedIntegrations: ["jellyfin"], -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/media-server/serverData.ts b/packages/widgets/src/media-server/serverData.ts deleted file mode 100644 index 952cfadb4..000000000 --- a/packages/widgets/src/media-server/serverData.ts +++ /dev/null @@ -1,21 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ integrationIds }: WidgetProps<"mediaServer">) { - if (integrationIds.length === 0) { - return { - initialData: [], - }; - } - - const currentStreams = await api.widget.mediaServer.getCurrentStreams({ - integrationIds, - }); - - return { - initialData: currentStreams, - }; -} diff --git a/packages/widgets/src/rssFeed/component.tsx b/packages/widgets/src/rssFeed/component.tsx index 28d39b7bf..eb3780149 100644 --- a/packages/widgets/src/rssFeed/component.tsx +++ b/packages/widgets/src/rssFeed/component.tsx @@ -3,15 +3,29 @@ import { Card, Flex, Group, Image, ScrollArea, Stack, Text } from "@mantine/core import { IconClock } from "@tabler/icons-react"; import dayjs from "dayjs"; +import { clientApi } from "@homarr/api/client"; + import type { WidgetComponentProps } from "../definition"; import classes from "./component.module.scss"; -export default function RssFeed({ serverData, options }: WidgetComponentProps<"rssFeed">) { - if (serverData?.initialData === undefined) { - return null; - } +export default function RssFeed({ options, itemId }: WidgetComponentProps<"rssFeed">) { + const [rssFeeds] = clientApi.widget.rssFeed.getFeeds.useSuspenseQuery( + { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + itemId: itemId!, + }, + { + refetchOnMount: false, + refetchOnWindowFocus: false, + refetchOnReconnect: false, + retry: false, + select(data) { + return data?.data ?? []; + }, + }, + ); - const entries = serverData.initialData + const entries = rssFeeds .filter((feedGroup) => feedGroup.feed.entries !== undefined) .flatMap((feedGroup) => feedGroup.feed.entries) .filter((entry) => entry !== undefined) diff --git a/packages/widgets/src/rssFeed/index.ts b/packages/widgets/src/rssFeed/index.ts index 6751bb859..5d61b2aeb 100644 --- a/packages/widgets/src/rssFeed/index.ts +++ b/packages/widgets/src/rssFeed/index.ts @@ -11,7 +11,7 @@ import { optionsBuilder } from "../options"; * - https://datatracker.ietf.org/doc/html/rfc5023 * - https://www.jsonfeed.org/version/1.1/ */ -export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("rssFeed", { +export const { definition, componentLoader } = createWidgetDefinition("rssFeed", { icon: IconRss, options: optionsBuilder.from((factory) => ({ feedUrls: factory.multiText({ @@ -27,6 +27,4 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef validate: z.number().min(1).max(9999), }), })), -}) - .withServerData(() => import("./serverData")) - .withDynamicImport(() => import("./component")); +}).withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/rssFeed/serverData.ts b/packages/widgets/src/rssFeed/serverData.ts deleted file mode 100644 index a583a9141..000000000 --- a/packages/widgets/src/rssFeed/serverData.ts +++ /dev/null @@ -1,21 +0,0 @@ -"use server"; - -import { api } from "@homarr/api/server"; - -import type { WidgetProps } from "../definition"; - -export default async function getServerDataAsync({ itemId }: WidgetProps<"rssFeed">) { - if (!itemId) { - return { - initialData: undefined, - lastUpdatedAt: null, - }; - } - const data = await api.widget.rssFeed.getFeeds({ - itemId, - }); - return { - initialData: data?.data, - lastUpdatedAt: data?.timestamp, - }; -} diff --git a/packages/widgets/src/server/client.tsx b/packages/widgets/src/server/client.tsx deleted file mode 100644 index ceb43c313..000000000 --- a/packages/widgets/src/server/client.tsx +++ /dev/null @@ -1,13 +0,0 @@ -"use client"; - -import { useServerDataInitializer } from "./provider"; - -interface Props { - id: string; - serverData: Record | undefined; -} - -export const ClientServerDataInitalizer = ({ id, serverData }: Props) => { - useServerDataInitializer(id, serverData); - return null; -}; diff --git a/packages/widgets/src/server/provider.tsx b/packages/widgets/src/server/provider.tsx deleted file mode 100644 index f2e745be0..000000000 --- a/packages/widgets/src/server/provider.tsx +++ /dev/null @@ -1,74 +0,0 @@ -"use client"; - -import type { PropsWithChildren } from "react"; -import { createContext, useContext, useEffect, useState } from "react"; - -type Data = Record< - string, - { - data: Record | undefined; - isReady: boolean; - } ->; - -interface GlobalItemServerDataContext { - setItemServerData: (id: string, data: Record | undefined) => void; - data: Data; - initalItemIds: string[]; -} - -const GlobalItemServerDataContext = createContext(null); - -interface Props { - initalItemIds: string[]; -} - -export const GlobalItemServerDataProvider = ({ children, initalItemIds }: PropsWithChildren) => { - const [data, setData] = useState({}); - - const setItemServerData = (id: string, itemData: Record | undefined) => { - setData((prev) => ({ - ...prev, - [id]: { - data: itemData, - isReady: true, - }, - })); - }; - - return ( - - {children} - - ); -}; - -export const useServerDataFor = (id: string) => { - const context = useContext(GlobalItemServerDataContext); - - if (!context) { - throw new Error("GlobalItemServerDataProvider is required"); - } - - // When the item is not in the initial list, it means the data can not come from the server - if (!context.initalItemIds.includes(id)) { - return { - data: undefined, - isReady: true, - }; - } - - return context.data[id]; -}; - -export const useServerDataInitializer = (id: string, serverData: Record | undefined) => { - const context = useContext(GlobalItemServerDataContext); - - if (!context) { - throw new Error("GlobalItemServerDataProvider is required"); - } - - useEffect(() => { - context.setItemServerData(id, serverData); - }, []); -}; diff --git a/packages/widgets/src/server/runner.tsx b/packages/widgets/src/server/runner.tsx deleted file mode 100644 index 91effec0f..000000000 --- a/packages/widgets/src/server/runner.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import type { PropsWithChildren } from "react"; -import { Suspense } from "react"; - -import type { RouterOutputs } from "@homarr/api"; - -import { reduceWidgetOptionsWithDefaultValues, widgetImports } from ".."; -import { ClientServerDataInitalizer } from "./client"; -import { GlobalItemServerDataProvider } from "./provider"; - -type Board = RouterOutputs["board"]["getHomeBoard"]; - -type Props = PropsWithChildren<{ - shouldRun: boolean; - board: Board; -}>; - -export const GlobalItemServerDataRunner = ({ board, shouldRun, children }: Props) => { - if (!shouldRun) return children; - - const allItems = board.sections.flatMap((section) => section.items); - - return ( - id)}> - {allItems.map((item) => ( - - - - ))} - {children} - - ); -}; - -interface ItemDataLoaderProps { - item: Board["sections"][number]["items"][number]; -} - -const ItemDataLoader = async ({ item }: ItemDataLoaderProps) => { - const widgetImport = widgetImports[item.kind]; - if (!("serverDataLoader" in widgetImport) || !widgetImport.serverDataLoader) { - return ; - } - const loader = await widgetImport.serverDataLoader(); - const optionsWithDefault = reduceWidgetOptionsWithDefaultValues(item.kind, item.options); - const data = await loader.default({ - ...item, - options: optionsWithDefault as never, - itemId: item.id, - }); - return ; -}; From 348687670d18062254e8089572f824f33a6f0894 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sat, 12 Oct 2024 00:20:47 +0200 Subject: [PATCH 02/43] feat: user setting ping icons (#1277) * feat: user setting ping icons * fix: format issues * test: adjust test to match expectations --- .../_components/_ping-icons-enabled.tsx | 66 + .../manage/users/[userId]/general/page.tsx | 6 + packages/api/src/router/test/user.spec.ts | 48 +- packages/api/src/router/user.ts | 36 +- .../mysql/0011_freezing_banshee.sql | 1 + .../migrations/mysql/meta/0011_snapshot.json | 1497 +++++++++++++++++ .../db/migrations/mysql/meta/_journal.json | 7 + .../migrations/sqlite/0011_classy_angel.sql | 1 + .../migrations/sqlite/meta/0011_snapshot.json | 1430 ++++++++++++++++ .../db/migrations/sqlite/meta/_journal.json | 7 + packages/db/package.json | 2 + packages/db/schema/mysql.ts | 1 + packages/db/schema/sqlite.ts | 1 + packages/translation/src/lang/en.ts | 14 + packages/validation/src/user.ts | 5 + packages/widgets/src/app/component.tsx | 3 +- packages/widgets/src/app/ping/ping-dot.tsx | 28 +- .../widgets/src/app/ping/ping-indicator.tsx | 6 +- 18 files changed, 3104 insertions(+), 55 deletions(-) create mode 100644 apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx create mode 100644 packages/db/migrations/mysql/0011_freezing_banshee.sql create mode 100644 packages/db/migrations/mysql/meta/0011_snapshot.json create mode 100644 packages/db/migrations/sqlite/0011_classy_angel.sql create mode 100644 packages/db/migrations/sqlite/meta/0011_snapshot.json diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx new file mode 100644 index 000000000..1631189dc --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_ping-icons-enabled.tsx @@ -0,0 +1,66 @@ +"use client"; + +import { Button, Group, Stack, Switch } from "@mantine/core"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/client"; +import { revalidatePathActionAsync } from "@homarr/common/client"; +import { useZodForm } from "@homarr/form"; +import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; +import { useI18n } from "@homarr/translation/client"; +import type { z } from "@homarr/validation"; +import { validation } from "@homarr/validation"; + +interface PingIconsEnabledProps { + user: RouterOutputs["user"]["getById"]; +} + +export const PingIconsEnabled = ({ user }: PingIconsEnabledProps) => { + const t = useI18n(); + const { mutate, isPending } = clientApi.user.changePingIconsEnabled.useMutation({ + async onSettled() { + await revalidatePathActionAsync(`/manage/users/${user.id}`); + }, + onSuccess(_, variables) { + form.setInitialValues({ + pingIconsEnabled: variables.pingIconsEnabled, + }); + showSuccessNotification({ + message: t("user.action.changePingIconsEnabled.notification.success.message"), + }); + }, + onError() { + showErrorNotification({ + message: t("user.action.changePingIconsEnabled.notification.error.message"), + }); + }, + }); + const form = useZodForm(validation.user.pingIconsEnabled, { + initialValues: { + pingIconsEnabled: user.pingIconsEnabled, + }, + }); + + const handleSubmit = (values: FormType) => { + mutate({ + id: user.id, + ...values, + }); + }; + + return ( +
+ + + + + + + +
+ ); +}; + +type FormType = z.infer; diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx index e29a140f3..fa26d7bd1 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/page.tsx @@ -14,6 +14,7 @@ import { canAccessUserEditPage } from "../access"; import { ChangeHomeBoardForm } from "./_components/_change-home-board"; import { DeleteUserButton } from "./_components/_delete-user-button"; import { FirstDayOfWeek } from "./_components/_first-day-of-week"; +import { PingIconsEnabled } from "./_components/_ping-icons-enabled"; import { UserProfileAvatarForm } from "./_components/_profile-avatar-form"; import { UserProfileForm } from "./_components/_profile-form"; @@ -99,6 +100,11 @@ export default async function EditUserPage({ params }: Props) { + + {tGeneral("item.accessibility")} + + + {isCredentialsUser && ( { const user = await db.select().from(schema.users).where(eq(schema.users.id, defaultOwnerId)); expect(user).toHaveLength(1); - expect(user[0]).toStrictEqual({ + expect(user[0]).containSubset({ id: defaultOwnerId, name: "ABC", email: "abc@gmail.com", emailVerified, - salt: null, - password: null, - image: null, - homeBoardId: null, - provider: "credentials", - colorScheme: "auto", - firstDayOfWeek: 1, }); }); @@ -289,18 +282,11 @@ describe("editProfile shoud update user", () => { const user = await db.select().from(schema.users).where(eq(schema.users.id, defaultOwnerId)); expect(user).toHaveLength(1); - expect(user[0]).toStrictEqual({ + expect(user[0]).containSubset({ id: defaultOwnerId, name: "ABC", email: "myNewEmail@gmail.com", emailVerified: null, - salt: null, - password: null, - image: null, - homeBoardId: null, - provider: "credentials", - colorScheme: "auto", - firstDayOfWeek: 1, }); }); }); @@ -317,40 +303,14 @@ describe("delete should delete user", () => { { id: createId(), name: "User 1", - email: null, - emailVerified: null, - image: null, - password: null, - salt: null, - homeBoardId: null, - provider: "ldap" as const, - colorScheme: "auto" as const, - firstDayOfWeek: 1 as const, }, { id: defaultOwnerId, name: "User 2", - email: null, - emailVerified: null, - image: null, - password: null, - salt: null, - homeBoardId: null, - colorScheme: "auto" as const, - firstDayOfWeek: 1 as const, }, { id: createId(), name: "User 3", - email: null, - emailVerified: null, - image: null, - password: null, - salt: null, - homeBoardId: null, - provider: "oidc" as const, - colorScheme: "auto" as const, - firstDayOfWeek: 1 as const, }, ]; @@ -359,6 +319,8 @@ describe("delete should delete user", () => { await caller.delete(defaultOwnerId); const usersInDb = await db.select().from(schema.users); - expect(usersInDb).toStrictEqual([initialUsers[0], initialUsers[2]]); + expect(usersInDb).toHaveLength(2); + expect(usersInDb[0]).containSubset(initialUsers[0]); + expect(usersInDb[1]).containSubset(initialUsers[2]); }); }); diff --git a/packages/api/src/router/user.ts b/packages/api/src/router/user.ts index d1a9719f3..805140540 100644 --- a/packages/api/src/router/user.ts +++ b/packages/api/src/router/user.ts @@ -209,6 +209,7 @@ export const userRouter = createTRPCRouter({ provider: true, homeBoardId: true, firstDayOfWeek: true, + pingIconsEnabled: true, }, where: eq(users.id, input.userId), }); @@ -376,6 +377,39 @@ export const userRouter = createTRPCRouter({ }) .where(eq(users.id, ctx.session.user.id)); }), + getPingIconsEnabledOrDefault: publicProcedure.query(async ({ ctx }) => { + if (!ctx.session?.user) { + return false; + } + + const user = await ctx.db.query.users.findFirst({ + columns: { + id: true, + pingIconsEnabled: true, + }, + where: eq(users.id, ctx.session.user.id), + }); + + return user?.pingIconsEnabled ?? false; + }), + changePingIconsEnabled: protectedProcedure + .input(validation.user.pingIconsEnabled.and(validation.common.byId)) + .mutation(async ({ input, ctx }) => { + // Only admins can change other users ping icons enabled + if (!ctx.session.user.permissions.includes("admin") && ctx.session.user.id !== input.id) { + throw new TRPCError({ + code: "NOT_FOUND", + message: "User not found", + }); + } + + await ctx.db + .update(users) + .set({ + pingIconsEnabled: input.pingIconsEnabled, + }) + .where(eq(users.id, ctx.session.user.id)); + }), getFirstDayOfWeekForUserOrDefault: publicProcedure.query(async ({ ctx }) => { if (!ctx.session?.user) { return 1 as const; @@ -394,7 +428,7 @@ export const userRouter = createTRPCRouter({ changeFirstDayOfWeek: protectedProcedure .input(validation.user.firstDayOfWeek.and(validation.common.byId)) .mutation(async ({ input, ctx }) => { - // Only admins can change other users' passwords + // Only admins can change other users first day of week if (!ctx.session.user.permissions.includes("admin") && ctx.session.user.id !== input.id) { throw new TRPCError({ code: "NOT_FOUND", diff --git a/packages/db/migrations/mysql/0011_freezing_banshee.sql b/packages/db/migrations/mysql/0011_freezing_banshee.sql new file mode 100644 index 000000000..f088e6b9d --- /dev/null +++ b/packages/db/migrations/mysql/0011_freezing_banshee.sql @@ -0,0 +1 @@ +ALTER TABLE `user` ADD `pingIconsEnabled` boolean DEFAULT false NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/mysql/meta/0011_snapshot.json b/packages/db/migrations/mysql/meta/0011_snapshot.json new file mode 100644 index 000000000..afa00d67d --- /dev/null +++ b/packages/db/migrations/mysql/meta/0011_snapshot.json @@ -0,0 +1,1497 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "c2595909-0d92-4b2f-b934-6792271f52c0", + "prevId": "ea24896b-e311-49b3-855b-e50b224e7719", + "tables": { + "account": { + "name": "account", + "columns": { + "userId": { + "name": "userId", + "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 + }, + "providerAccountId": { + "name": "providerAccountId", + "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": ["userId"], + "isUnique": false + } + }, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_providerAccountId_pk": { + "name": "account_provider_providerAccountId_pk", + "columns": ["provider", "providerAccountId"] + } + }, + "uniqueConstraints": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "apiKey": { + "name": "apiKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "apiKey_userId_user_id_fk": { + "name": "apiKey_userId_user_id_fk", + "tableFrom": "apiKey", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "apiKey_id": { + "name": "apiKey_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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 + } + }, + "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"] + } + } + }, + "groupMember": { + "name": "groupMember", + "columns": { + "groupId": { + "name": "groupId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupMember_groupId_group_id_fk": { + "name": "groupMember_groupId_group_id_fk", + "tableFrom": "groupMember", + "tableTo": "group", + "columnsFrom": ["groupId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "groupMember_userId_user_id_fk": { + "name": "groupMember_userId_user_id_fk", + "tableFrom": "groupMember", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "groupMember_groupId_userId_pk": { + "name": "groupMember_groupId_userId_pk", + "columns": ["groupId", "userId"] + } + }, + "uniqueConstraints": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "groupId": { + "name": "groupId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupPermission_groupId_group_id_fk": { + "name": "groupPermission_groupId_group_id_fk", + "tableFrom": "groupPermission", + "tableTo": "group", + "columnsFrom": ["groupId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "iconRepository_id": { + "name": "iconRepository_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "iconRepository_slug": { + "name": "iconRepository_slug", + "type": "varchar(150)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "iconRepository_iconRepository_id": { + "name": "iconRepository_iconRepository_id", + "columns": ["iconRepository_id"] + } + }, + "uniqueConstraints": {} + }, + "icon": { + "name": "icon", + "columns": { + "icon_id": { + "name": "icon_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_name": { + "name": "icon_name", + "type": "varchar(250)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_checksum": { + "name": "icon_checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "iconRepository_id": { + "name": "iconRepository_id", + "type": "varchar(64)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "icon_iconRepository_id_iconRepository_iconRepository_id_fk": { + "name": "icon_iconRepository_id_iconRepository_iconRepository_id_fk", + "tableFrom": "icon", + "tableTo": "iconRepository", + "columnsFrom": ["iconRepository_id"], + "columnsTo": ["iconRepository_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "icon_icon_id": { + "name": "icon_icon_id", + "columns": ["icon_id"] + } + }, + "uniqueConstraints": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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"] + } + } + }, + "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": {} + }, + "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": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "search_engine_id": { + "name": "search_engine_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {} + }, + "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": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "key": { + "name": "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_key": { + "name": "serverSetting_key", + "columns": ["key"] + } + }, + "uniqueConstraints": { + "serverSetting_key_unique": { + "name": "serverSetting_key_unique", + "columns": ["key"] + } + } + }, + "session": { + "name": "session", + "columns": { + "sessionToken": { + "name": "sessionToken", + "type": "varchar(512)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "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": ["userId"], + "isUnique": false + } + }, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "session_sessionToken": { + "name": "session_sessionToken", + "columns": ["sessionToken"] + } + }, + "uniqueConstraints": {} + }, + "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 + }, + "emailVerified": { + "name": "emailVerified", + "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'" + }, + "homeBoardId": { + "name": "homeBoardId", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "colorScheme": { + "name": "colorScheme", + "type": "varchar(5)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'auto'" + }, + "firstDayOfWeek": { + "name": "firstDayOfWeek", + "type": "tinyint", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "pingIconsEnabled": { + "name": "pingIconsEnabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_homeBoardId_board_id_fk": { + "name": "user_homeBoardId_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["homeBoardId"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "user_id": { + "name": "user_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {} + }, + "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": {} + } + }, + "_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 dacc6be5a..0c9a41d33 100644 --- a/packages/db/migrations/mysql/meta/_journal.json +++ b/packages/db/migrations/mysql/meta/_journal.json @@ -78,6 +78,13 @@ "when": 1728142597094, "tag": "0010_melted_pestilence", "breakpoints": true + }, + { + "idx": 11, + "version": "5", + "when": 1728490046896, + "tag": "0011_freezing_banshee", + "breakpoints": true } ] } diff --git a/packages/db/migrations/sqlite/0011_classy_angel.sql b/packages/db/migrations/sqlite/0011_classy_angel.sql new file mode 100644 index 000000000..10f3d6bf5 --- /dev/null +++ b/packages/db/migrations/sqlite/0011_classy_angel.sql @@ -0,0 +1 @@ +ALTER TABLE `user` ADD `pingIconsEnabled` integer DEFAULT false NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/sqlite/meta/0011_snapshot.json b/packages/db/migrations/sqlite/meta/0011_snapshot.json new file mode 100644 index 000000000..b3bf026e0 --- /dev/null +++ b/packages/db/migrations/sqlite/meta/0011_snapshot.json @@ -0,0 +1,1430 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "7c2e4a9e-350a-4551-90d9-bdfa90db58ee", + "prevId": "52be1539-1b06-4581-8347-ce2102e782c7", + "tables": { + "account": { + "name": "account", + "columns": { + "userId": { + "name": "userId", + "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 + }, + "providerAccountId": { + "name": "providerAccountId", + "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": ["userId"], + "isUnique": false + } + }, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "account_provider_providerAccountId_pk": { + "columns": ["provider", "providerAccountId"], + "name": "account_provider_providerAccountId_pk" + } + }, + "uniqueConstraints": {} + }, + "apiKey": { + "name": "apiKey", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "apiKey": { + "name": "apiKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "salt": { + "name": "salt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "apiKey_userId_user_id_fk": { + "name": "apiKey_userId_user_id_fk", + "tableFrom": "apiKey", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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 + } + }, + "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": {} + }, + "groupMember": { + "name": "groupMember", + "columns": { + "groupId": { + "name": "groupId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupMember_groupId_group_id_fk": { + "name": "groupMember_groupId_group_id_fk", + "tableFrom": "groupMember", + "tableTo": "group", + "columnsFrom": ["groupId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "groupMember_userId_user_id_fk": { + "name": "groupMember_userId_user_id_fk", + "tableFrom": "groupMember", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "groupMember_groupId_userId_pk": { + "columns": ["groupId", "userId"], + "name": "groupMember_groupId_userId_pk" + } + }, + "uniqueConstraints": {} + }, + "groupPermission": { + "name": "groupPermission", + "columns": { + "groupId": { + "name": "groupId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "groupPermission_groupId_group_id_fk": { + "name": "groupPermission_groupId_group_id_fk", + "tableFrom": "groupPermission", + "tableTo": "group", + "columnsFrom": ["groupId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {}, + "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": {} + }, + "iconRepository": { + "name": "iconRepository", + "columns": { + "iconRepository_id": { + "name": "iconRepository_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "iconRepository_slug": { + "name": "iconRepository_slug", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "icon": { + "name": "icon", + "columns": { + "icon_id": { + "name": "icon_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "icon_name": { + "name": "icon_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_url": { + "name": "icon_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "icon_checksum": { + "name": "icon_checksum", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "iconRepository_id": { + "name": "iconRepository_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "icon_iconRepository_id_iconRepository_iconRepository_id_fk": { + "name": "icon_iconRepository_id_iconRepository_iconRepository_id_fk", + "tableFrom": "icon", + "tableTo": "iconRepository", + "columnsFrom": ["iconRepository_id"], + "columnsTo": ["iconRepository_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": {} + }, + "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": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {} + }, + "serverSetting": { + "name": "serverSetting", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'{\"json\": {}}'" + } + }, + "indexes": { + "serverSetting_key_unique": { + "name": "serverSetting_key_unique", + "columns": ["key"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "session": { + "name": "session", + "columns": { + "sessionToken": { + "name": "sessionToken", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "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": ["userId"], + "isUnique": false + } + }, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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 + }, + "emailVerified": { + "name": "emailVerified", + "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'" + }, + "homeBoardId": { + "name": "homeBoardId", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "colorScheme": { + "name": "colorScheme", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'auto'" + }, + "firstDayOfWeek": { + "name": "firstDayOfWeek", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "pingIconsEnabled": { + "name": "pingIconsEnabled", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_homeBoardId_board_id_fk": { + "name": "user_homeBoardId_board_id_fk", + "tableFrom": "user", + "tableTo": "board", + "columnsFrom": ["homeBoardId"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "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": {} + } + }, + "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 40d9bf4d0..99b2038fe 100644 --- a/packages/db/migrations/sqlite/meta/_journal.json +++ b/packages/db/migrations/sqlite/meta/_journal.json @@ -78,6 +78,13 @@ "when": 1728142590232, "tag": "0010_gorgeous_stingray", "breakpoints": true + }, + { + "idx": 11, + "version": "6", + "when": 1728490026154, + "tag": "0011_classy_angel", + "breakpoints": true } ] } diff --git a/packages/db/package.json b/packages/db/package.json index 67ffa31ba..f5e38ba7b 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -22,8 +22,10 @@ "lint": "eslint", "migration:mysql:generate": "drizzle-kit generate --config ./configs/mysql.config.ts", "migration:mysql:run": "drizzle-kit migrate --config ./configs/mysql.config.ts", + "migration:mysql:drop": "drizzle-kit drop --config ./configs/mysql.config.ts", "migration:sqlite:generate": "drizzle-kit generate --config ./configs/sqlite.config.ts", "migration:sqlite:run": "drizzle-kit migrate --config ./configs/sqlite.config.ts", + "migration:sqlite:drop": "drizzle-kit drop --config ./configs/sqlite.config.ts", "push:mysql": "drizzle-kit push --config ./configs/mysql.config.ts", "push:sqlite": "drizzle-kit push --config ./configs/sqlite.config.ts", "studio": "drizzle-kit studio --config ./configs/sqlite.config.ts", diff --git a/packages/db/schema/mysql.ts b/packages/db/schema/mysql.ts index 383ac2e5a..ec92ee53b 100644 --- a/packages/db/schema/mysql.ts +++ b/packages/db/schema/mysql.ts @@ -45,6 +45,7 @@ export const users = mysqlTable("user", { }), colorScheme: varchar("colorScheme", { length: 5 }).$type().default("auto").notNull(), firstDayOfWeek: tinyint("firstDayOfWeek").$type().default(1).notNull(), // Defaults to Monday + pingIconsEnabled: boolean("pingIconsEnabled").default(false).notNull(), }); export const accounts = mysqlTable( diff --git a/packages/db/schema/sqlite.ts b/packages/db/schema/sqlite.ts index cec5844c1..2b593b9d5 100644 --- a/packages/db/schema/sqlite.ts +++ b/packages/db/schema/sqlite.ts @@ -46,6 +46,7 @@ export const users = sqliteTable("user", { }), colorScheme: text("colorScheme").$type().default("auto").notNull(), firstDayOfWeek: int("firstDayOfWeek").$type().default(1).notNull(), // Defaults to Monday + pingIconsEnabled: int("pingIconsEnabled", { mode: "boolean" }).default(false).notNull(), }); export const accounts = sqliteTable( diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index f61c5da64..e5e8a64ca 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -48,6 +48,9 @@ export default { homeBoard: { label: "Home board", }, + pingIconsEnabled: { + label: "Use icons for pings", + }, }, error: { usernameTaken: "Username already taken", @@ -116,6 +119,16 @@ export default { }, }, }, + changePingIconsEnabled: { + notification: { + success: { + message: "Ping icons toggled successfully", + }, + error: { + message: "Unable to toggle ping icons", + }, + }, + }, manageAvatar: { changeImage: { label: "Change image", @@ -1703,6 +1716,7 @@ export default { language: "Language & Region", board: "Home board", firstDayOfWeek: "First day of the week", + accessibility: "Accessibility", }, }, security: { diff --git a/packages/validation/src/user.ts b/packages/validation/src/user.ts index e44395e67..566e43363 100644 --- a/packages/validation/src/user.ts +++ b/packages/validation/src/user.ts @@ -108,6 +108,10 @@ const firstDayOfWeekSchema = z.object({ firstDayOfWeek: z.custom((value) => z.number().min(0).max(6).safeParse(value).success), }); +const pingIconsEnabledSchema = z.object({ + pingIconsEnabled: z.boolean(), +}); + export const userSchemas = { signIn: signInSchema, registration: registrationSchema, @@ -121,4 +125,5 @@ export const userSchemas = { changePasswordApi: changePasswordApiSchema, changeColorScheme: changeColorSchemeSchema, firstDayOfWeek: firstDayOfWeekSchema, + pingIconsEnabled: pingIconsEnabledSchema, }; diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx index eec922902..4b4cbe309 100644 --- a/packages/widgets/src/app/component.tsx +++ b/packages/widgets/src/app/component.tsx @@ -3,6 +3,7 @@ import type { PropsWithChildren } from "react"; import { Suspense } from "react"; import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core"; +import { IconLoader } from "@tabler/icons-react"; import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; @@ -59,7 +60,7 @@ export default function AppWidget({ options, isEditMode }: WidgetComponentProps< {options.pingEnabled && app.href ? ( - }> + }> ) : null} diff --git a/packages/widgets/src/app/ping/ping-dot.tsx b/packages/widgets/src/app/ping/ping-dot.tsx index b54262f28..fca47c09b 100644 --- a/packages/widgets/src/app/ping/ping-dot.tsx +++ b/packages/widgets/src/app/ping/ping-dot.tsx @@ -1,23 +1,33 @@ import type { MantineColor } from "@mantine/core"; import { Box, Tooltip } from "@mantine/core"; +import { clientApi } from "@homarr/api/client"; +import type { TablerIcon } from "@homarr/ui"; + interface PingDotProps { + icon: TablerIcon; color: MantineColor; tooltip: string; } -export const PingDot = ({ color, tooltip }: PingDotProps) => { +export const PingDot = ({ color, tooltip, ...props }: PingDotProps) => { + const [pingIconsEnabled] = clientApi.user.getPingIconsEnabledOrDefault.useSuspenseQuery(); + return ( - + {pingIconsEnabled ? ( + + ) : ( + + )} ); diff --git a/packages/widgets/src/app/ping/ping-indicator.tsx b/packages/widgets/src/app/ping/ping-indicator.tsx index 058600257..1bf781427 100644 --- a/packages/widgets/src/app/ping/ping-indicator.tsx +++ b/packages/widgets/src/app/ping/ping-indicator.tsx @@ -1,4 +1,5 @@ import { useState } from "react"; +import { IconCheck, IconX } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; @@ -32,9 +33,12 @@ export const PingIndicator = ({ href }: PingIndicatorProps) => { }, ); + const isError = "error" in pingResult || pingResult.statusCode >= 500; + return ( = 500 ? "red" : "green"} + icon={isError ? IconX : IconCheck} + color={isError ? "red" : "green"} tooltip={"statusCode" in pingResult ? pingResult.statusCode.toString() : pingResult.error} /> ); From 6f97741862ad2d25d852858e509f78d0ff0a7e01 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 05:11:06 +0000 Subject: [PATCH 03/43] fix(deps): update dependency mantine-react-table to v2.0.0-beta.7 (#1287) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- packages/translation/package.json | 2 +- packages/ui/package.json | 2 +- packages/widgets/package.json | 2 +- pnpm-lock.yaml | 132 +++++++++++++++--------------- 5 files changed, 70 insertions(+), 70 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 5f410d270..f9d0aebc1 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -62,7 +62,7 @@ "flag-icons": "^7.2.3", "glob": "^11.0.0", "jotai": "^2.10.0", - "mantine-react-table": "2.0.0-beta.6", + "mantine-react-table": "2.0.0-beta.7", "next": "^14.2.15", "postcss-preset-mantine": "^1.17.0", "prismjs": "^1.29.0", diff --git a/packages/translation/package.json b/packages/translation/package.json index aeec42149..5697f33be 100644 --- a/packages/translation/package.json +++ b/packages/translation/package.json @@ -26,7 +26,7 @@ "prettier": "@homarr/prettier-config", "dependencies": { "dayjs": "^1.11.13", - "mantine-react-table": "2.0.0-beta.6", + "mantine-react-table": "2.0.0-beta.7", "next-international": "^1.2.4" }, "devDependencies": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 2b8e9d069..b42c8222e 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -32,7 +32,7 @@ "@mantine/dates": "^7.13.2", "@mantine/hooks": "^7.13.2", "@tabler/icons-react": "^3.19.0", - "mantine-react-table": "2.0.0-beta.6", + "mantine-react-table": "2.0.0-beta.7", "next": "^14.2.15", "react": "^18.3.1" }, diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 74ee3276a..737a1471d 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -58,7 +58,7 @@ "@tiptap/starter-kit": "^2.8.0", "clsx": "^2.1.1", "dayjs": "^1.11.13", - "mantine-react-table": "2.0.0-beta.6", + "mantine-react-table": "2.0.0-beta.7", "next": "^14.2.15", "react": "^18.3.1", "video.js": "^8.18.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a96e948d2..e3be142fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,16 +156,16 @@ importers: version: 5.59.9(@tanstack/react-query@5.59.9(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) '@trpc/client': specifier: next - version: 11.0.0-rc.569(@trpc/server@11.0.0-rc.569) + version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/next': specifier: next - version: 11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/react-query@11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.569)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/react-query': specifier: next - version: 11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.569 + version: 11.0.0-rc.571 '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -197,8 +197,8 @@ importers: specifier: ^2.10.0 version: 2.10.0(@types/react@18.3.11)(react@18.3.1) mantine-react-table: - specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.15 version: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) @@ -505,13 +505,13 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.569(@trpc/server@11.0.0-rc.569) + version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/react-query': specifier: next - version: 11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.569 + version: 11.0.0-rc.571 dockerode: specifier: ^4.0.2 version: 4.0.2 @@ -526,7 +526,7 @@ importers: version: 2.2.1 trpc-swagger: specifier: ^1.2.6 - version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(zod@3.23.8) + version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(zod@3.23.8) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1381,8 +1381,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 mantine-react-table: - specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-international: specifier: ^1.2.4 version: 1.2.4 @@ -1433,8 +1433,8 @@ importers: specifier: ^3.19.0 version: 3.19.0(react@18.3.1) mantine-react-table: - specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.15 version: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) @@ -1603,8 +1603,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 mantine-react-table: - specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.0.0-beta.7 + version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.15 version: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) @@ -3068,8 +3068,8 @@ packages: '@tabler/icons@3.19.0': resolution: {integrity: sha512-A4WEWqpdbTfnpFEtwXqwAe9qf9sp1yRPvzppqAuwcoF0q5YInqB+JkJtSFToCyBpPVeLxJUxxkapLvt2qQgnag==} - '@tanstack/match-sorter-utils@8.15.1': - resolution: {integrity: sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==} + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} '@tanstack/query-core@5.59.9': @@ -3096,25 +3096,25 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-table@8.19.3': - resolution: {integrity: sha512-MtgPZc4y+cCRtU16y1vh1myuyZ2OdkWgMEBzyjYsoMWMicKZGZvcDnub3Zwb6XF2pj9iRMvm1SO1n57lS0vXLw==} + '@tanstack/react-table@8.20.5': + resolution: {integrity: sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==} engines: {node: '>=12'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.8.3': - resolution: {integrity: sha512-9ICwbDUUzN99CJIGc373i8NLoj6zFTKI2Hlcmo0+lCSAhPQ5mxq4dGOMKmLYoEFyHcGQ64Bd6ZVbnPpM6lNK5w==} + '@tanstack/react-virtual@3.10.8': + resolution: {integrity: sha512-VbzbVGSsZlQktyLrP5nxE+vE1ZR+U0NFAWPbJLoG2+DKPwd2D7dVICTVIIaYlJqX1ZCEnYDbaOpmMwbsyhBoIA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@tanstack/table-core@8.19.3': - resolution: {integrity: sha512-IqREj9ADoml9zCAouIG/5kCGoyIxPFdqdyoxis9FisXFi5vT+iYfEfLosq4xkU/iDbMcEuAj+X8dWRLvKYDNoQ==} + '@tanstack/table-core@8.20.5': + resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.8.3': - resolution: {integrity: sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==} + '@tanstack/virtual-core@3.10.8': + resolution: {integrity: sha512-PBu00mtt95jbKFi6Llk9aik8bnR3tR/oQP1o3TSi+iG//+Q2RTIzCEgKkHG8BB86kxMNW6O8wku+Lmi+QFR6jA==} '@testcontainers/mysql@10.13.2': resolution: {integrity: sha512-O9lcWOxKL15a6NqpQpi8WrgEyYVvlYCHZU03vMtLoRBS0HsJyAZnH1NocDnnBMeRsghwURJPtUrFFMrwMumHMA==} @@ -3321,18 +3321,18 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.0.0-rc.569': - resolution: {integrity: sha512-crS1mJdJVKfqtzCJUbrurooxrZdToAHMZuPw9SAYU+dDdiIqlzCovWatv0MK+UD7Nkezs8/jZC4C/wcstA5Mxg==} + '@trpc/client@11.0.0-rc.571': + resolution: {integrity: sha512-mUX47avAwgkirC91rtnde7B8QVbvd+121wgud3q22gYBI1hrGFn8isFwXdPquVneXNL5p1JjfhpZzDwzHmUJ4Q==} peerDependencies: - '@trpc/server': 11.0.0-rc.569+8049266de + '@trpc/server': 11.0.0-rc.571+a70e169ce - '@trpc/next@11.0.0-rc.569': - resolution: {integrity: sha512-8O9IAWGWXnnyPVFRjEOoTuGtyIUJf25v/TqKoinywTgiLs4LDYwRY+p2RzWK2BXgFIoEucsoMLgSvhj4V/5SdQ==} + '@trpc/next@11.0.0-rc.571': + resolution: {integrity: sha512-CoMh0FipQDJQUxd5y0qt24M6CV2RiccXQYd33OSoKSOQWypfSWj5IYhwAc6sz6V2hWOt/xMuXx+C+JvYmsX57w==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.569+8049266de - '@trpc/react-query': 11.0.0-rc.569+8049266de - '@trpc/server': 11.0.0-rc.569+8049266de + '@trpc/client': 11.0.0-rc.571+a70e169ce + '@trpc/react-query': 11.0.0-rc.571+a70e169ce + '@trpc/server': 11.0.0-rc.571+a70e169ce next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3342,17 +3342,17 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.569': - resolution: {integrity: sha512-OSIsGeno/g0nMcpi5pQPYCUKPI7rlp7omZyvDvT7mvVQbBexwl7CgFWiWFo0Wv6VlQZYH0klrGsP5J4YRx+C2Q==} + '@trpc/react-query@11.0.0-rc.571': + resolution: {integrity: sha512-+LNIou3JQ/wQybTk1Vt90cKWk8LGGHrhsHiTWJFRiApaNgl/y7EkOfoOZ/we8jY3hPnyG5CXcqXx9SDbrmy8lg==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.569+8049266de - '@trpc/server': 11.0.0-rc.569+8049266de + '@trpc/client': 11.0.0-rc.571+a70e169ce + '@trpc/server': 11.0.0-rc.571+a70e169ce react: '>=18.2.0' react-dom: '>=18.2.0' - '@trpc/server@11.0.0-rc.569': - resolution: {integrity: sha512-ClaeO8fNizYaUllxON7soAoZgX8CUZ9iuiJxajftTlh9W8/r/cyq2v/G9prPl0psdOHvOPJJ31y6aE2Wt+LdMQ==} + '@trpc/server@11.0.0-rc.571': + resolution: {integrity: sha512-CISo9BoXSArTPt3MfxbOTPUcEdtKOl5Qgp8P+udiaA/nRmjndvVeZWQSmy1elRv0mQ/vvUI1VLsYm9Dn1/bysw==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -5776,8 +5776,8 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - mantine-react-table@2.0.0-beta.6: - resolution: {integrity: sha512-eaHdVjJWFLIAGS0PwdMisvs1U9IUanEzL+vm1+YcoDtUNFVGms1jw7neK43YH+CmA2YsFLfwRqHrtFnfI12Rag==} + mantine-react-table@2.0.0-beta.7: + resolution: {integrity: sha512-jpM3hXLL+DHURmm1AJ2uOyxu3xiZvlzS7NOtDh5qHo2AIv9zEEkXK/mrvKmRvXJ0O8pVPHLuYKAel9RBY5NfUA==} engines: {node: '>=16'} peerDependencies: '@mantine/core': ^7.9 @@ -9318,7 +9318,7 @@ snapshots: '@tabler/icons@3.19.0': {} - '@tanstack/match-sorter-utils@8.15.1': + '@tanstack/match-sorter-utils@8.19.4': dependencies: remove-accents: 0.5.0 @@ -9343,21 +9343,21 @@ snapshots: '@tanstack/query-core': 5.59.9 react: 18.3.1 - '@tanstack/react-table@8.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/table-core': 8.19.3 + '@tanstack/table-core': 8.20.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/react-virtual@3.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tanstack/react-virtual@3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/virtual-core': 3.8.3 + '@tanstack/virtual-core': 3.10.8 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@tanstack/table-core@8.19.3': {} + '@tanstack/table-core@8.20.5': {} - '@tanstack/virtual-core@3.8.3': {} + '@tanstack/virtual-core@3.10.8': {} '@testcontainers/mysql@10.13.2': dependencies: @@ -9579,30 +9579,30 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569)': + '@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571)': dependencies: - '@trpc/server': 11.0.0-rc.569 + '@trpc/server': 11.0.0-rc.571 - '@trpc/next@11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/react-query@11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.569)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/next@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@trpc/client': 11.0.0-rc.569(@trpc/server@11.0.0-rc.569) - '@trpc/server': 11.0.0-rc.569 + '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) + '@trpc/server': 11.0.0-rc.571 next: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@tanstack/react-query': 5.59.9(react@18.3.1) - '@trpc/react-query': 11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/react-query': 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/react-query@11.0.0-rc.569(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-query': 5.59.9(react@18.3.1) - '@trpc/client': 11.0.0-rc.569(@trpc/server@11.0.0-rc.569) - '@trpc/server': 11.0.0-rc.569 + '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) + '@trpc/server': 11.0.0-rc.571 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@trpc/server@11.0.0-rc.569': {} + '@trpc/server@11.0.0-rc.571': {} '@tsconfig/node10@1.0.11': {} @@ -12416,15 +12416,15 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.6(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mantine-react-table@2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@mantine/core': 7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/dates': 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': 7.13.2(react@18.3.1) '@tabler/icons-react': 3.19.0(react@18.3.1) - '@tanstack/match-sorter-utils': 8.15.1 - '@tanstack/react-table': 8.19.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@tanstack/react-virtual': 3.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/match-sorter-utils': 8.19.4 + '@tanstack/react-table': 8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.10.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 dayjs: 1.11.13 react: 18.3.1 @@ -14149,10 +14149,10 @@ snapshots: triple-beam@1.4.1: {} - trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.569(@trpc/server@11.0.0-rc.569))(@trpc/server@11.0.0-rc.569)(zod@3.23.8): + trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(zod@3.23.8): dependencies: - '@trpc/client': 11.0.0-rc.569(@trpc/server@11.0.0-rc.569) - '@trpc/server': 11.0.0-rc.569 + '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) + '@trpc/server': 11.0.0-rc.571 chalk-scripts: 1.2.8 co-body: 6.2.0 lodash.clonedeep: 4.5.0 From 0fadc28a125aa68e6d6d96a17c7c86012d13a288 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sat, 12 Oct 2024 09:28:18 +0000 Subject: [PATCH 04/43] fix(deps): update dependency tldts to ^6.1.51 (#1288) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/common/package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/common/package.json b/packages/common/package.json index a7c915305..521e6c7d0 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -29,7 +29,7 @@ "dayjs": "^1.11.13", "next": "^14.2.15", "react": "^18.3.1", - "tldts": "^6.1.50" + "tldts": "^6.1.51" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3be142fe..470db7838 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -672,8 +672,8 @@ importers: specifier: ^18.3.1 version: 18.3.1 tldts: - specifier: ^6.1.50 - version: 6.1.50 + specifier: ^6.1.51 + version: 6.1.51 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -7240,11 +7240,11 @@ packages: title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} - tldts-core@6.1.50: - resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==} + tldts-core@6.1.51: + resolution: {integrity: sha512-bu9oCYYWC1iRjx+3UnAjqCsfrWNZV1ghNQf49b3w5xE8J/tNShHTzp5syWJfwGH+pxUgTTLUnzHnfuydW7wmbg==} - tldts@6.1.50: - resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==} + tldts@6.1.51: + resolution: {integrity: sha512-33lfQoL0JsDogIbZ8fgRyvv77GnRtwkNE/MOKocwUgPO1WrSfsq7+vQRKxRQZai5zd+zg97Iv9fpFQSzHyWdLA==} hasBin: true tmp@0.0.33: @@ -14088,11 +14088,11 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - tldts-core@6.1.50: {} + tldts-core@6.1.51: {} - tldts@6.1.50: + tldts@6.1.51: dependencies: - tldts-core: 6.1.50 + tldts-core: 6.1.51 tmp@0.0.33: dependencies: @@ -14121,7 +14121,7 @@ snapshots: tough-cookie@5.0.0: dependencies: - tldts: 6.1.50 + tldts: 6.1.51 tr46@0.0.3: {} From 1bc470a39feae570a76dc210946ffc18b9bef6ea Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Sun, 13 Oct 2024 10:41:00 +0000 Subject: [PATCH 05/43] fix(deps): update dependency chroma-js to ^3.1.2 (#1289) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- pnpm-lock.yaml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index f9d0aebc1..3bb1b992e 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -55,7 +55,7 @@ "@xterm/addon-canvas": "^0.7.0", "@xterm/addon-fit": "0.10.0", "@xterm/xterm": "^5.5.0", - "chroma-js": "^3.1.1", + "chroma-js": "^3.1.2", "clsx": "^2.1.1", "dayjs": "^1.11.13", "dotenv": "^16.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 470db7838..789807129 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,7 +123,7 @@ importers: version: link:../../packages/widgets '@mantine/colors-generator': specifier: ^7.13.2 - version: 7.13.2(chroma-js@3.1.1) + version: 7.13.2(chroma-js@3.1.2) '@mantine/core': specifier: ^7.13.2 version: 7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -176,8 +176,8 @@ importers: specifier: ^5.5.0 version: 5.5.0 chroma-js: - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.1.2 + version: 3.1.2 clsx: specifier: ^2.1.1 version: 2.1.1 @@ -4119,8 +4119,8 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - chroma-js@3.1.1: - resolution: {integrity: sha512-CGr6w73Gi86142RWqZ1RjED/CyduYw2vMTikQZUvr2jGIihnZlMo/Kzm9rYHWDP2pJc6eebwc8CkX0iteBon+A==} + chroma-js@3.1.2: + resolution: {integrity: sha512-IJnETTalXbsLx1eKEgx19d5L6SRM7cH4vINw/99p/M11HCuXGRWL+6YmCm7FWFGIo6dtWuQoQi1dc5yQ7ESIHg==} chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} @@ -8627,9 +8627,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mantine/colors-generator@7.13.2(chroma-js@3.1.1)': + '@mantine/colors-generator@7.13.2(chroma-js@3.1.2)': dependencies: - chroma-js: 3.1.1 + chroma-js: 3.1.2 '@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -10582,7 +10582,7 @@ snapshots: chownr@2.0.0: {} - chroma-js@3.1.1: {} + chroma-js@3.1.2: {} chrome-trace-event@1.0.4: {} From 98b62a9f919ef18f891e115f3dec31c7f1e49a44 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Mon, 14 Oct 2024 11:38:13 +0300 Subject: [PATCH 06/43] feat: radarr release type to calendar widget (#1256) * feat: add release type * fix: type check * fix: deepSource * fix: new approach * fix: deepSource * fix: typecheck * fix: reviewed changes --- packages/integrations/src/calendar-types.ts | 4 +++ .../radarr/radarr-integration.ts | 29 +++++++++++++++---- packages/old-import/src/widgets/options.ts | 1 + packages/translation/src/lang/en.ts | 8 +++++ .../src/calendar/calendar-event-list.tsx | 22 ++++++++++---- packages/widgets/src/calendar/component.tsx | 21 +++++++++++--- packages/widgets/src/calendar/index.ts | 8 +++++ 7 files changed, 78 insertions(+), 15 deletions(-) diff --git a/packages/integrations/src/calendar-types.ts b/packages/integrations/src/calendar-types.ts index f9b97b431..95399c4b1 100644 --- a/packages/integrations/src/calendar-types.ts +++ b/packages/integrations/src/calendar-types.ts @@ -1,7 +1,11 @@ +export const radarrReleaseTypes = ["inCinemas", "digitalRelease", "physicalRelease"] as const; +type ReleaseType = (typeof radarrReleaseTypes)[number]; + export interface CalendarEvent { name: string; subName: string; date: Date; + dates?: { type: ReleaseType; date: Date }[]; description?: string; thumbnail?: string; mediaInformation?: { diff --git a/packages/integrations/src/media-organizer/radarr/radarr-integration.ts b/packages/integrations/src/media-organizer/radarr/radarr-integration.ts index 1ef79bf78..a562ce2d0 100644 --- a/packages/integrations/src/media-organizer/radarr/radarr-integration.ts +++ b/packages/integrations/src/media-organizer/radarr/radarr-integration.ts @@ -1,8 +1,10 @@ +import type { AtLeastOneOf } from "@homarr/common/types"; import { logger } from "@homarr/log"; import { z } from "@homarr/validation"; import { Integration } from "../../base/integration"; import type { CalendarEvent } from "../../calendar-types"; +import { radarrReleaseTypes } from "../../calendar-types"; export class RadarrIntegration extends Integration { /** @@ -37,19 +39,23 @@ export class RadarrIntegration extends Integration { }); const radarrCalendarEvents = await z.array(radarrCalendarEventSchema).parseAsync(await response.json()); - return radarrCalendarEvents.map( - (radarrCalendarEvent): CalendarEvent => ({ + return radarrCalendarEvents.map((radarrCalendarEvent): CalendarEvent => { + const dates = radarrReleaseTypes + .map((type) => (radarrCalendarEvent[type] ? { type, date: radarrCalendarEvent[type] } : undefined)) + .filter((date) => date) as AtLeastOneOf[number]>; + return { name: radarrCalendarEvent.title, subName: radarrCalendarEvent.originalTitle, description: radarrCalendarEvent.overview, thumbnail: this.chooseBestImageAsURL(radarrCalendarEvent), - date: radarrCalendarEvent.inCinemas, + date: dates[0].date, + dates, mediaInformation: { type: "movie", }, links: this.getLinksForRadarrCalendarEvent(radarrCalendarEvent), - }), - ); + }; + }); } private getLinksForRadarrCalendarEvent = (event: z.infer) => { @@ -118,7 +124,18 @@ const radarrCalendarEventImageSchema = z.array( const radarrCalendarEventSchema = z.object({ title: z.string(), originalTitle: z.string(), - inCinemas: z.string().transform((value) => new Date(value)), + inCinemas: z + .string() + .transform((value) => new Date(value)) + .optional(), + physicalRelease: z + .string() + .transform((value) => new Date(value)) + .optional(), + digitalRelease: z + .string() + .transform((value) => new Date(value)) + .optional(), overview: z.string().optional(), titleSlug: z.string(), images: radarrCalendarEventImageSchema, diff --git a/packages/old-import/src/widgets/options.ts b/packages/old-import/src/widgets/options.ts index cb95a7629..dde760af2 100644 --- a/packages/old-import/src/widgets/options.ts +++ b/packages/old-import/src/widgets/options.ts @@ -23,6 +23,7 @@ const optionMapping: OptionMapping = { }, "mediaRequests-requestStats": {}, calendar: { + releaseType: (oldOptions) => [oldOptions.radarrReleaseType], filterFutureMonths: () => undefined, filterPastMonths: () => undefined, }, diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index e5e8a64ca..24a149631 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -1031,6 +1031,14 @@ export default { name: "Calendar", description: "Display events from your integrations in a calendar view within a certain relative time period", option: { + releaseType: { + label: "Radarr release type", + options: { + inCinemas: "In cinemas", + digitalRelease: "Digital release", + physicalRelease: "Physical release", + }, + }, filterPastMonths: { label: "Start from", }, diff --git a/packages/widgets/src/calendar/calendar-event-list.tsx b/packages/widgets/src/calendar/calendar-event-list.tsx index 5c2115cd5..22eaa8660 100644 --- a/packages/widgets/src/calendar/calendar-event-list.tsx +++ b/packages/widgets/src/calendar/calendar-event-list.tsx @@ -15,6 +15,7 @@ import { IconClock } from "@tabler/icons-react"; import dayjs from "dayjs"; import type { CalendarEvent } from "@homarr/integrations/types"; +import { useI18n } from "@homarr/translation/client"; import classes from "./calendar-event-list.module.css"; @@ -24,6 +25,7 @@ interface CalendarEventListProps { export const CalendarEventList = ({ events }: CalendarEventListProps) => { const { colorScheme } = useMantineColorScheme(); + const t = useI18n(); return ( { {event.subName} )} - + {event.name} - - - {dayjs(event.date.toString()).format("HH:mm")} - + {event.dates ? ( + + + {t( + `widget.calendar.option.releaseType.options.${event.dates.find(({ date }) => event.date === date)?.type ?? "inCinemas"}`, + )} + + + ) : ( + + + {dayjs(event.date).format("HH:mm")} + + )} {event.description && ( diff --git a/packages/widgets/src/calendar/component.tsx b/packages/widgets/src/calendar/component.tsx index d773c7fe5..bcdca811c 100644 --- a/packages/widgets/src/calendar/component.tsx +++ b/packages/widgets/src/calendar/component.tsx @@ -6,12 +6,18 @@ import { Calendar } from "@mantine/dates"; import dayjs from "dayjs"; import { clientApi } from "@homarr/api/client"; +import type { CalendarEvent } from "@homarr/integrations/types"; import type { WidgetComponentProps } from "../definition"; import { CalendarDay } from "./calender-day"; import classes from "./component.module.css"; -export default function CalendarWidget({ isEditMode, integrationIds, itemId }: WidgetComponentProps<"calendar">) { +export default function CalendarWidget({ + isEditMode, + integrationIds, + itemId, + options, +}: WidgetComponentProps<"calendar">) { const [events] = clientApi.widget.calendar.findAllEvents.useSuspenseQuery( { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -80,9 +86,16 @@ export default function CalendarWidget({ isEditMode, integrationIds, itemId }: W padding: 0, }, }} - renderDay={(date) => { - const eventsForDate = events.filter((event) => dayjs(event.date).isSame(date, "day")); - return ; + renderDay={(tileDate) => { + const eventsForDate = events + .map((event) => ({ + ...event, + date: (event.dates?.filter(({ type }) => options.releaseType.includes(type)) ?? [event]).find(({ date }) => + dayjs(date).isSame(tileDate, "day"), + )?.date, + })) + .filter((event): event is CalendarEvent => Boolean(event.date)); + return ; }} /> ); diff --git a/packages/widgets/src/calendar/index.ts b/packages/widgets/src/calendar/index.ts index e3243038c..8afb3fe1e 100644 --- a/packages/widgets/src/calendar/index.ts +++ b/packages/widgets/src/calendar/index.ts @@ -1,6 +1,7 @@ import { IconCalendar } from "@tabler/icons-react"; import { getIntegrationKindsByCategory } from "@homarr/definitions"; +import { radarrReleaseTypes } from "@homarr/integrations/types"; import { z } from "@homarr/validation"; import { createWidgetDefinition } from "../definition"; @@ -9,6 +10,13 @@ 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, From bd31a4c3ad3cc42ac2148fbb7aa9857c1a8b8749 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:25:16 +0000 Subject: [PATCH 07/43] chore(deps): update vitest monorepo to ^2.1.3 (#1290) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 6 +-- pnpm-lock.yaml | 126 ++++++++++++++++++++++++------------------------- 2 files changed, 66 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index 0827b1d81..961682993 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "@homarr/prettier-config": "workspace:^0.1.0", "@turbo/gen": "^2.1.3", "@vitejs/plugin-react": "^4.3.2", - "@vitest/coverage-v8": "^2.1.2", - "@vitest/ui": "^2.1.2", + "@vitest/coverage-v8": "^2.1.3", + "@vitest/ui": "^2.1.3", "cross-env": "^7.0.3", "jsdom": "^25.0.1", "prettier": "^3.3.3", @@ -38,7 +38,7 @@ "turbo": "^2.1.3", "typescript": "^5.6.3", "vite-tsconfig-paths": "^5.0.1", - "vitest": "^2.1.2" + "vitest": "^2.1.3" }, "packageManager": "pnpm@9.12.1", "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 789807129..3bedcf491 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,11 +23,11 @@ importers: specifier: ^4.3.2 version: 4.3.2(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/coverage-v8': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2) + specifier: ^2.1.3 + version: 2.1.3(vitest@2.1.3) '@vitest/ui': - specifier: ^2.1.2 - version: 2.1.2(vitest@2.1.2) + specifier: ^2.1.3 + version: 2.1.3(vitest@2.1.3) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -50,8 +50,8 @@ importers: specifier: ^5.0.1 version: 5.0.1(typescript@5.6.3)(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) vitest: - specifier: ^2.1.2 - version: 2.1.2(@types/node@20.16.11)(@vitest/ui@2.1.2)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + specifier: ^2.1.3 + version: 2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) apps/nextjs: dependencies: @@ -3619,22 +3619,22 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@vitest/coverage-v8@2.1.2': - resolution: {integrity: sha512-b7kHrFrs2urS0cOk5N10lttI8UdJ/yP3nB4JYTREvR5o18cR99yPpK4gK8oQgI42BVv0ILWYUSYB7AXkAUDc0g==} + '@vitest/coverage-v8@2.1.3': + resolution: {integrity: sha512-2OJ3c7UPoFSmBZwqD2VEkUw6A/tzPF0LmW0ZZhhB8PFxuc+9IBG/FaSM+RLEenc7ljzFvGN+G0nGQoZnh7sy2A==} peerDependencies: - '@vitest/browser': 2.1.2 - vitest: 2.1.2 + '@vitest/browser': 2.1.3 + vitest: 2.1.3 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@2.1.2': - resolution: {integrity: sha512-FEgtlN8mIUSEAAnlvn7mP8vzaWhEaAEvhSXCqrsijM7K6QqjB11qoRZYEd4AKSCDz8p0/+yH5LzhZ47qt+EyPg==} + '@vitest/expect@2.1.3': + resolution: {integrity: sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==} - '@vitest/mocker@2.1.2': - resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} + '@vitest/mocker@2.1.3': + resolution: {integrity: sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==} peerDependencies: - '@vitest/spy': 2.1.2 + '@vitest/spy': 2.1.3 msw: ^2.3.5 vite: ^5.0.0 peerDependenciesMeta: @@ -3643,25 +3643,25 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.2': - resolution: {integrity: sha512-FIoglbHrSUlOJPDGIrh2bjX1sNars5HbxlcsFKCtKzu4+5lpsRhOCVcuzp0fEhAGHkPZRIXVNzPcpSlkoZ3LuA==} + '@vitest/pretty-format@2.1.3': + resolution: {integrity: sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==} - '@vitest/runner@2.1.2': - resolution: {integrity: sha512-UCsPtvluHO3u7jdoONGjOSil+uON5SSvU9buQh3lP7GgUXHp78guN1wRmZDX4wGK6J10f9NUtP6pO+SFquoMlw==} + '@vitest/runner@2.1.3': + resolution: {integrity: sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==} - '@vitest/snapshot@2.1.2': - resolution: {integrity: sha512-xtAeNsZ++aRIYIUsek7VHzry/9AcxeULlegBvsdLncLmNCR6tR8SRjn8BbDP4naxtccvzTqZ+L1ltZlRCfBZFA==} + '@vitest/snapshot@2.1.3': + resolution: {integrity: sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==} - '@vitest/spy@2.1.2': - resolution: {integrity: sha512-GSUi5zoy+abNRJwmFhBDC0yRuVUn8WMlQscvnbbXdKLXX9dE59YbfwXxuJ/mth6eeqIzofU8BB5XDo/Ns/qK2A==} + '@vitest/spy@2.1.3': + resolution: {integrity: sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==} - '@vitest/ui@2.1.2': - resolution: {integrity: sha512-92gcNzkDnmxOxyHzQrQYRsoV9Q0Aay0r4QMLnV+B+lbqlUWa8nDg9ivyLV5mMVTtGirHsYUGGh/zbIA55gBZqA==} + '@vitest/ui@2.1.3': + resolution: {integrity: sha512-2XwTrHVJw3t9NYES26LQUYy51ZB8W4bRPgqUH2Eyda3kIuOlYw1ZdPNU22qcVlUVx4WKgECFQOSXuopsczuVjQ==} peerDependencies: - vitest: 2.1.2 + vitest: 2.1.3 - '@vitest/utils@2.1.2': - resolution: {integrity: sha512-zMO2KdYy6mx56btx9JvAqAZ6EyS3g49krMPPrgOp1yxGZiA93HumGk+bZ5jIZtOg5/VBYl5eBmGRQHqq4FG6uQ==} + '@vitest/utils@2.1.3': + resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -7642,8 +7642,8 @@ packages: videojs-vtt.js@0.15.5: resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} - vite-node@2.1.2: - resolution: {integrity: sha512-HPcGNN5g/7I2OtPjLqgOtCRu/qhVvBxTUD3qzitmL0SrG1cWFzxzhMDWussxSbrRYWqnKf8P2jiNhPMSN+ymsQ==} + vite-node@2.1.3: + resolution: {integrity: sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7686,15 +7686,15 @@ packages: terser: optional: true - vitest@2.1.2: - resolution: {integrity: sha512-veNjLizOMkRrJ6xxb+pvxN6/QAWg95mzcRjtmkepXdN87FNfxAss9RKe2far/G9cQpipfgP2taqg0KiWsquj8A==} + vitest@2.1.3: + resolution: {integrity: sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.2 - '@vitest/ui': 2.1.2 + '@vitest/browser': 2.1.3 + '@vitest/ui': 2.1.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -9962,7 +9962,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.2(vitest@2.1.2)': + '@vitest/coverage-v8@2.1.3(vitest@2.1.3)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -9976,58 +9976,58 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.2(@types/node@20.16.11)(@vitest/ui@2.1.2)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.2': + '@vitest/expect@2.1.3': dependencies: - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': + '@vitest/mocker@2.1.3(@vitest/spy@2.1.3)(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: - '@vitest/spy': 2.1.2 + '@vitest/spy': 2.1.3 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: vite: 5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - '@vitest/pretty-format@2.1.2': + '@vitest/pretty-format@2.1.3': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.2': + '@vitest/runner@2.1.3': dependencies: - '@vitest/utils': 2.1.2 + '@vitest/utils': 2.1.3 pathe: 1.1.2 - '@vitest/snapshot@2.1.2': + '@vitest/snapshot@2.1.3': dependencies: - '@vitest/pretty-format': 2.1.2 + '@vitest/pretty-format': 2.1.3 magic-string: 0.30.11 pathe: 1.1.2 - '@vitest/spy@2.1.2': + '@vitest/spy@2.1.3': dependencies: tinyspy: 3.0.2 - '@vitest/ui@2.1.2(vitest@2.1.2)': + '@vitest/ui@2.1.3(vitest@2.1.3)': dependencies: - '@vitest/utils': 2.1.2 + '@vitest/utils': 2.1.3 fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 sirv: 2.0.4 tinyglobby: 0.2.6 tinyrainbow: 1.2.0 - vitest: 2.1.2(@types/node@20.16.11)(@vitest/ui@2.1.2)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vitest: 2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - '@vitest/utils@2.1.2': + '@vitest/utils@2.1.3': dependencies: - '@vitest/pretty-format': 2.1.2 + '@vitest/pretty-format': 2.1.3 loupe: 3.1.1 tinyrainbow: 1.2.0 @@ -14486,7 +14486,7 @@ snapshots: dependencies: global: 4.4.0 - vite-node@2.1.2(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vite-node@2.1.3(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: cac: 6.7.14 debug: 4.3.7 @@ -14526,15 +14526,15 @@ snapshots: sugarss: 4.0.1(postcss@8.4.47) terser: 5.32.0 - vitest@2.1.2(@types/node@20.16.11)(@vitest/ui@2.1.2)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): + vitest@2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0): dependencies: - '@vitest/expect': 2.1.2 - '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) - '@vitest/pretty-format': 2.1.2 - '@vitest/runner': 2.1.2 - '@vitest/snapshot': 2.1.2 - '@vitest/spy': 2.1.2 - '@vitest/utils': 2.1.2 + '@vitest/expect': 2.1.3 + '@vitest/mocker': 2.1.3(@vitest/spy@2.1.3)(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) + '@vitest/pretty-format': 2.1.3 + '@vitest/runner': 2.1.3 + '@vitest/snapshot': 2.1.3 + '@vitest/spy': 2.1.3 + '@vitest/utils': 2.1.3 chai: 5.1.1 debug: 4.3.7 magic-string: 0.30.11 @@ -14545,11 +14545,11 @@ snapshots: tinypool: 1.0.1 tinyrainbow: 1.2.0 vite: 5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) - vite-node: 2.1.2(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) + vite-node: 2.1.3(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.16.11 - '@vitest/ui': 2.1.2(vitest@2.1.2) + '@vitest/ui': 2.1.3(vitest@2.1.3) jsdom: 25.0.1 transitivePeerDependencies: - less From 85cf101043a7dbcd9b3a956eb8b7fffb6d3712e3 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:58:46 +0000 Subject: [PATCH 08/43] fix(deps): update dependency undici to v6.20.1 (#1291) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/tasks/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/tasks/package.json b/apps/tasks/package.json index ac21b2feb..54b41f3b5 100644 --- a/apps/tasks/package.json +++ b/apps/tasks/package.json @@ -38,7 +38,7 @@ "dayjs": "^1.11.13", "dotenv": "^16.4.5", "superjson": "2.2.1", - "undici": "6.20.0" + "undici": "6.20.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3bedcf491..a9d8ed646 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -333,8 +333,8 @@ importers: specifier: 2.2.1 version: 2.2.1 undici: - specifier: 6.20.0 - version: 6.20.0 + specifier: 6.20.1 + version: 6.20.1 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -7491,8 +7491,8 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - undici@6.20.0: - resolution: {integrity: sha512-AITZfPuxubm31Sx0vr8bteSalEbs9wQb/BOBi9FPlD9Qpd6HxZ4Q0+hI742jBhkPb4RT2v5MQzaW5VhRVyj+9A==} + undici@6.20.1: + resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} engines: {node: '>=18.17'} unique-string@2.0.0: @@ -14336,7 +14336,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@6.20.0: {} + undici@6.20.1: {} unique-string@2.0.0: dependencies: From 65b1ae26d15d29820f3feb097f6ccf43e89b5e22 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:40:37 +0000 Subject: [PATCH 09/43] fix(deps): update dependency typescript-eslint to ^8.9.0 (#1292) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 114 ++++++++++++++++++------------------ tooling/eslint/package.json | 2 +- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9d8ed646..129688e10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1647,7 +1647,7 @@ importers: version: 2.1.3(eslint@9.12.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0) + version: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0) eslint-plugin-jsx-a11y: specifier: ^6.10.0 version: 6.10.0(eslint@9.12.0) @@ -1658,8 +1658,8 @@ importers: specifier: ^4.6.2 version: 4.6.2(eslint@9.12.0) typescript-eslint: - specifier: ^8.8.1 - version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) + specifier: ^8.9.0 + version: 8.9.0(eslint@9.12.0)(typescript@5.6.3) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -3536,8 +3536,8 @@ packages: '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - '@typescript-eslint/eslint-plugin@8.8.1': - resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + '@typescript-eslint/eslint-plugin@8.9.0': + resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -3547,8 +3547,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.8.1': - resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} + '@typescript-eslint/parser@8.9.0': + resolution: {integrity: sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3557,12 +3557,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.8.1': - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + '@typescript-eslint/scope-manager@8.9.0': + resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.8.1': - resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + '@typescript-eslint/type-utils@8.9.0': + resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -3570,12 +3570,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.8.1': - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + '@typescript-eslint/types@8.9.0': + resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.8.1': - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + '@typescript-eslint/typescript-estree@8.9.0': + resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -3583,14 +3583,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.8.1': - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + '@typescript-eslint/utils@8.9.0': + resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.8.1': - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + '@typescript-eslint/visitor-keys@8.9.0': + resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.4.0': @@ -7449,8 +7449,8 @@ packages: types-ramda@0.30.1: resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - typescript-eslint@8.8.1: - resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} + typescript-eslint@8.9.0: + resolution: {integrity: sha512-AuD/FXGYRQyqyOBCpNLldMlsCGvmDNxptQ3Dp58/NXeB+FqyvTfXmMyba3PYa0Vi9ybnj7G8S/yd/4Cw8y47eA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -9840,14 +9840,14 @@ snapshots: dependencies: '@types/node': 20.16.11 - '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.9.0 eslint: 9.12.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -9858,12 +9858,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.9.0 debug: 4.3.7 eslint: 9.12.0 optionalDependencies: @@ -9871,15 +9871,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.8.1': + '@typescript-eslint/scope-manager@8.9.0': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/visitor-keys': 8.9.0 - '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -9888,12 +9888,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.8.1': {} + '@typescript-eslint/types@8.9.0': {} - '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.9.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/visitor-keys': 8.8.1 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/visitor-keys': 8.9.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -9905,20 +9905,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.9.0(eslint@9.12.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) - '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/types': 8.8.1 - '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.9.0 + '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) eslint: 9.12.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.8.1': + '@typescript-eslint/visitor-keys@8.9.0': dependencies: - '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/types': 8.9.0 eslint-visitor-keys: 3.4.3 '@umami/node@0.4.0': {} @@ -11295,17 +11295,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.12.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.12.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) eslint: 9.12.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -11316,7 +11316,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.12.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.12.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.12.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -11328,7 +11328,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -14299,11 +14299,11 @@ snapshots: dependencies: ts-toolbelt: 9.6.0 - typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3): + typescript-eslint@8.9.0(eslint@9.12.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.9.0(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.9.0(eslint@9.12.0)(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 921d75abd..599d84db2 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -23,7 +23,7 @@ "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.1", "eslint-plugin-react-hooks": "^4.6.2", - "typescript-eslint": "^8.8.1" + "typescript-eslint": "^8.9.0" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", From ed52b26f6d6938d653527af94f341c3b5a69e093 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 22:12:26 +0000 Subject: [PATCH 10/43] fix(deps): update dependency @million/lint to v1.0.10 (#1293) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- pnpm-lock.yaml | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 3bb1b992e..f487dfd2c 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -42,7 +42,7 @@ "@mantine/hooks": "^7.13.2", "@mantine/modals": "^7.13.2", "@mantine/tiptap": "^7.13.2", - "@million/lint": "1.0.9", + "@million/lint": "1.0.10", "@t3-oss/env-nextjs": "^0.11.1", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.59.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 129688e10..507175c35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -137,8 +137,8 @@ importers: specifier: ^7.13.2 version: 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tiptap/extension-link@2.8.0(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0))(@tiptap/react@2.8.0(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@million/lint': - specifier: 1.0.9 - version: 1.0.9(rollup@4.21.3)(webpack-sources@3.2.3) + specifier: 1.0.10 + version: 1.0.10(rollup@4.21.3)(webpack-sources@3.2.3) '@t3-oss/env-nextjs': specifier: ^0.11.1 version: 0.11.1(typescript@5.6.3)(zod@3.23.8) @@ -2663,12 +2663,12 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@million/install@1.0.9': - resolution: {integrity: sha512-tJk7azrjsIkHl/xTppFw8K7M/CIrqa1y9J75By+dtW6jZBQi51DQlsp5J1SuAcTR89XwpGEuhN29HOvHosblPw==} + '@million/install@1.0.10': + resolution: {integrity: sha512-MZL++9DtBCul1oZthuY3v2JLqe2gjHXrH4l5Y8dIK9UB6A50k8d9wa4cT/x160ISNkB4ouZ3dJKJhP56isQAew==} hasBin: true - '@million/lint@1.0.9': - resolution: {integrity: sha512-sKqdKUb0zfF2DUXAWuhbxIm+0j7CqG+689azpcSVEdW3zn9ezj3AoL7ne229Q9ElJAmr8Z0zCM73tH5QtyfXzA==} + '@million/lint@1.0.10': + resolution: {integrity: sha512-lWCU6S+a4bukGQiHCWvdlwvZcCKy3y6unxCzTAHgV1EEBeX7MBD1NdiXV4VdDpB1DozN2HrbyXtbXmU9/6KKcA==} hasBin: true '@next/env@14.2.15': @@ -4624,6 +4624,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + effect@3.9.2: + resolution: {integrity: sha512-1sx/v1HTWHTodXfzWxAFg+SCF+ACgpJVruaAMIh/NmDVvrUsf0x9PzpXvkgJUbQ1fMdmKYK//FqxeHSQ+Zxv/Q==} + electron-to-chromium@1.5.23: resolution: {integrity: sha512-mBhODedOXg4v5QWwl21DjM5amzjmI1zw9EPrPK/5Wx7C8jt33bpZNrC7OhHUG3pxRtbLpr3W2dXT+Ph1SsfRZA==} @@ -8716,7 +8719,7 @@ snapshots: - encoding - supports-color - '@million/install@1.0.9': + '@million/install@1.0.10': dependencies: '@antfu/ni': 0.21.12 '@axiomhq/js': 1.0.0-rc.3 @@ -8726,17 +8729,18 @@ snapshots: ast-types: 0.14.2 cli-high: 0.4.2 diff: 5.2.0 + effect: 3.9.2 nanoid: 5.0.7 recast: 0.23.9 xycolors: 0.1.2 - '@million/lint@1.0.9(rollup@4.21.3)(webpack-sources@3.2.3)': + '@million/lint@1.0.10(rollup@4.21.3)(webpack-sources@3.2.3)': dependencies: '@axiomhq/js': 1.0.0-rc.3 '@babel/core': 7.25.2 '@babel/types': 7.25.2 '@hono/node-server': 1.13.0(hono@4.6.1) - '@million/install': 1.0.9 + '@million/install': 1.0.10 '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@rrweb/types': 2.0.0-alpha.16 babel-plugin-syntax-hermes-parser: 0.21.1 @@ -11011,6 +11015,8 @@ snapshots: eastasianwidth@0.2.0: {} + effect@3.9.2: {} + electron-to-chromium@1.5.23: {} emoji-regex@8.0.0: {} From c707b4b10ff38e6cf299a503bd8176313d47f3ff Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 02:15:37 +0000 Subject: [PATCH 11/43] fix(deps): update dependency @million/lint to v1.0.11 (#1294) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index f487dfd2c..c48e86aaf 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -42,7 +42,7 @@ "@mantine/hooks": "^7.13.2", "@mantine/modals": "^7.13.2", "@mantine/tiptap": "^7.13.2", - "@million/lint": "1.0.10", + "@million/lint": "1.0.11", "@t3-oss/env-nextjs": "^0.11.1", "@tabler/icons-react": "^3.19.0", "@tanstack/react-query": "^5.59.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 507175c35..602967fef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -137,8 +137,8 @@ importers: specifier: ^7.13.2 version: 7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tiptap/extension-link@2.8.0(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0))(@tiptap/react@2.8.0(@tiptap/core@2.8.0(@tiptap/pm@2.8.0))(@tiptap/pm@2.8.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@million/lint': - specifier: 1.0.10 - version: 1.0.10(rollup@4.21.3)(webpack-sources@3.2.3) + specifier: 1.0.11 + version: 1.0.11(rollup@4.21.3)(webpack-sources@3.2.3) '@t3-oss/env-nextjs': specifier: ^0.11.1 version: 0.11.1(typescript@5.6.3)(zod@3.23.8) @@ -2663,12 +2663,12 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@million/install@1.0.10': - resolution: {integrity: sha512-MZL++9DtBCul1oZthuY3v2JLqe2gjHXrH4l5Y8dIK9UB6A50k8d9wa4cT/x160ISNkB4ouZ3dJKJhP56isQAew==} + '@million/install@1.0.11': + resolution: {integrity: sha512-koRlY6tCYa6isBUTheP0pL7PC31pBY1QlL8F/Yaorcx6gIyZSJNVqTGBDqLvDeeV8QcmD/S9mswSazI/FsyGKQ==} hasBin: true - '@million/lint@1.0.10': - resolution: {integrity: sha512-lWCU6S+a4bukGQiHCWvdlwvZcCKy3y6unxCzTAHgV1EEBeX7MBD1NdiXV4VdDpB1DozN2HrbyXtbXmU9/6KKcA==} + '@million/lint@1.0.11': + resolution: {integrity: sha512-OztUXhhEHwUiPPcrSXBAqyv1GppnV0evvT9xMGA3BGOhLaR/X79s4qTyziTT0i0rMNcK23HJgKqJfDtcQt/v9w==} hasBin: true '@next/env@14.2.15': @@ -8719,7 +8719,7 @@ snapshots: - encoding - supports-color - '@million/install@1.0.10': + '@million/install@1.0.11': dependencies: '@antfu/ni': 0.21.12 '@axiomhq/js': 1.0.0-rc.3 @@ -8734,13 +8734,13 @@ snapshots: recast: 0.23.9 xycolors: 0.1.2 - '@million/lint@1.0.10(rollup@4.21.3)(webpack-sources@3.2.3)': + '@million/lint@1.0.11(rollup@4.21.3)(webpack-sources@3.2.3)': dependencies: '@axiomhq/js': 1.0.0-rc.3 '@babel/core': 7.25.2 '@babel/types': 7.25.2 '@hono/node-server': 1.13.0(hono@4.6.1) - '@million/install': 1.0.10 + '@million/install': 1.0.11 '@rollup/pluginutils': 5.1.0(rollup@4.21.3) '@rrweb/types': 2.0.0-alpha.16 babel-plugin-syntax-hermes-parser: 0.21.1 From df8f6d25d4accd486274df15eb620b28fb545826 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 07:38:17 +0000 Subject: [PATCH 12/43] fix(deps): update tanstack-query monorepo to ^5.59.14 (#1282) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 6 ++-- pnpm-lock.yaml | 62 ++++++++++++++++++++-------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index c48e86aaf..3b3395c44 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -45,9 +45,9 @@ "@million/lint": "1.0.11", "@t3-oss/env-nextjs": "^0.11.1", "@tabler/icons-react": "^3.19.0", - "@tanstack/react-query": "^5.59.9", - "@tanstack/react-query-devtools": "^5.59.9", - "@tanstack/react-query-next-experimental": "5.59.9", + "@tanstack/react-query": "^5.59.14", + "@tanstack/react-query-devtools": "^5.59.14", + "@tanstack/react-query-next-experimental": "5.59.14", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 602967fef..f407cf9f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,23 +146,23 @@ importers: specifier: ^3.19.0 version: 3.19.0(react@18.3.1) '@tanstack/react-query': - specifier: ^5.59.9 - version: 5.59.9(react@18.3.1) + specifier: ^5.59.14 + version: 5.59.14(react@18.3.1) '@tanstack/react-query-devtools': - specifier: ^5.59.9 - version: 5.59.9(@tanstack/react-query@5.59.9(react@18.3.1))(react@18.3.1) + specifier: ^5.59.14 + version: 5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(react@18.3.1) '@tanstack/react-query-next-experimental': - specifier: 5.59.9 - version: 5.59.9(@tanstack/react-query@5.59.9(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) + specifier: 5.59.14 + version: 5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) '@trpc/client': specifier: next version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/next': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/react-query': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next version: 11.0.0-rc.571 @@ -508,7 +508,7 @@ importers: version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/react-query': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next version: 11.0.0-rc.571 @@ -3072,27 +3072,27 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/query-core@5.59.9': - resolution: {integrity: sha512-vFGnblfJOKlOPyTR5M0ohWKb/03eGubh5KuGyzsDfc7VQ6F0nsB75kQIoLpwp3Wfj6fKv0wGoTUX8BsIfhxDfw==} + '@tanstack/query-core@5.59.13': + resolution: {integrity: sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==} '@tanstack/query-devtools@5.58.0': resolution: {integrity: sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==} - '@tanstack/react-query-devtools@5.59.9': - resolution: {integrity: sha512-Vfr8JPgx4GxopQOqdQTC7MAUbX1vuEqeexCIX0RiwjUmNCoHKUg2Mh3rTZPsx8Y7wscc7eWkBjiz03Dt/YM3oQ==} + '@tanstack/react-query-devtools@5.59.14': + resolution: {integrity: sha512-7hYY59jveDF1thc4mnExfMoz/ySnE22pv3d+tinw+HxDGZFPa5BfCZgr1N3i1OGxxBuZch8k9seUJ2qUhBdJoQ==} peerDependencies: - '@tanstack/react-query': ^5.59.9 + '@tanstack/react-query': ^5.59.14 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.59.9': - resolution: {integrity: sha512-YEXROxfYiY6yd6FkMjHnLXqixCMrZ0+AmlT56H/oIlCEaqD5JpdlSUzD42cbq/l90eQw15SgC4/f8VVw2Cr8Rw==} + '@tanstack/react-query-next-experimental@5.59.14': + resolution: {integrity: sha512-+equHV38xo39j6rqdvj2PB0wv9j5cY7CJWRQz1UrzXhKx6q6UD2rV/6K2di2DyclCISHJlmv/GO/AvdWRR2ecg==} peerDependencies: - '@tanstack/react-query': ^5.59.9 + '@tanstack/react-query': ^5.59.14 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.59.9': - resolution: {integrity: sha512-g2cbiw/ZIIrnUaQqhGtarTAsuLdKDNLtY5HNfRHVWY9kHDj96M4qs4ygJxHc119tPQpzZe4i9W7d2Gc2Gvng2A==} + '@tanstack/react-query@5.59.14': + resolution: {integrity: sha512-2cM4x3Ka4Thl7/wnjf++EMGA2Is/RgPynn83D4kfGiJOGSjb5T2D3EEOlC8Nt6U2htLS3imOXjOSMEjC3K7JNg==} peerDependencies: react: ^18 || ^19 @@ -9326,25 +9326,25 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.59.9': {} + '@tanstack/query-core@5.59.13': {} '@tanstack/query-devtools@5.58.0': {} - '@tanstack/react-query-devtools@5.59.9(@tanstack/react-query@5.59.9(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-devtools': 5.58.0 - '@tanstack/react-query': 5.59.9(react@18.3.1) + '@tanstack/react-query': 5.59.14(react@18.3.1) react: 18.3.1 - '@tanstack/react-query-next-experimental@5.59.9(@tanstack/react-query@5.59.9(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1)': + '@tanstack/react-query-next-experimental@5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.59.9(react@18.3.1) + '@tanstack/react-query': 5.59.14(react@18.3.1) next: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) react: 18.3.1 - '@tanstack/react-query@5.59.9(react@18.3.1)': + '@tanstack/react-query@5.59.14(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.59.9 + '@tanstack/query-core': 5.59.13 react: 18.3.1 '@tanstack/react-table@8.20.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -9587,7 +9587,7 @@ snapshots: dependencies: '@trpc/server': 11.0.0-rc.571 - '@trpc/next@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/next@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/server': 11.0.0-rc.571 @@ -9595,12 +9595,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@tanstack/react-query': 5.59.9(react@18.3.1) - '@trpc/react-query': 11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 5.59.14(react@18.3.1) + '@trpc/react-query': 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.9(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.59.9(react@18.3.1) + '@tanstack/react-query': 5.59.14(react@18.3.1) '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) '@trpc/server': 11.0.0-rc.571 react: 18.3.1 From ba81e5e35a046e8dda1c2660beff1e1644d4d32a Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 15:11:33 +0000 Subject: [PATCH 13/43] fix(deps): update dependency jotai to ^2.10.1 (#1295) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- packages/spotlight/package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 3b3395c44..fd68f25b5 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -61,7 +61,7 @@ "dotenv": "^16.4.5", "flag-icons": "^7.2.3", "glob": "^11.0.0", - "jotai": "^2.10.0", + "jotai": "^2.10.1", "mantine-react-table": "2.0.0-beta.7", "next": "^14.2.15", "postcss-preset-mantine": "^1.17.0", diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index b23509a1b..b594bf0a2 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -34,7 +34,7 @@ "@mantine/hooks": "^7.13.2", "@mantine/spotlight": "^7.13.2", "@tabler/icons-react": "^3.19.0", - "jotai": "^2.10.0", + "jotai": "^2.10.1", "next": "^14.2.15", "react": "^18.3.1", "use-deep-compare-effect": "^1.8.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f407cf9f8..1ffcfd296 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -194,8 +194,8 @@ importers: specifier: ^11.0.0 version: 11.0.0 jotai: - specifier: ^2.10.0 - version: 2.10.0(@types/react@18.3.11)(react@18.3.1) + specifier: ^2.10.1 + version: 2.10.1(@types/react@18.3.11)(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.7 version: 2.0.0-beta.7(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.13.2(@mantine/core@7.13.2(@mantine/hooks@7.13.2(react@18.3.1))(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.13.2(react@18.3.1))(@tabler/icons-react@3.19.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1347,8 +1347,8 @@ importers: specifier: ^3.19.0 version: 3.19.0(react@18.3.1) jotai: - specifier: ^2.10.0 - version: 2.10.0(@types/react@18.3.11)(react@18.3.1) + specifier: ^2.10.1 + version: 2.10.1(@types/react@18.3.11)(react@18.3.1) next: specifier: ^14.2.15 version: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) @@ -5571,8 +5571,8 @@ packages: jose@5.9.3: resolution: {integrity: sha512-egLIoYSpcd+QUF+UHgobt5YzI2Pkw/H39ou9suW687MY6PmCwPmkNV/4TNjn1p2tX5xO3j0d0sq5hiYE24bSlg==} - jotai@2.10.0: - resolution: {integrity: sha512-8W4u0aRlOIwGlLQ0sqfl/c6+eExl5D8lZgAUolirZLktyaj4WnxO/8a0HEPmtriQAB6X5LMhXzZVmw02X0P0qQ==} + jotai@2.10.1: + resolution: {integrity: sha512-4FycO+BOTl2auLyF2Chvi6KTDqdsdDDtpaL/WHQMs8f3KS1E3loiUShQzAzFA/sMU5cJ0hz/RT1xum9YbG/zaA==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -12203,7 +12203,7 @@ snapshots: jose@5.9.3: {} - jotai@2.10.0(@types/react@18.3.11)(react@18.3.1): + jotai@2.10.1(@types/react@18.3.11)(react@18.3.1): optionalDependencies: '@types/react': 18.3.11 react: 18.3.1 From bb0026a9fd6093cf54dc5fdcf027ea1033ac8454 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 17:40:54 +0000 Subject: [PATCH 14/43] fix(deps): update tanstack-query monorepo to ^5.59.15 (#1298) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 6 +-- pnpm-lock.yaml | 112 +++++++++++++++++++-------------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index fd68f25b5..b903acc57 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -45,9 +45,9 @@ "@million/lint": "1.0.11", "@t3-oss/env-nextjs": "^0.11.1", "@tabler/icons-react": "^3.19.0", - "@tanstack/react-query": "^5.59.14", - "@tanstack/react-query-devtools": "^5.59.14", - "@tanstack/react-query-next-experimental": "5.59.14", + "@tanstack/react-query": "^5.59.15", + "@tanstack/react-query-devtools": "^5.59.15", + "@tanstack/react-query-next-experimental": "5.59.15", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ffcfd296..3dfc8f441 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,26 +146,26 @@ importers: specifier: ^3.19.0 version: 3.19.0(react@18.3.1) '@tanstack/react-query': - specifier: ^5.59.14 - version: 5.59.14(react@18.3.1) + specifier: ^5.59.15 + version: 5.59.15(react@18.3.1) '@tanstack/react-query-devtools': - specifier: ^5.59.14 - version: 5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(react@18.3.1) + specifier: ^5.59.15 + version: 5.59.15(@tanstack/react-query@5.59.15(react@18.3.1))(react@18.3.1) '@tanstack/react-query-next-experimental': - specifier: 5.59.14 - version: 5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) + specifier: 5.59.15 + version: 5.59.15(@tanstack/react-query@5.59.15(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) '@trpc/client': specifier: next - version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) + version: 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) '@trpc/next': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.576)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/react-query': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.571 + version: 11.0.0-rc.576 '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -505,13 +505,13 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) + version: 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) '@trpc/react-query': specifier: next - version: 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.571 + version: 11.0.0-rc.576 dockerode: specifier: ^4.0.2 version: 4.0.2 @@ -526,7 +526,7 @@ importers: version: 2.2.1 trpc-swagger: specifier: ^1.2.6 - version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(zod@3.23.8) + version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(zod@3.23.8) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -3078,21 +3078,21 @@ packages: '@tanstack/query-devtools@5.58.0': resolution: {integrity: sha512-iFdQEFXaYYxqgrv63ots+65FGI+tNp5ZS5PdMU1DWisxk3fez5HG3FyVlbUva+RdYS5hSLbxZ9aw3yEs97GNTw==} - '@tanstack/react-query-devtools@5.59.14': - resolution: {integrity: sha512-7hYY59jveDF1thc4mnExfMoz/ySnE22pv3d+tinw+HxDGZFPa5BfCZgr1N3i1OGxxBuZch8k9seUJ2qUhBdJoQ==} + '@tanstack/react-query-devtools@5.59.15': + resolution: {integrity: sha512-rX28KTivkA2XEn3Fj9ckDtnTPY8giWYgssySSAperpVol4+th+NCij/MhLylfB+Mfg2JfCxOcwnM/fwzS8iSog==} peerDependencies: - '@tanstack/react-query': ^5.59.14 + '@tanstack/react-query': ^5.59.15 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.59.14': - resolution: {integrity: sha512-+equHV38xo39j6rqdvj2PB0wv9j5cY7CJWRQz1UrzXhKx6q6UD2rV/6K2di2DyclCISHJlmv/GO/AvdWRR2ecg==} + '@tanstack/react-query-next-experimental@5.59.15': + resolution: {integrity: sha512-XWGVtR7p9P5SbykowSJMRXyJTgTzEXojh8GHKbupF42RvJDNV2C1WY4yOeXMkLzW4DSss+p8RVNORjBXe50KYQ==} peerDependencies: - '@tanstack/react-query': ^5.59.14 + '@tanstack/react-query': ^5.59.15 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.59.14': - resolution: {integrity: sha512-2cM4x3Ka4Thl7/wnjf++EMGA2Is/RgPynn83D4kfGiJOGSjb5T2D3EEOlC8Nt6U2htLS3imOXjOSMEjC3K7JNg==} + '@tanstack/react-query@5.59.15': + resolution: {integrity: sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==} peerDependencies: react: ^18 || ^19 @@ -3321,18 +3321,18 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.0.0-rc.571': - resolution: {integrity: sha512-mUX47avAwgkirC91rtnde7B8QVbvd+121wgud3q22gYBI1hrGFn8isFwXdPquVneXNL5p1JjfhpZzDwzHmUJ4Q==} + '@trpc/client@11.0.0-rc.576': + resolution: {integrity: sha512-gBrrxFwKNzVLVijrq8wwF3zkJdgkMks7XZfRB1SgQ7TuXMglPz7LVJLOIdWbWB+qTg8vcR26rzmdwH6/0UoJ9A==} peerDependencies: - '@trpc/server': 11.0.0-rc.571+a70e169ce + '@trpc/server': 11.0.0-rc.576+deed81c1b - '@trpc/next@11.0.0-rc.571': - resolution: {integrity: sha512-CoMh0FipQDJQUxd5y0qt24M6CV2RiccXQYd33OSoKSOQWypfSWj5IYhwAc6sz6V2hWOt/xMuXx+C+JvYmsX57w==} + '@trpc/next@11.0.0-rc.576': + resolution: {integrity: sha512-sC1iZyuYWLB9NgKlnTsuYgnIwd/Iqsr2VKgb7myy3Lcrppunr8Lb+yVuzuUoDxPwDclq6KpKorsGZ4F30VKq8g==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.571+a70e169ce - '@trpc/react-query': 11.0.0-rc.571+a70e169ce - '@trpc/server': 11.0.0-rc.571+a70e169ce + '@trpc/client': 11.0.0-rc.576+deed81c1b + '@trpc/react-query': 11.0.0-rc.576+deed81c1b + '@trpc/server': 11.0.0-rc.576+deed81c1b next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3342,17 +3342,17 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.571': - resolution: {integrity: sha512-+LNIou3JQ/wQybTk1Vt90cKWk8LGGHrhsHiTWJFRiApaNgl/y7EkOfoOZ/we8jY3hPnyG5CXcqXx9SDbrmy8lg==} + '@trpc/react-query@11.0.0-rc.576': + resolution: {integrity: sha512-jqxozfKuafeMaKX7viFwYbkLBrLeLp68wWJceKRSp6Pk+t7opNF7paWti7g4I2zKFj8l8Gfmy8Chtcu4CbLhPA==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.571+a70e169ce - '@trpc/server': 11.0.0-rc.571+a70e169ce + '@trpc/client': 11.0.0-rc.576+deed81c1b + '@trpc/server': 11.0.0-rc.576+deed81c1b react: '>=18.2.0' react-dom: '>=18.2.0' - '@trpc/server@11.0.0-rc.571': - resolution: {integrity: sha512-CISo9BoXSArTPt3MfxbOTPUcEdtKOl5Qgp8P+udiaA/nRmjndvVeZWQSmy1elRv0mQ/vvUI1VLsYm9Dn1/bysw==} + '@trpc/server@11.0.0-rc.576': + resolution: {integrity: sha512-SbCjV+6PpYTkmxb1bTuTUPUXHMLp57dHziUzC9ZhQ92kCZ4nIMTHMrrcqv/qNBvVS22H6HUoX+h1k6AVW0wjtw==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -9330,19 +9330,19 @@ snapshots: '@tanstack/query-devtools@5.58.0': {} - '@tanstack/react-query-devtools@5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.59.15(@tanstack/react-query@5.59.15(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-devtools': 5.58.0 - '@tanstack/react-query': 5.59.14(react@18.3.1) + '@tanstack/react-query': 5.59.15(react@18.3.1) react: 18.3.1 - '@tanstack/react-query-next-experimental@5.59.14(@tanstack/react-query@5.59.14(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1)': + '@tanstack/react-query-next-experimental@5.59.15(@tanstack/react-query@5.59.15(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.59.14(react@18.3.1) + '@tanstack/react-query': 5.59.15(react@18.3.1) next: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) react: 18.3.1 - '@tanstack/react-query@5.59.14(react@18.3.1)': + '@tanstack/react-query@5.59.15(react@18.3.1)': dependencies: '@tanstack/query-core': 5.59.13 react: 18.3.1 @@ -9583,30 +9583,30 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571)': + '@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576)': dependencies: - '@trpc/server': 11.0.0-rc.571 + '@trpc/server': 11.0.0-rc.576 - '@trpc/next@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.571)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/next@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.576)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) - '@trpc/server': 11.0.0-rc.571 + '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) + '@trpc/server': 11.0.0-rc.576 next: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@tanstack/react-query': 5.59.14(react@18.3.1) - '@trpc/react-query': 11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 5.59.15(react@18.3.1) + '@trpc/react-query': 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/react-query@11.0.0-rc.571(@tanstack/react-query@5.59.14(react@18.3.1))(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.59.14(react@18.3.1) - '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) - '@trpc/server': 11.0.0-rc.571 + '@tanstack/react-query': 5.59.15(react@18.3.1) + '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) + '@trpc/server': 11.0.0-rc.576 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@trpc/server@11.0.0-rc.571': {} + '@trpc/server@11.0.0-rc.576': {} '@tsconfig/node10@1.0.11': {} @@ -14155,10 +14155,10 @@ snapshots: triple-beam@1.4.1: {} - trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.571(@trpc/server@11.0.0-rc.571))(@trpc/server@11.0.0-rc.571)(zod@3.23.8): + trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(zod@3.23.8): dependencies: - '@trpc/client': 11.0.0-rc.571(@trpc/server@11.0.0-rc.571) - '@trpc/server': 11.0.0-rc.571 + '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) + '@trpc/server': 11.0.0-rc.576 chalk-scripts: 1.2.8 co-body: 6.2.0 lodash.clonedeep: 4.5.0 From 476fda279db3a501a376b5b77eff2ae99b8a0225 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Tue, 15 Oct 2024 21:11:32 +0200 Subject: [PATCH 15/43] fix: integration actions hidden for full access users (#1300) --- .../app/[locale]/manage/integrations/page.tsx | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx index ad03dc244..fafc49fc8 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/page.tsx @@ -161,21 +161,20 @@ const IntegrationList = async ({ integrations, activeTab }: IntegrationListProps - {hasFullAccess || - (integration.permissions.hasFullAccess && ( - - - - - - - ))} + {(hasFullAccess || integration.permissions.hasFullAccess) && ( + + + + + + + )} From f2f31b5ee08f1c50ccc125e0ace470c360984350 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:34:33 +0000 Subject: [PATCH 16/43] fix(deps): update dependency drizzle-kit to ^0.26.0 (#1301) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index f5e38ba7b..65aca85e2 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -41,7 +41,7 @@ "@testcontainers/mysql": "^10.13.2", "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", - "drizzle-kit": "^0.25.0", + "drizzle-kit": "^0.26.0", "drizzle-orm": "^0.34.1", "mysql2": "3.11.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dfc8f441..0e08652a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -857,8 +857,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.25.0 - version: 0.25.0 + specifier: ^0.26.0 + version: 0.26.0 drizzle-orm: specifier: ^0.34.1 version: 0.34.1(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) @@ -4528,8 +4528,8 @@ packages: resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} engines: {node: '>=4'} - drizzle-kit@0.25.0: - resolution: {integrity: sha512-Rcf0nYCAKizwjWQCY+d3zytyuTbDb81NcaPor+8NebESlUz1+9W3uGl0+r9FhU4Qal5Zv9j/7neXCSCe7DHzjA==} + drizzle-kit@0.26.0: + resolution: {integrity: sha512-bTtqvQZW21zFjAfIUJSkuHMWyxaHGTtvC05ivmu9na6m3fu7AlJ+rfKgh5vGR7+Jnga7t7evONkQHrs0hxqJXg==} hasBin: true drizzle-orm@0.34.1: @@ -10996,7 +10996,7 @@ snapshots: drange@1.1.1: {} - drizzle-kit@0.25.0: + drizzle-kit@0.26.0: dependencies: '@drizzle-team/brocli': 0.10.1 '@esbuild-kit/esm-loader': 2.6.5 From c6daccbdf0b6a531274c0ab86779ec3f946ebf38 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:48:50 +0000 Subject: [PATCH 17/43] fix(deps): update dependency drizzle-orm to ^0.35.0 (#1302) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 65aca85e2..8059d6c47 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -42,7 +42,7 @@ "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", "drizzle-kit": "^0.26.0", - "drizzle-orm": "^0.34.1", + "drizzle-orm": "^0.35.0", "mysql2": "3.11.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0e08652a4..e50af051d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -860,8 +860,8 @@ importers: specifier: ^0.26.0 version: 0.26.0 drizzle-orm: - specifier: ^0.34.1 - version: 0.34.1(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) + specifier: ^0.35.0 + version: 0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) mysql2: specifier: 3.11.3 version: 3.11.3 @@ -4532,8 +4532,8 @@ packages: resolution: {integrity: sha512-bTtqvQZW21zFjAfIUJSkuHMWyxaHGTtvC05ivmu9na6m3fu7AlJ+rfKgh5vGR7+Jnga7t7evONkQHrs0hxqJXg==} hasBin: true - drizzle-orm@0.34.1: - resolution: {integrity: sha512-t+zCwyWWt8xTqtYV4doE/xYmT7hpv1L8pQ66zddEz+3VWyedBBtctjMAp22mAJPfyWurRQXUJ1nrTtqLq+DqNA==} + drizzle-orm@0.35.0: + resolution: {integrity: sha512-fyTKnQ6WZQqSUy6yM4Do2tJPBg1ALR0vJtO9xUTLLubD+0qS1PPuu8aVOeLZQo+g8RPJn+Vqoh30/3lSS8/a2w==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -11005,7 +11005,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.34.1(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1): + drizzle-orm@0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1): optionalDependencies: '@types/better-sqlite3': 7.6.11 '@types/react': 18.3.11 From f50f46d4b7b32bbd89073433316f461cd475e367 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 20:29:39 +0000 Subject: [PATCH 18/43] fix(deps): update dependency drizzle-kit to ^0.26.1 (#1303) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 8059d6c47..6f2035f40 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -41,7 +41,7 @@ "@testcontainers/mysql": "^10.13.2", "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", - "drizzle-kit": "^0.26.0", + "drizzle-kit": "^0.26.1", "drizzle-orm": "^0.35.0", "mysql2": "3.11.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e50af051d..4cb5f4b05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -857,8 +857,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.26.0 - version: 0.26.0 + specifier: ^0.26.1 + version: 0.26.1 drizzle-orm: specifier: ^0.35.0 version: 0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) @@ -4528,8 +4528,8 @@ packages: resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} engines: {node: '>=4'} - drizzle-kit@0.26.0: - resolution: {integrity: sha512-bTtqvQZW21zFjAfIUJSkuHMWyxaHGTtvC05ivmu9na6m3fu7AlJ+rfKgh5vGR7+Jnga7t7evONkQHrs0hxqJXg==} + drizzle-kit@0.26.1: + resolution: {integrity: sha512-5/e1tzOPicPDooCm/uJIU9mWK3eD5dhW5EY61TQyVVo29xYxFLmZpXlBdOYlbfDHBsNhVzhb0XjWFmAAj7d7WA==} hasBin: true drizzle-orm@0.35.0: @@ -10996,7 +10996,7 @@ snapshots: drange@1.1.1: {} - drizzle-kit@0.26.0: + drizzle-kit@0.26.1: dependencies: '@drizzle-team/brocli': 0.10.1 '@esbuild-kit/esm-loader': 2.6.5 From da13d6396967419466729b4abd5a839b14a17977 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 07:48:32 +0000 Subject: [PATCH 19/43] fix(deps): update dependency drizzle-kit to ^0.26.2 (#1305) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 80 ++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 6f2035f40..433b0e980 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -41,7 +41,7 @@ "@testcontainers/mysql": "^10.13.2", "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", - "drizzle-kit": "^0.26.1", + "drizzle-kit": "^0.26.2", "drizzle-orm": "^0.35.0", "mysql2": "3.11.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4cb5f4b05..bc4686e97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,16 +156,16 @@ importers: version: 5.59.15(@tanstack/react-query@5.59.15(react@18.3.1))(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react@18.3.1) '@trpc/client': specifier: next - version: 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) + version: 11.0.0-rc.577(@trpc/server@11.0.0-rc.577) '@trpc/next': specifier: next - version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.576)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/react-query@11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.577)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/react-query': specifier: next - version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.576 + version: 11.0.0-rc.577 '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -505,13 +505,13 @@ importers: version: link:../validation '@trpc/client': specifier: next - version: 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) + version: 11.0.0-rc.577(@trpc/server@11.0.0-rc.577) '@trpc/react-query': specifier: next - version: 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next - version: 11.0.0-rc.576 + version: 11.0.0-rc.577 dockerode: specifier: ^4.0.2 version: 4.0.2 @@ -526,7 +526,7 @@ importers: version: 2.2.1 trpc-swagger: specifier: ^1.2.6 - version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(zod@3.23.8) + version: 1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(zod@3.23.8) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -857,8 +857,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.26.1 - version: 0.26.1 + specifier: ^0.26.2 + version: 0.26.2 drizzle-orm: specifier: ^0.35.0 version: 0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) @@ -3321,18 +3321,18 @@ packages: '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@trpc/client@11.0.0-rc.576': - resolution: {integrity: sha512-gBrrxFwKNzVLVijrq8wwF3zkJdgkMks7XZfRB1SgQ7TuXMglPz7LVJLOIdWbWB+qTg8vcR26rzmdwH6/0UoJ9A==} + '@trpc/client@11.0.0-rc.577': + resolution: {integrity: sha512-ZjW7wDKtixKeQGwXB/VBw4xFyORHb6nItzY8zAYa0RJ6I4m8DQ5GKf+eZTlw84foGv+yVrQJIUMqwMSjmd+mmg==} peerDependencies: - '@trpc/server': 11.0.0-rc.576+deed81c1b + '@trpc/server': 11.0.0-rc.577+6b5a608eb - '@trpc/next@11.0.0-rc.576': - resolution: {integrity: sha512-sC1iZyuYWLB9NgKlnTsuYgnIwd/Iqsr2VKgb7myy3Lcrppunr8Lb+yVuzuUoDxPwDclq6KpKorsGZ4F30VKq8g==} + '@trpc/next@11.0.0-rc.577': + resolution: {integrity: sha512-nH/LehOHiUOYgVWEZTMACLSA5HjIlUXhvAwOWS5Q+BCEkKmOkCnUpZP/lMN9lO+Caqt86XDppmRR1NpdJupH3g==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.576+deed81c1b - '@trpc/react-query': 11.0.0-rc.576+deed81c1b - '@trpc/server': 11.0.0-rc.576+deed81c1b + '@trpc/client': 11.0.0-rc.577+6b5a608eb + '@trpc/react-query': 11.0.0-rc.577+6b5a608eb + '@trpc/server': 11.0.0-rc.577+6b5a608eb next: '*' react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3342,17 +3342,17 @@ packages: '@trpc/react-query': optional: true - '@trpc/react-query@11.0.0-rc.576': - resolution: {integrity: sha512-jqxozfKuafeMaKX7viFwYbkLBrLeLp68wWJceKRSp6Pk+t7opNF7paWti7g4I2zKFj8l8Gfmy8Chtcu4CbLhPA==} + '@trpc/react-query@11.0.0-rc.577': + resolution: {integrity: sha512-xzWjjvYrrydzPaClOmo2WQpVPmmsNwbO6G6u3pTEoEjxCdHOJKzIg/o1vV7JzgpoJoptg1ovMCTI91T1BvyouQ==} peerDependencies: '@tanstack/react-query': ^5.54.1 - '@trpc/client': 11.0.0-rc.576+deed81c1b - '@trpc/server': 11.0.0-rc.576+deed81c1b + '@trpc/client': 11.0.0-rc.577+6b5a608eb + '@trpc/server': 11.0.0-rc.577+6b5a608eb react: '>=18.2.0' react-dom: '>=18.2.0' - '@trpc/server@11.0.0-rc.576': - resolution: {integrity: sha512-SbCjV+6PpYTkmxb1bTuTUPUXHMLp57dHziUzC9ZhQ92kCZ4nIMTHMrrcqv/qNBvVS22H6HUoX+h1k6AVW0wjtw==} + '@trpc/server@11.0.0-rc.577': + resolution: {integrity: sha512-Hk3m8ONry6mcXXEr7bzF2USCWq96GwMkYXiyOinXl6iMQT/FWpx+B0kdRCg3TOCQYIIBZbDwE6/tm1H6WyXHRA==} '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -4528,8 +4528,8 @@ packages: resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} engines: {node: '>=4'} - drizzle-kit@0.26.1: - resolution: {integrity: sha512-5/e1tzOPicPDooCm/uJIU9mWK3eD5dhW5EY61TQyVVo29xYxFLmZpXlBdOYlbfDHBsNhVzhb0XjWFmAAj7d7WA==} + drizzle-kit@0.26.2: + resolution: {integrity: sha512-cMq8omEKywjIy5KcqUo6LvEFxkl8/zYHsgYjFVXjmPWWtuW4blcz+YW9+oIhoaALgs2ebRjzXwsJgN9i6P49Dw==} hasBin: true drizzle-orm@0.35.0: @@ -9583,30 +9583,30 @@ snapshots: '@tootallnate/quickjs-emscripten@0.23.0': {} - '@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576)': + '@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577)': dependencies: - '@trpc/server': 11.0.0-rc.576 + '@trpc/server': 11.0.0-rc.577 - '@trpc/next@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.576)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/next@11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/react-query@11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.577)(next@14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) - '@trpc/server': 11.0.0-rc.576 + '@trpc/client': 11.0.0-rc.577(@trpc/server@11.0.0-rc.577) + '@trpc/server': 11.0.0-rc.577 next: 14.2.15(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.79.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@tanstack/react-query': 5.59.15(react@18.3.1) - '@trpc/react-query': 11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@trpc/react-query': 11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/react-query@11.0.0-rc.576(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.577(@tanstack/react-query@5.59.15(react@18.3.1))(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/react-query': 5.59.15(react@18.3.1) - '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) - '@trpc/server': 11.0.0-rc.576 + '@trpc/client': 11.0.0-rc.577(@trpc/server@11.0.0-rc.577) + '@trpc/server': 11.0.0-rc.577 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@trpc/server@11.0.0-rc.576': {} + '@trpc/server@11.0.0-rc.577': {} '@tsconfig/node10@1.0.11': {} @@ -10996,7 +10996,7 @@ snapshots: drange@1.1.1: {} - drizzle-kit@0.26.1: + drizzle-kit@0.26.2: dependencies: '@drizzle-team/brocli': 0.10.1 '@esbuild-kit/esm-loader': 2.6.5 @@ -14155,10 +14155,10 @@ snapshots: triple-beam@1.4.1: {} - trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.576(@trpc/server@11.0.0-rc.576))(@trpc/server@11.0.0-rc.576)(zod@3.23.8): + trpc-swagger@1.2.6(patch_hash=6s72z7zx33c52iesv5sewipn6i)(@trpc/client@11.0.0-rc.577(@trpc/server@11.0.0-rc.577))(@trpc/server@11.0.0-rc.577)(zod@3.23.8): dependencies: - '@trpc/client': 11.0.0-rc.576(@trpc/server@11.0.0-rc.576) - '@trpc/server': 11.0.0-rc.576 + '@trpc/client': 11.0.0-rc.577(@trpc/server@11.0.0-rc.577) + '@trpc/server': 11.0.0-rc.577 chalk-scripts: 1.2.8 co-body: 6.2.0 lodash.clonedeep: 4.5.0 From 9fa4bef2a4a9edf68299f3095a60d4eaaf144f65 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:14:59 +0000 Subject: [PATCH 20/43] fix(deps): update dependency react-error-boundary to ^4.1.0 (#1304) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- pnpm-lock.yaml | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index b903acc57..64d9d6878 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -68,7 +68,7 @@ "prismjs": "^1.29.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-error-boundary": "^4.0.13", + "react-error-boundary": "^4.1.0", "react-simple-code-editor": "^0.14.1", "sass": "^1.79.5", "superjson": "2.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc4686e97..77fdd6c3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -215,8 +215,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.3.1) + specifier: ^4.1.0 + version: 4.1.0(react@18.3.1) react-simple-code-editor: specifier: ^0.14.1 version: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -6528,8 +6528,9 @@ packages: peerDependencies: react: ^18.3.1 - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + react-error-boundary@4.1.0: + resolution: {integrity: sha512-GFnM3kyswd+9Oy7oX1lxdr39ANHD3ty6cyAK4Kyku+w8Aq9fnK7+yRytKOaPLzOhgtGq18AfTXmDtwlojBPTRg==} + engines: {node: '>=20', pnpm: '=9'} peerDependencies: react: '>=16.13.1' @@ -13237,7 +13238,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-error-boundary@4.0.13(react@18.3.1): + react-error-boundary@4.1.0(react@18.3.1): dependencies: '@babel/runtime': 7.25.6 react: 18.3.1 From c053a373b48ed6cc2f877c581e03264288bbe751 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 08:52:11 +0000 Subject: [PATCH 21/43] fix(deps): update dependency drizzle-orm to ^0.35.1 (#1306) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/db/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 433b0e980..69f91d075 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -42,7 +42,7 @@ "better-sqlite3": "^11.3.0", "dotenv": "^16.4.5", "drizzle-kit": "^0.26.2", - "drizzle-orm": "^0.35.0", + "drizzle-orm": "^0.35.1", "mysql2": "3.11.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77fdd6c3d..6423ea240 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -860,8 +860,8 @@ importers: specifier: ^0.26.2 version: 0.26.2 drizzle-orm: - specifier: ^0.35.0 - version: 0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) + specifier: ^0.35.1 + version: 0.35.1(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1) mysql2: specifier: 3.11.3 version: 3.11.3 @@ -4532,8 +4532,8 @@ packages: resolution: {integrity: sha512-cMq8omEKywjIy5KcqUo6LvEFxkl8/zYHsgYjFVXjmPWWtuW4blcz+YW9+oIhoaALgs2ebRjzXwsJgN9i6P49Dw==} hasBin: true - drizzle-orm@0.35.0: - resolution: {integrity: sha512-fyTKnQ6WZQqSUy6yM4Do2tJPBg1ALR0vJtO9xUTLLubD+0qS1PPuu8aVOeLZQo+g8RPJn+Vqoh30/3lSS8/a2w==} + drizzle-orm@0.35.1: + resolution: {integrity: sha512-HQxDdYuXlZFuvDPztlUIzrX8TqWa/Ej6uN6L0hkbuGL4slexOUMc3u4nXVU15RQ5QYbk+uLQnR6v1+OIrdCTXQ==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -11006,7 +11006,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.35.0(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1): + drizzle-orm@0.35.1(@types/better-sqlite3@7.6.11)(@types/react@18.3.11)(better-sqlite3@11.3.0)(mysql2@3.11.3)(react@18.3.1): optionalDependencies: '@types/better-sqlite3': 7.6.11 '@types/react': 18.3.11 From c4ec4f3c66078b0c94bb049334e32e31e41936ac Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:48:21 +0000 Subject: [PATCH 22/43] fix(deps): update dependency tldts to ^6.1.52 (#1307) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/common/package.json | 2 +- pnpm-lock.yaml | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/common/package.json b/packages/common/package.json index 521e6c7d0..42a57a561 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -29,7 +29,7 @@ "dayjs": "^1.11.13", "next": "^14.2.15", "react": "^18.3.1", - "tldts": "^6.1.51" + "tldts": "^6.1.52" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6423ea240..afa7095dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -672,8 +672,8 @@ importers: specifier: ^18.3.1 version: 18.3.1 tldts: - specifier: ^6.1.51 - version: 6.1.51 + specifier: ^6.1.52 + version: 6.1.52 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -7244,11 +7244,11 @@ packages: title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} - tldts-core@6.1.51: - resolution: {integrity: sha512-bu9oCYYWC1iRjx+3UnAjqCsfrWNZV1ghNQf49b3w5xE8J/tNShHTzp5syWJfwGH+pxUgTTLUnzHnfuydW7wmbg==} + tldts-core@6.1.52: + resolution: {integrity: sha512-j4OxQI5rc1Ve/4m/9o2WhWSC4jGc4uVbCINdOEJRAraCi0YqTqgMcxUx7DbmuP0G3PCixoof/RZB0Q5Kh9tagw==} - tldts@6.1.51: - resolution: {integrity: sha512-33lfQoL0JsDogIbZ8fgRyvv77GnRtwkNE/MOKocwUgPO1WrSfsq7+vQRKxRQZai5zd+zg97Iv9fpFQSzHyWdLA==} + tldts@6.1.52: + resolution: {integrity: sha512-fgrDJXDjbAverY6XnIt0lNfv8A0cf7maTEaZxNykLGsLG7XP+5xhjBTrt/ieAsFjAlZ+G5nmXomLcZDkxXnDzw==} hasBin: true tmp@0.0.33: @@ -14095,11 +14095,11 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - tldts-core@6.1.51: {} + tldts-core@6.1.52: {} - tldts@6.1.51: + tldts@6.1.52: dependencies: - tldts-core: 6.1.51 + tldts-core: 6.1.52 tmp@0.0.33: dependencies: @@ -14128,7 +14128,7 @@ snapshots: tough-cookie@5.0.0: dependencies: - tldts: 6.1.51 + tldts: 6.1.52 tr46@0.0.3: {} From ea43ed0ca47c8e041f8a3d9403bc5d69cf81d30a Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:30:28 +0000 Subject: [PATCH 23/43] chore(deps): update pnpm to v9.12.2 (#1311) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 961682993..35e5bc009 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "vite-tsconfig-paths": "^5.0.1", "vitest": "^2.1.3" }, - "packageManager": "pnpm@9.12.1", + "packageManager": "pnpm@9.12.2", "engines": { "node": ">=20.18.0" }, From a87c937b69550160cc10e9991256c032245fcbfc Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 16 Oct 2024 21:43:51 +0200 Subject: [PATCH 24/43] fix(deps): update dependency eslint-plugin-react-hooks to v5 (#1280) * fix(deps): update dependency eslint-plugin-react-hooks to v5 * fix: lint issues after reenabling hook rules * fix: format issues --------- Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- .../[locale]/boards/(content)/_context.tsx | 1 + .../manage/tools/api/components/api-keys.tsx | 2 +- .../general/_components/_profile-form.tsx | 2 +- .../board/items/item-move-modal.tsx | 4 +- .../sections/gridstack/gridstack-item.tsx | 2 +- .../board/sections/gridstack/use-gridstack.ts | 1 + .../src/components/user-avatar-menu.tsx | 2 +- packages/modals/src/confirm-modal.tsx | 4 +- packages/modals/src/index.tsx | 7 +- .../actions/items/children-action-item.tsx | 2 +- .../actions/items/group-action-item.tsx | 2 +- .../spotlight/src/components/spotlight.tsx | 2 +- packages/spotlight/src/lib/children.ts | 4 +- packages/spotlight/src/lib/group.ts | 2 +- packages/spotlight/src/lib/interaction.ts | 2 +- .../apps-search-group.tsx | 8 +- .../boards-search-group.tsx | 10 +- .../integrations-search-group.tsx | 2 +- .../src/modes/command/children/language.tsx | 4 +- .../command/children/new-integration.tsx | 4 +- .../spotlight/src/modes/command/index.tsx | 2 +- .../external/search-engines-search-group.tsx | 6 +- packages/spotlight/src/modes/index.tsx | 4 +- .../src/modes/page/pages-search-group.tsx | 2 +- .../modes/user-group/groups-search-group.tsx | 10 +- .../modes/user-group/users-search-group.tsx | 6 +- .../ui/src/components/table-pagination.tsx | 4 +- .../src/_inputs/widget-location-input.tsx | 2 +- .../src/_inputs/widget-multi-text-input.tsx | 2 +- packages/widgets/src/downloads/component.tsx | 97 +++++---- .../src/health-monitoring/component.tsx | 200 +++++++++--------- .../src/media-requests/list/component.tsx | 2 +- packages/widgets/src/notebook/notebook.tsx | 40 ++-- .../src/smart-home/entity-state/component.tsx | 6 +- .../execute-automation/component.tsx | 2 +- packages/widgets/src/video/component.tsx | 2 +- pnpm-lock.yaml | 16 +- tooling/eslint/package.json | 2 +- tooling/eslint/react.js | 3 - 39 files changed, 251 insertions(+), 224 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx b/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx index 346baff75..808759af1 100644 --- a/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx +++ b/apps/nextjs/src/app/[locale]/boards/(content)/_context.tsx @@ -49,6 +49,7 @@ export const BoardProvider = ({ 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) => { diff --git a/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx b/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx index 86503427c..71a0efb1b 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/api/components/api-keys.tsx @@ -47,7 +47,7 @@ export const ApiKeysManagement = ({ apiKeys }: ApiKeysManagementProps) => { ), }, ], - [], + [t], ); const table = useMantineReactTable({ diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-form.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-form.tsx index 0099dcbd8..b2d5ab87e 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-form.tsx @@ -61,7 +61,7 @@ export const UserProfileForm = ({ user }: UserProfileFormProps) => { id: user.id, }); }, - [user.id, mutate], + [isProviderCredentials, mutate, user.id], ); return ( diff --git a/apps/nextjs/src/components/board/items/item-move-modal.tsx b/apps/nextjs/src/components/board/items/item-move-modal.tsx index 64df4424b..b04a80195 100644 --- a/apps/nextjs/src/components/board/items/item-move-modal.tsx +++ b/apps/nextjs/src/components/board/items/item-move-modal.tsx @@ -8,7 +8,6 @@ import { useI18n, useScopedI18n } from "@homarr/translation/client"; import { z } from "@homarr/validation"; import type { Item } from "~/app/[locale]/boards/_types"; -import { useItemActions } from "./item-actions"; interface InnerProps { gridStack: GridStack; @@ -21,7 +20,6 @@ export const ItemMoveModal = createModal(({ actions, innerProps }) = const t = useI18n(); // Keep track of the maximum width based on the x offset const maxWidthRef = useRef(innerProps.columnCount - innerProps.item.xOffset); - const { moveAndResizeItem } = useItemActions(); const form = useZodForm( z.object({ xOffset: z @@ -62,7 +60,7 @@ export const ItemMoveModal = createModal(({ actions, innerProps }) = }); actions.closeModal(); }, - [moveAndResizeItem], + [actions, innerProps.gridStack, innerProps.item.id], ); return ( diff --git a/apps/nextjs/src/components/board/sections/gridstack/gridstack-item.tsx b/apps/nextjs/src/components/board/sections/gridstack/gridstack-item.tsx index 554a376fa..beff12f66 100644 --- a/apps/nextjs/src/components/board/sections/gridstack/gridstack-item.tsx +++ b/apps/nextjs/src/components/board/sections/gridstack/gridstack-item.tsx @@ -39,7 +39,7 @@ export const GridStackItem = ({ if (type !== "section") return; innerRef.current.gridstackNode.minW = minWidth; innerRef.current.gridstackNode.minH = minHeight; - }, [minWidth, minHeight, innerRef]); + }, [minWidth, minHeight, innerRef, type]); return ( , itemIds: string[]) } // Only run this effect when the section items change + // eslint-disable-next-line react-hooks/exhaustive-deps }, [itemIds.length, columnCount]); /** diff --git a/apps/nextjs/src/components/user-avatar-menu.tsx b/apps/nextjs/src/components/user-avatar-menu.tsx index 9a03b4200..1dafdce25 100644 --- a/apps/nextjs/src/components/user-avatar-menu.tsx +++ b/apps/nextjs/src/components/user-avatar-menu.tsx @@ -58,7 +58,7 @@ export const UserAvatarMenu = ({ children }: UserAvatarMenuProps) => { router.refresh(); }, }); - }, [openModal, router]); + }, [logoutUrl, openModal, router]); return ( diff --git a/packages/modals/src/confirm-modal.tsx b/packages/modals/src/confirm-modal.tsx index 752506cb8..9f3f2b4ac 100644 --- a/packages/modals/src/confirm-modal.tsx +++ b/packages/modals/src/confirm-modal.tsx @@ -53,7 +53,7 @@ export const ConfirmModal = createModal>(({ act actions.closeModal(); } }, - [cancelProps?.onClick, onCancel, actions.closeModal], + [cancelProps, onCancel, closeOnCancel, actions], ); const handleConfirm = useCallback( @@ -73,7 +73,7 @@ export const ConfirmModal = createModal>(({ act } setLoading(false); }, - [confirmProps?.onClick, onConfirm, actions.closeModal], + [confirmProps, onConfirm, closeOnConfirm, actions], ); return ( diff --git a/packages/modals/src/index.tsx b/packages/modals/src/index.tsx index f3c9e1386..02bc4cff4 100644 --- a/packages/modals/src/index.tsx +++ b/packages/modals/src/index.tsx @@ -38,7 +38,7 @@ export const ModalProvider = ({ children }: PropsWithChildren) => { (id: string, canceled?: boolean) => { dispatch({ type: "CLOSE", modalId: id, canceled }); }, - [stateRef, dispatch], + [dispatch], ); const openModalInner: ModalContextProps["openModalInner"] = useCallback( @@ -63,10 +63,7 @@ export const ModalProvider = ({ children }: PropsWithChildren) => { [dispatch], ); - const handleCloseModal = useCallback( - () => state.current && closeModal(state.current.id), - [closeModal, state.current?.id], - ); + const handleCloseModal = useCallback(() => state.current && closeModal(state.current.id), [closeModal, state]); const activeModals = state.modals.filter((modal) => modal.id === state.current?.id || modal.props.keepMounted); diff --git a/packages/spotlight/src/components/actions/items/children-action-item.tsx b/packages/spotlight/src/components/actions/items/children-action-item.tsx index c36fb3c65..0b070b147 100644 --- a/packages/spotlight/src/components/actions/items/children-action-item.tsx +++ b/packages/spotlight/src/components/actions/items/children-action-item.tsx @@ -24,7 +24,7 @@ export const ChildrenActionItem = ({ childrenOptions, action, query }: ChildrenA return ( - + ); }; diff --git a/packages/spotlight/src/components/actions/items/group-action-item.tsx b/packages/spotlight/src/components/actions/items/group-action-item.tsx index 1b2ebe1c5..6dd70c5ff 100644 --- a/packages/spotlight/src/components/actions/items/group-action-item.tsx +++ b/packages/spotlight/src/components/actions/items/group-action-item.tsx @@ -48,7 +48,7 @@ export const SpotlightGroupActionItem = closeSpotlightOnTrigger={interaction.type !== "mode" && interaction.type !== "children"} className={classes.spotlightAction} > - + ); }; diff --git a/packages/spotlight/src/components/spotlight.tsx b/packages/spotlight/src/components/spotlight.tsx index f84af4add..2de76db8c 100644 --- a/packages/spotlight/src/components/spotlight.tsx +++ b/packages/spotlight/src/components/spotlight.tsx @@ -92,7 +92,7 @@ export const Spotlight = () => { {childrenOptions ? ( - + ) : null} diff --git a/packages/spotlight/src/lib/children.ts b/packages/spotlight/src/lib/children.ts index 1a792a2b6..69b3c00b1 100644 --- a/packages/spotlight/src/lib/children.ts +++ b/packages/spotlight/src/lib/children.ts @@ -3,13 +3,13 @@ import type { ReactNode } from "react"; import type { inferSearchInteractionDefinition } from "./interaction"; export interface CreateChildrenOptionsProps> { - detailComponent: ({ options }: { options: TParentOptions }) => ReactNode; + DetailComponent: ({ options }: { options: TParentOptions }) => ReactNode; useActions: (options: TParentOptions, query: string) => ChildrenAction[]; } export interface ChildrenAction> { key: string; - component: (option: TParentOptions) => JSX.Element; + Component: (option: TParentOptions) => JSX.Element; useInteraction: (option: TParentOptions, query: string) => inferSearchInteractionDefinition<"link" | "javaScript">; hide?: boolean | ((option: TParentOptions) => boolean); } diff --git a/packages/spotlight/src/lib/group.ts b/packages/spotlight/src/lib/group.ts index dda1fa7a8..900990e4a 100644 --- a/packages/spotlight/src/lib/group.ts +++ b/packages/spotlight/src/lib/group.ts @@ -8,7 +8,7 @@ type CommonSearchGroup, TOptionProps ext // key path is used to define the path to a unique key in the option object keyPath: keyof TOption; title: stringOrTranslation; - component: (option: TOption) => JSX.Element; + Component: (option: TOption) => JSX.Element; useInteraction: (option: TOption, query: string) => inferSearchInteractionDefinition; onKeyDown?: ( event: KeyboardEvent, diff --git a/packages/spotlight/src/lib/interaction.ts b/packages/spotlight/src/lib/interaction.ts index 1528a39ca..b917b3bcd 100644 --- a/packages/spotlight/src/lib/interaction.ts +++ b/packages/spotlight/src/lib/interaction.ts @@ -16,7 +16,7 @@ const searchInteractions = [ // eslint-disable-next-line @typescript-eslint/no-explicit-any useActions: CreateChildrenOptionsProps["useActions"]; // eslint-disable-next-line @typescript-eslint/no-explicit-any - detailComponent: CreateChildrenOptionsProps["detailComponent"]; + DetailComponent: CreateChildrenOptionsProps["DetailComponent"]; // eslint-disable-next-line @typescript-eslint/no-explicit-any option: any; }>(), diff --git a/packages/spotlight/src/modes/app-integration-board/apps-search-group.tsx b/packages/spotlight/src/modes/app-integration-board/apps-search-group.tsx index 5d2dc98a6..477842ac2 100644 --- a/packages/spotlight/src/modes/app-integration-board/apps-search-group.tsx +++ b/packages/spotlight/src/modes/app-integration-board/apps-search-group.tsx @@ -16,7 +16,7 @@ const appChildrenOptions = createChildrenOptions({ useActions: () => [ { key: "open", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -34,7 +34,7 @@ const appChildrenOptions = createChildrenOptions({ }, { key: "edit", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -47,7 +47,7 @@ const appChildrenOptions = createChildrenOptions({ useInteraction: interaction.link(({ id }) => ({ href: `/manage/apps/edit/${id}` })), }, ], - detailComponent: ({ options }) => { + DetailComponent: ({ options }) => { const t = useI18n(); return ( @@ -75,7 +75,7 @@ const appChildrenOptions = createChildrenOptions({ export const appsSearchGroup = createGroup({ keyPath: "id", title: (t) => t("search.mode.appIntegrationBoard.group.app.title"), - component: (app) => ( + Component: (app) => ( ({ const actions: (ChildrenAction & { hidden?: boolean })[] = [ { key: "open", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -37,7 +37,7 @@ const boardChildrenOptions = createChildrenOptions({ }, { key: "homeBoard", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -61,7 +61,7 @@ const boardChildrenOptions = createChildrenOptions({ }, { key: "settings", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -78,7 +78,7 @@ const boardChildrenOptions = createChildrenOptions({ return actions; }, - detailComponent: ({ options: board }) => { + DetailComponent: ({ options: board }) => { const t = useI18n(); return ( @@ -102,7 +102,7 @@ const boardChildrenOptions = createChildrenOptions({ export const boardsSearchGroup = createGroup({ keyPath: "id", title: "Boards", - component: (board) => ( + Component: (board) => ( {board.logoImageUrl ? ( {board.name} diff --git a/packages/spotlight/src/modes/app-integration-board/integrations-search-group.tsx b/packages/spotlight/src/modes/app-integration-board/integrations-search-group.tsx index 55fd14eca..28926a165 100644 --- a/packages/spotlight/src/modes/app-integration-board/integrations-search-group.tsx +++ b/packages/spotlight/src/modes/app-integration-board/integrations-search-group.tsx @@ -10,7 +10,7 @@ import { interaction } from "../../lib/interaction"; export const integrationsSearchGroup = createGroup<{ id: string; kind: IntegrationKind; name: string }>({ keyPath: "id", title: (t) => t("search.mode.appIntegrationBoard.group.integration.title"), - component: (integration) => ( + Component: (integration) => ( diff --git a/packages/spotlight/src/modes/command/children/language.tsx b/packages/spotlight/src/modes/command/children/language.tsx index 7a248275a..848139b68 100644 --- a/packages/spotlight/src/modes/command/children/language.tsx +++ b/packages/spotlight/src/modes/command/children/language.tsx @@ -30,7 +30,7 @@ export const languageChildrenOptions = createChildrenOptions ({ key: localeKey, - component() { + Component() { return ( @@ -53,7 +53,7 @@ export const languageChildrenOptions = createChildrenOptions { + DetailComponent: () => { const t = useI18n(); return ( diff --git a/packages/spotlight/src/modes/command/children/new-integration.tsx b/packages/spotlight/src/modes/command/children/new-integration.tsx index d70a719f3..aebb6ede1 100644 --- a/packages/spotlight/src/modes/command/children/new-integration.tsx +++ b/packages/spotlight/src/modes/command/children/new-integration.tsx @@ -20,7 +20,7 @@ export const newIntegrationChildrenOptions = createChildrenOptions ({ key: kind, - component() { + Component() { return ( @@ -31,7 +31,7 @@ export const newIntegrationChildrenOptions = createChildrenOptions ({ href: `/manage/integrations/new?kind=${kind}` })), })); }, - detailComponent() { + DetailComponent() { const t = useI18n(); return ( diff --git a/packages/spotlight/src/modes/command/index.tsx b/packages/spotlight/src/modes/command/index.tsx index 240fd13b5..88f208104 100644 --- a/packages/spotlight/src/modes/command/index.tsx +++ b/packages/spotlight/src/modes/command/index.tsx @@ -44,7 +44,7 @@ export const commandMode = { keyPath: "commandKey", title: "Global commands", useInteraction: (option, query) => option.useInteraction(option, query), - component: ({ icon: Icon, name }) => ( + Component: ({ icon: Icon, name }) => ( {name} diff --git a/packages/spotlight/src/modes/external/search-engines-search-group.tsx b/packages/spotlight/src/modes/external/search-engines-search-group.tsx index 4c76532e9..fd7563207 100644 --- a/packages/spotlight/src/modes/external/search-engines-search-group.tsx +++ b/packages/spotlight/src/modes/external/search-engines-search-group.tsx @@ -15,7 +15,7 @@ export const searchEnginesChildrenOptions = createChildrenOptions( useActions: () => [ { key: "search", - component: ({ name }) => { + Component: ({ name }) => { const tChildren = useScopedI18n("search.mode.external.group.searchEngine.children"); return ( @@ -30,7 +30,7 @@ export const searchEnginesChildrenOptions = createChildrenOptions( })), }, ], - detailComponent({ options }) { + DetailComponent({ options }) { const tChildren = useScopedI18n("search.mode.external.group.searchEngine.children"); return ( @@ -47,7 +47,7 @@ export const searchEnginesChildrenOptions = createChildrenOptions( export const searchEnginesSearchGroups = createGroup({ keyPath: "short", title: (t) => t("search.mode.external.group.searchEngine.title"), - component: ({ iconUrl, name, short, description }) => { + Component: ({ iconUrl, name, short, description }) => { return ( diff --git a/packages/spotlight/src/modes/index.tsx b/packages/spotlight/src/modes/index.tsx index 077e8fa11..afb613e74 100644 --- a/packages/spotlight/src/modes/index.tsx +++ b/packages/spotlight/src/modes/index.tsx @@ -22,7 +22,7 @@ const helpMode = { keyPath: "character", title: (t) => t("search.mode.help.group.mode.title"), options: searchModesWithoutHelp.map(({ character, modeKey }) => ({ character, modeKey })), - component: ({ modeKey, character }) => { + Component: ({ modeKey, character }) => { const t = useScopedI18n(`search.mode.${modeKey}`); return ( @@ -59,7 +59,7 @@ const helpMode = { }, ]; }, - component: (props) => ( + Component: (props) => ( {props.label} diff --git a/packages/spotlight/src/modes/page/pages-search-group.tsx b/packages/spotlight/src/modes/page/pages-search-group.tsx index e0b268a12..698f6166c 100644 --- a/packages/spotlight/src/modes/page/pages-search-group.tsx +++ b/packages/spotlight/src/modes/page/pages-search-group.tsx @@ -29,7 +29,7 @@ export const pagesSearchGroup = createGroup<{ }>({ keyPath: "path", title: (t) => t("search.mode.page.group.page.title"), - component: ({ name, icon: Icon }) => ( + Component: ({ name, icon: Icon }) => ( {name} diff --git a/packages/spotlight/src/modes/user-group/groups-search-group.tsx b/packages/spotlight/src/modes/user-group/groups-search-group.tsx index 507c7cb80..8ffb2a6e2 100644 --- a/packages/spotlight/src/modes/user-group/groups-search-group.tsx +++ b/packages/spotlight/src/modes/user-group/groups-search-group.tsx @@ -16,7 +16,7 @@ const groupChildrenOptions = createChildrenOptions({ useActions: () => [ { key: "detail", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -29,7 +29,7 @@ const groupChildrenOptions = createChildrenOptions({ }, { key: "manageMember", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -42,7 +42,7 @@ const groupChildrenOptions = createChildrenOptions({ }, { key: "managePermission", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -54,7 +54,7 @@ const groupChildrenOptions = createChildrenOptions({ useInteraction: interaction.link(({ id }) => ({ href: `/manage/users/groups/${id}/permissions` })), }, ], - detailComponent: ({ options }) => { + DetailComponent: ({ options }) => { const t = useI18n(); return ( @@ -71,7 +71,7 @@ const groupChildrenOptions = createChildrenOptions({ export const groupsSearchGroup = createGroup({ keyPath: "id", title: "Groups", - component: ({ name }) => ( + Component: ({ name }) => ( {name} diff --git a/packages/spotlight/src/modes/user-group/users-search-group.tsx b/packages/spotlight/src/modes/user-group/users-search-group.tsx index ec750f182..b27dfbc37 100644 --- a/packages/spotlight/src/modes/user-group/users-search-group.tsx +++ b/packages/spotlight/src/modes/user-group/users-search-group.tsx @@ -17,7 +17,7 @@ const userChildrenOptions = createChildrenOptions({ useActions: () => [ { key: "detail", - component: () => { + Component: () => { const t = useI18n(); return ( @@ -30,7 +30,7 @@ const userChildrenOptions = createChildrenOptions({ useInteraction: interaction.link(({ id }) => ({ href: `/manage/users/${id}/general` })), }, ], - detailComponent: ({ options }) => { + DetailComponent: ({ options }) => { const t = useI18n(); return ( @@ -49,7 +49,7 @@ const userChildrenOptions = createChildrenOptions({ export const usersSearchGroup = createGroup({ keyPath: "id", title: (t) => t("search.mode.userGroup.group.user.title"), - component: (user) => ( + Component: (user) => ( {user.name} diff --git a/packages/ui/src/components/table-pagination.tsx b/packages/ui/src/components/table-pagination.tsx index 83420ba54..e2380f821 100644 --- a/packages/ui/src/components/table-pagination.tsx +++ b/packages/ui/src/components/table-pagination.tsx @@ -34,7 +34,7 @@ export const TablePagination = ({ total }: TablePaginationProps) => { (control: ControlType) => { return getItemProps(calculatePageFor(control, current, total)); }, - [current], + [current, getItemProps, total], ); const handleChange = useCallback( @@ -43,7 +43,7 @@ export const TablePagination = ({ total }: TablePaginationProps) => { params.set("page", page.toString()); replace(`${pathName}?${params.toString()}`); }, - [pathName, searchParams], + [pathName, replace, searchParams], ); return ( diff --git a/packages/widgets/src/_inputs/widget-location-input.tsx b/packages/widgets/src/_inputs/widget-location-input.tsx index e264aee64..a27be85cb 100644 --- a/packages/widgets/src/_inputs/widget-location-input.tsx +++ b/packages/widgets/src/_inputs/widget-location-input.tsx @@ -46,7 +46,7 @@ export const WidgetLocationInput = ({ property, kind }: CommonWidgetInputProps<" form.clearFieldError(`options.${property}.latitude`); form.clearFieldError(`options.${property}.longitude`); }, - [handleChange], + [form, handleChange, property], ); const onSearch = useCallback(() => { diff --git a/packages/widgets/src/_inputs/widget-multi-text-input.tsx b/packages/widgets/src/_inputs/widget-multi-text-input.tsx index 2da483fac..9d1e9113f 100644 --- a/packages/widgets/src/_inputs/widget-multi-text-input.tsx +++ b/packages/widgets/src/_inputs/widget-multi-text-input.tsx @@ -39,7 +39,7 @@ export const WidgetMultiTextInput = ({ property, kind, options }: CommonWidgetIn success: validationResult.success, result: validationResult, }; - }, [search]); + }, [options.validate, search]); const error = React.useMemo(() => { /* hide the error when nothing is being typed since "" is not valid but is not an explicit error */ diff --git a/packages/widgets/src/downloads/component.tsx b/packages/widgets/src/downloads/component.tsx index 329565e3f..e437787ef 100644 --- a/packages/widgets/src/downloads/component.tsx +++ b/packages/widgets/src/downloads/component.tsx @@ -2,7 +2,7 @@ import "../widgets-common.css"; -import { useMemo, useState } from "react"; +import { useCallback, useMemo, useState } from "react"; import type { MantineStyleProp } from "@mantine/core"; import { ActionIcon, @@ -233,7 +233,19 @@ export default function DownloadClientsWidget({ ) //flatMap already sorts by integration by nature, add sorting by integration type (usenet | torrent) .sort(({ type: typeA }, { type: typeB }) => typeA.length - typeB.length), - [currentItems, integrationIds, options], + [ + currentItems, + integrationIds, + integrationsWithInteractions, + mutateDeleteItem, + mutatePauseItem, + mutateResumeItem, + options.activeTorrentThreshold, + options.categoryFilter, + options.filterIsWhitelist, + options.showCompletedTorrent, + options.showCompletedUsenet, + ], ); //Flatten Clients Array for which each elements has the integration and general client infos. @@ -278,7 +290,14 @@ export default function DownloadClientsWidget({ ({ status: statusA }, { status: statusB }) => (statusA?.type.length ?? Infinity) - (statusB?.type.length ?? Infinity), ), - [currentItems, integrationIds, options], + [ + currentItems, + integrationIds, + integrationsWithInteractions, + options.applyFilterToRatio, + options.categoryFilter, + options.filterIsWhitelist, + ], ); //Check existing types between torrents and usenet @@ -333,37 +352,40 @@ export default function DownloadClientsWidget({ }; //Base element in common with all columns - const columnsDefBase = ({ - key, - showHeader, - align, - }: { - key: keyof ExtendedDownloadClientItem; - showHeader: boolean; - align?: "center" | "left" | "right" | "justify" | "char"; - }): MRT_ColumnDef => { - const style: MantineStyleProp = { - minWidth: 0, - width: "var(--column-width)", - height: "var(--ratio-width)", - padding: "var(--space-size)", - transition: "unset", - "--key-width": columnsRatios[key], - "--column-width": "calc((var(--key-width)/var(--total-width) * 100cqw))", - }; - return { - id: key, - accessorKey: key, - header: key, - size: columnsRatios[key], - mantineTableBodyCellProps: { style, align }, - mantineTableHeadCellProps: { - style, - align: isEditMode ? "center" : align, - }, - Header: () => (showHeader && !isEditMode ? {t(`items.${key}.columnTitle`)} : ""), - }; - }; + const columnsDefBase = useCallback( + ({ + key, + showHeader, + align, + }: { + key: keyof ExtendedDownloadClientItem; + showHeader: boolean; + align?: "center" | "left" | "right" | "justify" | "char"; + }): MRT_ColumnDef => { + const style: MantineStyleProp = { + minWidth: 0, + width: "var(--column-width)", + height: "var(--ratio-width)", + padding: "var(--space-size)", + transition: "unset", + "--key-width": columnsRatios[key], + "--column-width": "calc((var(--key-width)/var(--total-width) * 100cqw))", + }; + return { + id: key, + accessorKey: key, + header: key, + size: columnsRatios[key], + mantineTableBodyCellProps: { style, align }, + mantineTableHeadCellProps: { + style, + align: isEditMode ? "center" : align, + }, + Header: () => (showHeader && !isEditMode ? {t(`items.${key}.columnTitle`)} : ""), + }; + }, + [isEditMode, t], + ); //Make columns and cell elements, Memoized to data with deps on data and EditMode const columns = useMemo[]>( @@ -580,7 +602,7 @@ export default function DownloadClientsWidget({ }, }, ], - [clickedIndex, isEditMode, data, integrationIds, options], + [columnsDefBase, t, tCommon], ); //Table build and config @@ -704,10 +726,7 @@ interface ItemInfoModalProps { } const ItemInfoModal = ({ items, currentIndex, opened, onClose }: ItemInfoModalProps) => { - const item = useMemo( - () => items[currentIndex], - [items, currentIndex, opened], - ); + const item = useMemo(() => items[currentIndex], [items, currentIndex]); const t = useScopedI18n("widget.downloads.states"); //The use case for "No item found" should be impossible, hence no translation return ( diff --git a/packages/widgets/src/health-monitoring/component.tsx b/packages/widgets/src/health-monitoring/component.tsx index dec33ff08..9e55872aa 100644 --- a/packages/widgets/src/health-monitoring/component.tsx +++ b/packages/widgets/src/health-monitoring/component.tsx @@ -57,22 +57,19 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg throw new NoIntegrationSelectedError(); } return ( - + {healthData.map(({ integrationId, integrationName, healthInfo }) => { - const memoryUsage = formatMemoryUsage(healthInfo.memAvailable, healthInfo.memUsed); const disksData = matchFileSystemAndSmart(healthInfo.fileSystem, healthInfo.smart); - const { ref, width } = useElementSize(); - const ringSize = width * 0.95; - const ringThickness = width / 10; - const progressSize = width * 0.2; - + const memoryUsage = formatMemoryUsage(healthInfo.memAvailable, healthInfo.memUsed); return ( - - + - {options.cpu && ( - - - {`${healthInfo.cpuUtilization.toFixed(2)}%`} - - - } - sections={[ - { - value: Number(healthInfo.cpuUtilization.toFixed(2)), - color: progressColor(Number(healthInfo.cpuUtilization.toFixed(2))), - }, - ]} - /> - - )} + {options.cpu && } {healthInfo.cpuTemp && options.cpu && ( - - - - {options.fahrenheit - ? `${(healthInfo.cpuTemp * 1.8 + 32).toFixed(1)}°F` - : `${healthInfo.cpuTemp}°C`} - - - - } - sections={[ - { - value: healthInfo.cpuTemp, - color: progressColor(healthInfo.cpuTemp), - }, - ]} - /> - - )} - {options.memory && ( - - - - {memoryUsage.memUsed.GB}GiB - - - - } - sections={[ - { - value: Number(memoryUsage.memUsed.percent), - color: progressColor(Number(memoryUsage.memUsed.percent)), - tooltip: `${memoryUsage.memUsed.percent}%`, - }, - ]} - /> - + )} + {options.memory && } {options.fileSystem && disksData.map((disk) => { return ( - + @@ -266,14 +185,14 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg - + - + {t("widget.healthMonitoring.popover.used")} @@ -291,7 +210,7 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg value={100 - disk.percentage} color="default" > - + {t("widget.healthMonitoring.popover.diskAvailable")} @@ -300,10 +219,10 @@ export default function HealthMonitoringWidget({ options, integrationIds }: Widg ); })} - + ); })} - + ); } @@ -349,6 +268,95 @@ export const matchFileSystemAndSmart = (fileSystems: FileSystem[], smartData: Sm }); }; +const CpuRing = ({ cpuUtilization }: { cpuUtilization: number }) => { + const { width, ref } = useElementSize(); + + return ( + + + {`${cpuUtilization.toFixed(2)}%`} + + + } + sections={[ + { + value: Number(cpuUtilization.toFixed(2)), + color: progressColor(Number(cpuUtilization.toFixed(2))), + }, + ]} + /> + + ); +}; + +const CpuTempRing = ({ fahrenheit, cpuTemp }: { fahrenheit: boolean; cpuTemp: number }) => { + const { width, ref } = useElementSize(); + return ( + + + + {fahrenheit ? `${(cpuTemp * 1.8 + 32).toFixed(1)}°F` : `${cpuTemp}°C`} + + + + } + sections={[ + { + value: cpuTemp, + color: progressColor(cpuTemp), + }, + ]} + /> + + ); +}; + +const MemoryRing = ({ available, used }: { available: string; used: string }) => { + const { width, ref } = useElementSize(); + const memoryUsage = formatMemoryUsage(available, used); + + return ( + + + + {memoryUsage.memUsed.GB}GiB + + + + } + sections={[ + { + value: Number(memoryUsage.memUsed.percent), + color: progressColor(Number(memoryUsage.memUsed.percent)), + tooltip: `${memoryUsage.memUsed.percent}%`, + }, + ]} + /> + + ); +}; + export const formatMemoryUsage = (memFree: string, memUsed: string) => { const memFreeBytes = Number(memFree); const memUsedBytes = Number(memUsed); diff --git a/packages/widgets/src/media-requests/list/component.tsx b/packages/widgets/src/media-requests/list/component.tsx index bc6df6b25..ce67166ba 100644 --- a/packages/widgets/src/media-requests/list/component.tsx +++ b/packages/widgets/src/media-requests/list/component.tsx @@ -46,7 +46,7 @@ export default function MediaServerWidget({ } return 0; }), - [mediaRequests, integrationIds], + [mediaRequests], ); const { mutate: mutateRequestAnswer } = clientApi.widget.mediaRequests.answerRequest.useMutation(); diff --git a/packages/widgets/src/notebook/notebook.tsx b/packages/widgets/src/notebook/notebook.tsx index 9eebb48a0..295227201 100644 --- a/packages/widgets/src/notebook/notebook.tsx +++ b/packages/widgets/src/notebook/notebook.tsx @@ -189,17 +189,31 @@ export function Notebook({ options, isEditMode, boardId, itemId }: WidgetCompone addEventListener("onReadOnlyCheck", handleOnReadOnlyCheck); - const handleEditToggleCallback = (previous: boolean) => { - const current = !previous; - if (!editor) return current; - editor.setEditable(current); + const handleContentUpdate = useCallback( + (contentUpdate: string) => { + setToSaveContent(contentUpdate); + // This is not available in preview mode + if (boardId && itemId) { + void mutateAsync({ boardId, itemId, content: contentUpdate }); + } + }, + [boardId, itemId, mutateAsync], + ); - handleContentUpdate(content); + const handleEditToggleCallback = useCallback( + (previous: boolean) => { + const current = !previous; + if (!editor) return current; + editor.setEditable(current); - return current; - }; + handleContentUpdate(content); - const handleEditCancelCallback = () => { + return current; + }, + [content, editor, handleContentUpdate], + ); + + const handleEditCancelCallback = useCallback(() => { if (!editor) return false; editor.setEditable(false); @@ -207,20 +221,12 @@ export function Notebook({ options, isEditMode, boardId, itemId }: WidgetCompone editor.commands.setContent(toSaveContent); return false; - }; + }, [editor, toSaveContent]); const handleEditCancel = useCallback(() => { setIsEditing(handleEditCancelCallback); }, [setIsEditing, handleEditCancelCallback]); - const handleContentUpdate = (contentUpdate: string) => { - setToSaveContent(contentUpdate); - // This is not available in preview mode - if (boardId && itemId) { - void mutateAsync({ boardId, itemId, content: contentUpdate }); - } - }; - const handleEditToggle = useCallback(() => { setIsEditing(handleEditToggleCallback); }, [setIsEditing, handleEditToggleCallback]); diff --git a/packages/widgets/src/smart-home/entity-state/component.tsx b/packages/widgets/src/smart-home/entity-state/component.tsx index c7e590b71..b627e5f73 100644 --- a/packages/widgets/src/smart-home/entity-state/component.tsx +++ b/packages/widgets/src/smart-home/entity-state/component.tsx @@ -1,6 +1,6 @@ "use client"; -import React, { useState } from "react"; +import React, { useCallback, useState } from "react"; import { Center, Stack, Text, UnstyledButton } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; @@ -38,7 +38,7 @@ export default function SmartHomeEntityStateWidget({ const attribute = options.entityUnit.length > 0 ? " " + options.entityUnit : ""; - const handleClick = React.useCallback(() => { + const handleClick = useCallback(() => { if (isEditMode) { return; } @@ -51,7 +51,7 @@ export default function SmartHomeEntityStateWidget({ entityId: options.entityId, integrationId: integrationIds[0] ?? "", }); - }, []); + }, [integrationIds, isEditMode, mutate, options.clickable, options.entityId]); return ( {isShowSuccess && ( diff --git a/packages/widgets/src/video/component.tsx b/packages/widgets/src/video/component.tsx index 8832d2390..0893e6d8d 100644 --- a/packages/widgets/src/video/component.tsx +++ b/packages/widgets/src/video/component.tsx @@ -72,7 +72,7 @@ const Feed = ({ options }: Pick, "options">) => { () => undefined, ); } - }, [videoRef]); + }, [options.hasAutoPlay, options.hasControls, options.isMuted, videoRef]); return ( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index afa7095dc..fec5e8b66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,7 +24,7 @@ importers: version: 4.3.2(vite@5.4.5(@types/node@20.16.11)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/coverage-v8': specifier: ^2.1.3 - version: 2.1.3(vitest@2.1.3) + version: 2.1.3(vitest@2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0)) '@vitest/ui': specifier: ^2.1.3 version: 2.1.3(vitest@2.1.3) @@ -1655,8 +1655,8 @@ importers: specifier: ^7.37.1 version: 7.37.1(eslint@9.12.0) eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@9.12.0) + specifier: ^5.0.0 + version: 5.0.0(eslint@9.12.0) typescript-eslint: specifier: ^8.9.0 version: 8.9.0(eslint@9.12.0)(typescript@5.6.3) @@ -4795,11 +4795,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.1: resolution: {integrity: sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==} @@ -9967,7 +9967,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.3(vitest@2.1.3)': + '@vitest/coverage-v8@2.1.3(vitest@2.1.3(@types/node@20.16.11)(@vitest/ui@2.1.3)(jsdom@25.0.1)(sass@1.79.5)(sugarss@4.0.1(postcss@8.4.47))(terser@5.32.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -11361,7 +11361,7 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.0 - eslint-plugin-react-hooks@4.6.2(eslint@9.12.0): + eslint-plugin-react-hooks@5.0.0(eslint@9.12.0): dependencies: eslint: 9.12.0 diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 599d84db2..a2d50fa83 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -22,7 +22,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.1", - "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-hooks": "^5.0.0", "typescript-eslint": "^8.9.0" }, "devDependencies": { diff --git a/tooling/eslint/react.js b/tooling/eslint/react.js index c36e835df..abbf8f1d1 100644 --- a/tooling/eslint/react.js +++ b/tooling/eslint/react.js @@ -12,9 +12,6 @@ export default [ rules: { ...reactPlugin.configs["jsx-runtime"].rules, ...hooksPlugin.configs.recommended.rules, - // context.getSource is not a function - "react-hooks/rules-of-hooks": "off", - "react-hooks/exhaustive-deps": "off", }, languageOptions: { globals: { From a0cc31da700defc9a4f5c4210962571cbfe2b362 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Wed, 16 Oct 2024 21:44:12 +0200 Subject: [PATCH 25/43] feat: populate integration name for new integrations automatically (#1296) --- .../manage/integrations/new/_integration-new-form.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 25eacf9b9..791be2938 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -9,7 +9,7 @@ import { IconInfoCircle } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { revalidatePathActionAsync } from "@homarr/common/client"; import type { IntegrationKind, IntegrationSecretKind } from "@homarr/definitions"; -import { getAllSecretKindOptions } from "@homarr/definitions"; +import { getAllSecretKindOptions, getIntegrationName } from "@homarr/definitions"; import type { UseFormReturnType } from "@homarr/form"; import { useZodForm } from "@homarr/form"; import { convertIntegrationTestConnectionError } from "@homarr/integrations/client"; @@ -32,7 +32,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => const router = useRouter(); const form = useZodForm(validation.integration.create.omit({ kind: true }), { initialValues: { - name: searchParams.name ?? "", + name: searchParams.name ?? getIntegrationName(searchParams.kind), url: searchParams.url ?? "", secrets: secretKinds[0].map((kind) => ({ kind, @@ -81,7 +81,7 @@ export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => return (
void handleSubmitAsync(value))}> - + From e99fd648822f61b4ad7b3793875df69348a3e0c8 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Wed, 16 Oct 2024 21:44:28 +0200 Subject: [PATCH 26/43] feat: add notes for creation of apps and integrations in widget edit modal (#1297) * feat: add notes for creation of apps and integrations in widget edit modal * fix: unit test failing when with-description flag missing --- packages/translation/src/lang/en.ts | 9 ++++++ .../widgets/src/_inputs/widget-app-input.tsx | 25 ++++++++++++---- packages/widgets/src/options.ts | 4 +-- .../widgets/src/widget-integration-select.tsx | 30 +++++++++++++++++-- 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index 24a149631..8aecc2fb2 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -576,6 +576,7 @@ export default { tryAgain: "Try again", loading: "Loading", }, + here: "here", iconPicker: { label: "Icon URL", header: "Type name or objects to filter for icons... Homarr will search through {countIcons} icons for you.", @@ -1157,6 +1158,14 @@ export default { }, }, }, + integration: { + noData: "No integration found", + description: "Click {here} to create a new integration", + }, + app: { + noData: "No app found", + description: "Click {here} to create a new app", + }, error: { action: { logs: "Check logs for more details", diff --git a/packages/widgets/src/_inputs/widget-app-input.tsx b/packages/widgets/src/_inputs/widget-app-input.tsx index 04a85d468..ee22b08da 100644 --- a/packages/widgets/src/_inputs/widget-app-input.tsx +++ b/packages/widgets/src/_inputs/widget-app-input.tsx @@ -1,19 +1,22 @@ "use client"; import { memo, useMemo } from "react"; +import Link from "next/link"; import type { SelectProps } from "@mantine/core"; -import { Group, Loader, Select } from "@mantine/core"; +import { Anchor, Group, Loader, Select, Text } from "@mantine/core"; import { IconCheck } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { useI18n } from "@homarr/translation/client"; import type { CommonWidgetInputProps } from "./common"; import { useWidgetInputTranslation } from "./common"; import { useFormContext } from "./form"; -export const WidgetAppInput = ({ property, kind, options }: CommonWidgetInputProps<"app">) => { - const t = useWidgetInputTranslation(kind, property); +export const WidgetAppInput = ({ property, kind }: CommonWidgetInputProps<"app">) => { + const t = useI18n(); + const tInput = useWidgetInputTranslation(kind, property); const form = useFormContext(); const { data: apps, isPending } = clientApi.app.selectable.useQuery(); @@ -24,10 +27,11 @@ export const WidgetAppInput = ({ property, kind, options }: CommonWidgetInputPro return (