From 65c6854e4426350b196b1888c952d961c03c2b23 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Sun, 4 Aug 2024 18:47:00 +0300 Subject: [PATCH 01/42] feat: dnshole controls widget (#867) * feat: dnshole controls widget * feat: add duration and timer modal * fix: code improvment * fix: add support for many integrations * fix: add support for more integrations * fix: move ControlsCard outside of main component * fix: deepsource --- packages/api/src/router/widgets/dns-hole.ts | 98 ++++++++-- packages/definitions/src/widget.ts | 1 + .../dns-hole-summary-types.ts | 1 + .../src/pi-hole/pi-hole-integration.ts | 22 +++ .../integrations/src/pi-hole/pi-hole-types.ts | 4 + packages/translation/src/lang/en.ts | 39 +++- .../src/dns-hole/controls/TimerModal.tsx | 105 ++++++++++ .../src/dns-hole/controls/component.tsx | 179 ++++++++++++++++++ .../widgets/src/dns-hole/controls/index.ts | 29 +++ .../src/dns-hole/controls/serverData.ts | 27 +++ .../src/dns-hole/summary/component.tsx | 4 +- .../widgets/src/dns-hole/summary/index.ts | 2 +- .../src/dns-hole/summary/serverData.ts | 13 +- packages/widgets/src/index.tsx | 6 +- 14 files changed, 501 insertions(+), 29 deletions(-) create mode 100644 packages/widgets/src/dns-hole/controls/TimerModal.tsx create mode 100644 packages/widgets/src/dns-hole/controls/component.tsx create mode 100644 packages/widgets/src/dns-hole/controls/index.ts create mode 100644 packages/widgets/src/dns-hole/controls/serverData.ts diff --git a/packages/api/src/router/widgets/dns-hole.ts b/packages/api/src/router/widgets/dns-hole.ts index 51207d148..ea6ebc375 100644 --- a/packages/api/src/router/widgets/dns-hole.ts +++ b/packages/api/src/router/widgets/dns-hole.ts @@ -5,28 +5,90 @@ import type { DnsHoleSummary } from "@homarr/integrations/types"; import { logger } from "@homarr/log"; import { createCacheChannel } from "@homarr/redis"; -import { createOneIntegrationMiddleware } from "../../middlewares/integration"; +import { controlsInputSchema } from "../../../../integrations/src/pi-hole/pi-hole-types"; +import { createManyIntegrationMiddleware, createOneIntegrationMiddleware } from "../../middlewares/integration"; import { createTRPCRouter, publicProcedure } from "../../trpc"; export const dnsHoleRouter = createTRPCRouter({ - summary: publicProcedure.unstable_concat(createOneIntegrationMiddleware("query", "piHole")).query(async ({ ctx }) => { - const cache = createCacheChannel(`dns-hole-summary:${ctx.integration.id}`); + summary: publicProcedure + .unstable_concat(createManyIntegrationMiddleware("query", "piHole", "adGuardHome")) + .query(async ({ ctx }) => { + const results = await Promise.all( + ctx.integrations.map(async (integration) => { + const cache = createCacheChannel(`dns-hole-summary:${integration.id}`); + const { data } = await cache.consumeAsync(async () => { + let client; + switch (integration.kind) { + case "piHole": + client = new PiHoleIntegration(integration); + break; + // case 'adGuardHome': + // client = new AdGuardHomeIntegration(integration); + // break; + default: + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Unsupported integration type: ${integration.kind}`, + }); + } - const { data } = await cache.consumeAsync(async () => { - const client = new PiHoleIntegration(ctx.integration); + return await client.getSummaryAsync().catch((err) => { + logger.error("dns-hole router - ", err); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Failed to fetch DNS Hole summary for ${integration.name} (${integration.id})`, + }); + }); + }); - return await client.getSummaryAsync().catch((err) => { - logger.error("dns-hole router - ", err); - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: `Failed to fetch DNS Hole summary for ${ctx.integration.name} (${ctx.integration.id})`, - }); - }); - }); + return { + integrationId: integration.id, + integrationKind: integration.kind, + summary: data, + }; + }), + ); + return results; + }), - return { - ...data, - integrationId: ctx.integration.id, - }; - }), + enable: publicProcedure + .unstable_concat(createOneIntegrationMiddleware("interact", "piHole", "adGuardHome")) + .mutation(async ({ ctx }) => { + let client; + switch (ctx.integration.kind) { + case "piHole": + client = new PiHoleIntegration(ctx.integration); + break; + // case 'adGuardHome': + // client = new AdGuardHomeIntegration(ctx.integration); + // break; + default: + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Unsupported integration type: ${ctx.integration.kind}`, + }); + } + await client.enableAsync(); + }), + + disable: publicProcedure + .input(controlsInputSchema) + .unstable_concat(createOneIntegrationMiddleware("interact", "piHole", "adGuardHome")) + .mutation(async ({ ctx, input }) => { + let client; + switch (ctx.integration.kind) { + case "piHole": + client = new PiHoleIntegration(ctx.integration); + break; + // case 'adGuardHome': + // client = new AdGuardHomeIntegration(ctx.integration); + // break; + default: + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: `Unsupported integration type: ${ctx.integration.kind}`, + }); + } + await client.disableAsync(input.duration); + }), }); diff --git a/packages/definitions/src/widget.ts b/packages/definitions/src/widget.ts index 9b50fa9dc..7682d5ab1 100644 --- a/packages/definitions/src/widget.ts +++ b/packages/definitions/src/widget.ts @@ -6,6 +6,7 @@ export const widgetKinds = [ "video", "notebook", "dnsHoleSummary", + "dnsHoleControls", "smartHome-entityState", "smartHome-executeAutomation", "mediaServer", diff --git a/packages/integrations/src/interfaces/dns-hole-summary/dns-hole-summary-types.ts b/packages/integrations/src/interfaces/dns-hole-summary/dns-hole-summary-types.ts index 2295f9079..749360175 100644 --- a/packages/integrations/src/interfaces/dns-hole-summary/dns-hole-summary-types.ts +++ b/packages/integrations/src/interfaces/dns-hole-summary/dns-hole-summary-types.ts @@ -1,4 +1,5 @@ export interface DnsHoleSummary { + status: "enabled" | "disabled"; domainsBeingBlocked: number; adsBlockedToday: number; adsBlockedTodayPercentage: number; diff --git a/packages/integrations/src/pi-hole/pi-hole-integration.ts b/packages/integrations/src/pi-hole/pi-hole-integration.ts index a89af7c9a..b1f25aa6b 100644 --- a/packages/integrations/src/pi-hole/pi-hole-integration.ts +++ b/packages/integrations/src/pi-hole/pi-hole-integration.ts @@ -23,6 +23,7 @@ export class PiHoleIntegration extends Integration implements DnsHoleSummaryInte } return { + status: result.data.status, adsBlockedToday: result.data.ads_blocked_today, adsBlockedTodayPercentage: result.data.ads_percentage_today, domainsBeingBlocked: result.data.domains_being_blocked, @@ -49,4 +50,25 @@ export class PiHoleIntegration extends Integration implements DnsHoleSummaryInte }, }); } + + public async enableAsync(): Promise { + const apiKey = super.getSecretValue("apiKey"); + const response = await fetch(`${this.integration.url}/admin/api.php?enable&auth=${apiKey}`); + if (!response.ok) { + throw new Error( + `Failed to enable PiHole for ${this.integration.name} (${this.integration.id}): ${response.statusText}`, + ); + } + } + + public async disableAsync(duration?: number): Promise { + const apiKey = super.getSecretValue("apiKey"); + const url = `${this.integration.url}/admin/api.php?disable${duration ? `=${duration}` : ""}&auth=${apiKey}`; + const response = await fetch(url); + if (!response.ok) { + throw new Error( + `Failed to disable PiHole for ${this.integration.name} (${this.integration.id}): ${response.statusText}`, + ); + } + } } diff --git a/packages/integrations/src/pi-hole/pi-hole-types.ts b/packages/integrations/src/pi-hole/pi-hole-types.ts index 6b2a28a95..234eb511c 100644 --- a/packages/integrations/src/pi-hole/pi-hole-types.ts +++ b/packages/integrations/src/pi-hole/pi-hole-types.ts @@ -7,3 +7,7 @@ export const summaryResponseSchema = z.object({ dns_queries_today: z.number(), ads_percentage_today: z.number(), }); + +export const controlsInputSchema = z.object({ + duration: z.number().optional(), +}); diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index 9b8cb53ab..836674744 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -558,7 +558,7 @@ export default { }, multiText: { placeholder: "Add more values", - addLabel: `Add {value}`, + addLabel: "Add {value}", }, select: { placeholder: "Pick value", @@ -763,6 +763,43 @@ export default { domainsBeingBlocked: "Domains on blocklist", }, }, + dnsHoleControls: { + name: "DNS Hole Controls", + description: "Control PiHole or AdGuard from your dashboard", + option: { + layout: { + label: "Layout", + option: { + row: { + label: "Horizontal", + }, + column: { + label: "Vertical", + }, + grid: { + label: "Grid", + }, + }, + }, + showToggleAllButtons: { + label: "Show Toggle All Buttons", + }, + }, + error: { + internalServerError: "Failed to control DNS Hole", + }, + controls: { + enableAll: "Enable All", + disableAll: "Disable All", + setTimer: "Set Timer", + set: "Set", + enabled: "Enabled", + disabled: "Disabled", + hours: "Hours", + minutes: "Minutes", + unlimited: "Leave blank to unlimited", + }, + }, clock: { name: "Date and time", description: "Displays the current date and time.", diff --git a/packages/widgets/src/dns-hole/controls/TimerModal.tsx b/packages/widgets/src/dns-hole/controls/TimerModal.tsx new file mode 100644 index 000000000..71cb09c10 --- /dev/null +++ b/packages/widgets/src/dns-hole/controls/TimerModal.tsx @@ -0,0 +1,105 @@ +import { useRef, useState } from "react"; +import type { NumberInputHandlers } from "@mantine/core"; +import { ActionIcon, Button, Flex, Group, Modal, NumberInput, rem, Stack, Text } from "@mantine/core"; +import { IconClockPause } from "@tabler/icons-react"; + +import { useI18n } from "@homarr/translation/client"; + +interface TimerModalProps { + opened: boolean; + close: () => void; + integrationIds: string[]; + disableDns: (data: { duration: number; integrationId: string }) => void; +} + +const TimerModal = ({ opened, close, integrationIds, disableDns }: TimerModalProps) => { + const t = useI18n(); + const [hours, setHours] = useState(0); + const [minutes, setMinutes] = useState(0); + const hoursHandlers = useRef(); + const minutesHandlers = useRef(); + + const handleSetTimer = () => { + const duration = hours * 3600 + minutes * 60; + integrationIds.forEach((integrationId) => { + disableDns({ duration, integrationId }); + }); + setHours(0); + setMinutes(0); + close(); + }; + + return ( + { + close(); + setHours(0); + setMinutes(0); + }} + title={t("widget.dnsHoleControls.controls.setTimer")} + > + + + + {t("widget.dnsHoleControls.controls.hours")} + hoursHandlers.current?.decrement()}> + – + + setHours(Number(val))} + handlersRef={hoursHandlers} + max={999} + min={0} + step={1} + styles={{ input: { width: rem(54), textAlign: "center" } }} + /> + hoursHandlers.current?.increment()}> + + + + + + {t("widget.dnsHoleControls.controls.minutes")} + minutesHandlers.current?.decrement()}> + – + + setMinutes(Number(val))} + handlersRef={minutesHandlers} + max={59} + min={0} + step={1} + styles={{ input: { width: rem(54), textAlign: "center" } }} + /> + minutesHandlers.current?.increment()}> + + + + + + + {t("widget.dnsHoleControls.controls.unlimited")} + + + + + ); +}; + +export default TimerModal; diff --git a/packages/widgets/src/dns-hole/controls/component.tsx b/packages/widgets/src/dns-hole/controls/component.tsx new file mode 100644 index 000000000..05a56b4a4 --- /dev/null +++ b/packages/widgets/src/dns-hole/controls/component.tsx @@ -0,0 +1,179 @@ +"use client"; + +import { useEffect, useState } from "react"; +import type { BoxProps } from "@mantine/core"; +import { ActionIcon, Badge, Box, Button, Card, Flex, Image, Tooltip, UnstyledButton } from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { IconClockPause, IconPlayerPlay, IconPlayerStop } from "@tabler/icons-react"; + +import { clientApi } from "@homarr/api/client"; +import { integrationDefs } from "@homarr/definitions"; +import { useI18n } from "@homarr/translation/client"; + +import type { WidgetComponentProps, WidgetProps } from "../../definition"; +import { NoIntegrationSelectedError } from "../../errors"; +import TimerModal from "./TimerModal"; + +const dnsLightStatus = (enabled: boolean): "green" | "red" => (enabled ? "green" : "red"); + +export default function DnsHoleControlsWidget({ options, integrationIds }: WidgetComponentProps<"dnsHoleControls">) { + if (integrationIds.length === 0) { + throw new NoIntegrationSelectedError(); + } + const t = useI18n(); + const [status, setStatus] = useState<{ integrationId: string; enabled: boolean }[]>( + integrationIds.map((id) => ({ integrationId: id, enabled: false })), + ); + const [opened, { close, open }] = useDisclosure(false); + + const [data] = clientApi.widget.dnsHole.summary.useSuspenseQuery( + { + integrationIds, + }, + { + refetchOnMount: false, + retry: false, + }, + ); + + useEffect(() => { + const newStatus = data.map((integrationData) => ({ + integrationId: integrationData.integrationId, + enabled: integrationData.summary.status === "enabled", + })); + setStatus(newStatus); + }, [data]); + + const { mutate: enableDns } = clientApi.widget.dnsHole.enable.useMutation({ + onSuccess: (_, variables) => { + setStatus((prevStatus) => + prevStatus.map((item) => (item.integrationId === variables.integrationId ? { ...item, enabled: true } : item)), + ); + }, + }); + const { mutate: disableDns } = clientApi.widget.dnsHole.disable.useMutation({ + onSuccess: (_, variables) => { + setStatus((prevStatus) => + prevStatus.map((item) => (item.integrationId === variables.integrationId ? { ...item, enabled: false } : item)), + ); + }, + }); + const toggleDns = (integrationId: string) => { + const integrationStatus = status.find((item) => item.integrationId === integrationId); + if (integrationStatus?.enabled) { + disableDns({ integrationId, duration: 0 }); + } else { + enableDns({ integrationId }); + } + }; + + const allEnabled = status.every((item) => item.enabled); + const allDisabled = status.every((item) => !item.enabled); + + return ( + + {options.showToggleAllButtons && ( + + + + + + + + + + + + + + )} + + {data.map((integrationData) => + ControlsCard(integrationData.integrationId, integrationData.integrationKind, toggleDns, status, open, t), + )} + + + + ); +} + +const ControlsCard = ( + integrationId: string, + integrationKind: string, + toggleDns: (integrationId: string) => void, + status: { integrationId: string; enabled: boolean }[], + open: () => void, + t: ReturnType, +) => { + const integrationStatus = status.find((item) => item.integrationId === integrationId); + const isEnabled = integrationStatus?.enabled ?? false; + const integrationDef = integrationKind === "piHole" ? integrationDefs.piHole : integrationDefs.adGuardHome; + + return ( + + + + + + + {integrationDef.name} + + toggleDns(integrationId)}> + + {isEnabled + ? t("widget.dnsHoleControls.controls.enabled") + : t("widget.dnsHoleControls.controls.disabled")} + + + + + + + + + + ); +}; + +const boxPropsByLayout = (layout: WidgetProps<"dnsHoleControls">["options"]["layout"]): BoxProps => { + if (layout === "grid") { + return { + display: "grid", + style: { + gridTemplateColumns: "1fr 1fr", + gridTemplateRows: "1fr 1fr", + }, + }; + } + + return { + display: "flex", + style: { + flexDirection: layout, + }, + }; +}; diff --git a/packages/widgets/src/dns-hole/controls/index.ts b/packages/widgets/src/dns-hole/controls/index.ts new file mode 100644 index 000000000..785bf5ce4 --- /dev/null +++ b/packages/widgets/src/dns-hole/controls/index.ts @@ -0,0 +1,29 @@ +import { IconDeviceGamepad, IconServerOff } from "@tabler/icons-react"; + +import { createWidgetDefinition } from "../../definition"; +import { optionsBuilder } from "../../options"; + +export const { definition, componentLoader, serverDataLoader } = createWidgetDefinition("dnsHoleControls", { + icon: IconDeviceGamepad, + options: optionsBuilder.from((factory) => ({ + showToggleAllButtons: factory.switch({ + defaultValue: true, + }), + layout: factory.select({ + options: (["grid", "row", "column"] as const).map((value) => ({ + value, + label: (t) => t(`widget.dnsHoleControls.option.layout.option.${value}.label`), + })), + defaultValue: "grid", + }), + })), + supportedIntegrations: ["piHole", "adGuardHome"], + errors: { + INTERNAL_SERVER_ERROR: { + icon: IconServerOff, + message: (t) => t("widget.dnsHoleControls.error.internalServerError"), + }, + }, +}) + .withServerData(() => import("./serverData")) + .withDynamicImport(() => import("./component")); diff --git a/packages/widgets/src/dns-hole/controls/serverData.ts b/packages/widgets/src/dns-hole/controls/serverData.ts new file mode 100644 index 000000000..e70a0ae7a --- /dev/null +++ b/packages/widgets/src/dns-hole/controls/serverData.ts @@ -0,0 +1,27 @@ +"use server"; + +import { api } from "@homarr/api/server"; + +import type { WidgetProps } from "../../definition"; + +export default async function getServerDataAsync({ integrationIds }: WidgetProps<"dnsHoleSummary">) { + if (integrationIds.length === 0) { + return { + initialData: [], + }; + } + + try { + const currentDns = await api.widget.dnsHole.summary({ + integrationIds, + }); + + return { + initialData: currentDns, + }; + } catch (error) { + return { + initialData: undefined, + }; + } +} diff --git a/packages/widgets/src/dns-hole/summary/component.tsx b/packages/widgets/src/dns-hole/summary/component.tsx index 8eb1a8a02..457ee9072 100644 --- a/packages/widgets/src/dns-hole/summary/component.tsx +++ b/packages/widgets/src/dns-hole/summary/component.tsx @@ -25,7 +25,7 @@ export default function DnsHoleSummaryWidget({ options, integrationIds }: Widget const [data] = clientApi.widget.dnsHole.summary.useSuspenseQuery( { - integrationId, + integrationIds, }, { refetchOnMount: false, @@ -36,7 +36,7 @@ export default function DnsHoleSummaryWidget({ options, integrationIds }: Widget return ( {stats.map((item, index) => ( - + ))} ); diff --git a/packages/widgets/src/dns-hole/summary/index.ts b/packages/widgets/src/dns-hole/summary/index.ts index fc8610aba..9267f8462 100644 --- a/packages/widgets/src/dns-hole/summary/index.ts +++ b/packages/widgets/src/dns-hole/summary/index.ts @@ -17,7 +17,7 @@ export const { definition, componentLoader, serverDataLoader } = createWidgetDef defaultValue: "grid", }), })), - supportedIntegrations: ["piHole"], + supportedIntegrations: ["piHole", "adGuardHome"], errors: { INTERNAL_SERVER_ERROR: { icon: IconServerOff, diff --git a/packages/widgets/src/dns-hole/summary/serverData.ts b/packages/widgets/src/dns-hole/summary/serverData.ts index 74cea93a4..5f7ce758e 100644 --- a/packages/widgets/src/dns-hole/summary/serverData.ts +++ b/packages/widgets/src/dns-hole/summary/serverData.ts @@ -5,16 +5,19 @@ import { api } from "@homarr/api/server"; import type { WidgetProps } from "../../definition"; export default async function getServerDataAsync({ integrationIds }: WidgetProps<"dnsHoleSummary">) { - const integrationId = integrationIds.at(0); - if (!integrationId) return { initialData: undefined }; + if (integrationIds.length === 0) { + return { + initialData: [], + }; + } try { - const data = await api.widget.dnsHole.summary({ - integrationId, + const currentDns = await api.widget.dnsHole.summary({ + integrationIds, }); return { - initialData: data, + initialData: currentDns, }; } catch { return { diff --git a/packages/widgets/src/index.tsx b/packages/widgets/src/index.tsx index 862fc3d20..cbc229559 100644 --- a/packages/widgets/src/index.tsx +++ b/packages/widgets/src/index.tsx @@ -9,6 +9,7 @@ import * as app from "./app"; import * as calendar from "./calendar"; import * as clock from "./clock"; import type { WidgetComponentProps } from "./definition"; +import * as dnsHoleControls from "./dns-hole/controls"; import * as dnsHoleSummary from "./dns-hole/summary"; import * as iframe from "./iframe"; import type { WidgetImportRecord } from "./import"; @@ -22,9 +23,11 @@ import * as weather from "./weather"; 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 = { clock, @@ -34,6 +37,7 @@ export const widgetImports = { iframe, video, dnsHoleSummary, + dnsHoleControls, "smartHome-entityState": smartHomeEntityState, "smartHome-executeAutomation": smartHomeExecuteAutomation, mediaServer, @@ -43,8 +47,6 @@ export const widgetImports = { export type WidgetImports = typeof widgetImports; export type WidgetImportKey = keyof WidgetImports; -export type { WidgetComponentProps }; -export type { WidgetDefinition } from "./definition"; const loadedComponents = new Map>>(); From 0cec1dbb1743bbe2af03a006c24d3588d5a55d83 Mon Sep 17 00:00:00 2001 From: SeDemal Date: Sun, 4 Aug 2024 20:46:27 +0200 Subject: [PATCH 02/42] fix: Fix typecheck, lint issues and errors brought to dnshole summary. (#916) --- .../src/dns-hole/controls/component.tsx | 51 ++++++------------- .../widgets/src/dns-hole/controls/index.ts | 7 --- .../src/dns-hole/controls/serverData.ts | 6 +-- .../src/dns-hole/summary/component.tsx | 49 +++++++++++------- .../src/dns-hole/summary/serverData.ts | 2 +- 5 files changed, 50 insertions(+), 65 deletions(-) diff --git a/packages/widgets/src/dns-hole/controls/component.tsx b/packages/widgets/src/dns-hole/controls/component.tsx index 05a56b4a4..de89e89ce 100644 --- a/packages/widgets/src/dns-hole/controls/component.tsx +++ b/packages/widgets/src/dns-hole/controls/component.tsx @@ -1,16 +1,16 @@ "use client"; import { useEffect, useState } from "react"; -import type { BoxProps } from "@mantine/core"; -import { ActionIcon, Badge, Box, Button, Card, Flex, Image, Tooltip, UnstyledButton } from "@mantine/core"; +import { ActionIcon, Badge, Box, Button, Card, Flex, Image, Stack, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { useDisclosure } from "@mantine/hooks"; import { IconClockPause, IconPlayerPlay, IconPlayerStop } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { integrationDefs } from "@homarr/definitions"; +import type { TranslationFunction } from "@homarr/translation"; import { useI18n } from "@homarr/translation/client"; -import type { WidgetComponentProps, WidgetProps } from "../../definition"; +import type { WidgetComponentProps } from "../../definition"; import { NoIntegrationSelectedError } from "../../errors"; import TimerModal from "./TimerModal"; @@ -71,9 +71,9 @@ export default function DnsHoleControlsWidget({ options, integrationIds }: Widge const allDisabled = status.every((item) => !item.enabled); return ( - + {options.showToggleAllButtons && ( - + + ); + }, renderToolbarAlertBannerContent: ({ groupedAlert, table }) => { return ( diff --git a/packages/api/src/router/docker/docker-router.ts b/packages/api/src/router/docker/docker-router.ts index 876ab683d..127573173 100644 --- a/packages/api/src/router/docker/docker-router.ts +++ b/packages/api/src/router/docker/docker-router.ts @@ -59,6 +59,10 @@ export const dockerRouter = createTRPCRouter({ timestamp, }; }), + invalidate: permissionRequiredProcedure.requiresPermission("admin").mutation(async () => { + await dockerCache.invalidateAsync(); + return; + }), startAll: permissionRequiredProcedure .requiresPermission("admin") .input(z.object({ ids: z.array(z.string()) })) diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index 836674744..00aa2f60d 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -1656,6 +1656,19 @@ export default { }, }, }, + refresh: { + label: "Refresh", + notification: { + success: { + title: "Containers refreshed", + message: "You are now viewing the most recent data", + }, + error: { + title: "Containers not refreshed", + message: "Something went wrong while refreshing the containers", + }, + }, + }, }, }, permission: { From ca1ecdf84811c58e4dff372fab42e64ab1791f06 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sun, 4 Aug 2024 21:20:21 +0200 Subject: [PATCH 05/42] feat: add preview to icon picker (#914) --- apps/nextjs/src/components/icons/picker/icon-picker.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/nextjs/src/components/icons/picker/icon-picker.tsx b/apps/nextjs/src/components/icons/picker/icon-picker.tsx index ae11cd00a..51143cd01 100644 --- a/apps/nextjs/src/components/icons/picker/icon-picker.tsx +++ b/apps/nextjs/src/components/icons/picker/icon-picker.tsx @@ -16,6 +16,7 @@ interface IconPickerProps { export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: IconPickerProps) => { const [value, setValue] = useState(initialValue ?? ""); const [search, setSearch] = useState(initialValue ?? ""); + const [previewUrl, setPreviewUrl] = useState(initialValue ?? null); const t = useScopedI18n("common"); @@ -52,6 +53,7 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I { setValue(value); + setPreviewUrl(value); setSearch(value); onChange(value); combobox.closeDropdown(); @@ -62,12 +64,15 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I } + // eslint-disable-next-line @next/next/no-img-element + leftSection={previewUrl ? : null} value={search} onChange={(event) => { combobox.openDropdown(); combobox.updateSelectedOptionIndex(); setSearch(event.currentTarget.value); setValue(event.currentTarget.value); + setPreviewUrl(null); onChange(event.currentTarget.value); }} onClick={() => combobox.openDropdown()} @@ -78,6 +83,7 @@ export const IconPicker = ({ initialValue, onChange, error, onFocus, onBlur }: I onBlur={(event) => { onBlur?.(event); combobox.closeDropdown(); + setPreviewUrl(value); setSearch(value || ""); }} rightSectionPointerEvents="none" From 7fa5e70d5b5e4e6cded08f343f5db0f42e8be324 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Sun, 4 Aug 2024 21:44:51 +0200 Subject: [PATCH 06/42] feat: reset password cli (#903) * feat: add password reset cli * feat: add homarr cli to docker image --- Dockerfile | 18 +++++++- package.json | 2 + .../router/test/docker/docker-router.spec.ts | 1 + packages/auth/session.ts | 4 +- packages/auth/test/session.spec.ts | 7 ++- packages/cli/eslint.config.js | 9 ++++ packages/cli/index.ts | 1 + packages/cli/package.json | 39 ++++++++++++++++ packages/cli/src/commands/reset-password.ts | 46 +++++++++++++++++++ packages/cli/src/index.ts | 10 ++++ packages/cli/tsconfig.json | 8 ++++ packages/common/package.json | 1 + packages/common/src/security.ts | 10 ++++ packages/common/src/server.ts | 1 + pnpm-lock.yaml | 39 ++++++++++++++++ turbo/generators/templates/package.json.hbs | 4 +- 16 files changed, 193 insertions(+), 7 deletions(-) create mode 100644 packages/cli/eslint.config.js create mode 100644 packages/cli/index.ts create mode 100644 packages/cli/package.json create mode 100644 packages/cli/src/commands/reset-password.ts create mode 100644 packages/cli/src/index.ts create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/common/src/security.ts create mode 100644 packages/common/src/server.ts diff --git a/Dockerfile b/Dockerfile index 845d978c0..4cb3283da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ RUN turbo prune @homarr/nextjs --docker --out-dir ./next-out RUN turbo prune @homarr/tasks --docker --out-dir ./tasks-out RUN turbo prune @homarr/websocket --docker --out-dir ./websocket-out RUN turbo prune @homarr/db --docker --out-dir ./migration-out +RUN turbo prune @homarr/cli --docker --out-dir ./cli-out # Add lockfile and package.json's of isolated subworkspace FROM base AS installer @@ -34,6 +35,10 @@ COPY --from=builder /app/migration-out/json/ . COPY --from=builder /app/migration-out/pnpm-lock.yaml ./pnpm-lock.yaml RUN corepack enable pnpm && pnpm install +COPY --from=builder /app/cli-out/json/ . +COPY --from=builder /app/cli-out/pnpm-lock.yaml ./pnpm-lock.yaml +RUN corepack enable pnpm && pnpm install + COPY --from=builder /app/next-out/json/ . COPY --from=builder /app/next-out/pnpm-lock.yaml ./pnpm-lock.yaml RUN corepack enable pnpm && pnpm install @@ -45,6 +50,7 @@ COPY --from=builder /app/tasks-out/full/ . COPY --from=builder /app/websocket-out/full/ . COPY --from=builder /app/next-out/full/ . COPY --from=builder /app/migration-out/full/ . +COPY --from=builder /app/cli-out/full/ . # Copy static data as it is not part of the build COPY static-data ./static-data @@ -55,15 +61,23 @@ RUN corepack enable pnpm && pnpm build FROM base AS runner WORKDIR /app -RUN apk add --no-cache redis +RUN apk add --no-cache redis bash RUN mkdir /appdata RUN mkdir /appdata/db RUN mkdir /appdata/redis VOLUME /appdata -# Don't run production as root + + RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs + +# Enable homarr cli +COPY --from=installer --chown=nextjs:nodejs /app/packages/cli/cli.cjs /app/apps/cli/cli.cjs +RUN echo $'#!/bin/bash\ncd /app/apps/cli && node ./cli.cjs "$@"' > /usr/bin/homarr +RUN chmod +x /usr/bin/homarr + +# Don't run production as root RUN chown -R nextjs:nodejs /appdata USER nextjs diff --git a/package.json b/package.json index 5e001f92d..a966aafae 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "db:migration:mysql:generate": "pnpm -F db migration:mysql:generate", "db:migration:sqlite:run": "pnpm -F db migration:sqlite:run", "db:migration:mysql:run": "pnpm -F db migration:mysql:run", + "cli": "pnpm with-env tsx packages/cli/index.ts", + "with-env": "dotenv -e .env --", "dev": "turbo dev --parallel", "docker:dev": "docker compose -f ./development/development.docker-compose.yml up", "format": "turbo format --continue -- --cache --cache-location node_modules/.cache/.prettiercache", diff --git a/packages/api/src/router/test/docker/docker-router.spec.ts b/packages/api/src/router/test/docker/docker-router.spec.ts index a166b46a2..c92a0bbfc 100644 --- a/packages/api/src/router/test/docker/docker-router.spec.ts +++ b/packages/api/src/router/test/docker/docker-router.spec.ts @@ -43,6 +43,7 @@ const validInputs: { stopAll: { ids: ["1"] }, restartAll: { ids: ["1"] }, removeAll: { ids: ["1"] }, + invalidate: undefined, }; describe("All procedures should only be accessible for users with admin permission", () => { diff --git a/packages/auth/session.ts b/packages/auth/session.ts index 02ef573df..249c3b1e1 100644 --- a/packages/auth/session.ts +++ b/packages/auth/session.ts @@ -1,6 +1,6 @@ -import { randomUUID } from "crypto"; import type { Session } from "next-auth"; +import { generateSecureRandomToken } from "@homarr/common/server"; import type { Database } from "@homarr/db"; import { getCurrentUserPermissionsAsync } from "./callbacks"; @@ -13,7 +13,7 @@ export const expireDateAfter = (seconds: number) => { }; export const generateSessionToken = () => { - return randomUUID(); + return generateSecureRandomToken(48); }; export const getSessionFromTokenAsync = async (db: Database, token: string | undefined): Promise => { diff --git a/packages/auth/test/session.spec.ts b/packages/auth/test/session.spec.ts index 27adfef2a..4f90f44a0 100644 --- a/packages/auth/test/session.spec.ts +++ b/packages/auth/test/session.spec.ts @@ -30,7 +30,12 @@ describe("expireDateAfter should calculate date after specified seconds", () => describe("generateSessionToken should return a random UUID", () => { it("should return a random UUID", () => { const result = generateSessionToken(); - expect(z.string().uuid().safeParse(result).success).toBe(true); + expect( + z + .string() + .regex(/^[a-f0-9]+$/) + .safeParse(result).success, + ).toBe(true); }); it("should return a different token each time", () => { const result1 = generateSessionToken(); diff --git a/packages/cli/eslint.config.js b/packages/cli/eslint.config.js new file mode 100644 index 000000000..5b19b6f8a --- /dev/null +++ b/packages/cli/eslint.config.js @@ -0,0 +1,9 @@ +import baseConfig from "@homarr/eslint-config/base"; + +/** @type {import('typescript-eslint').Config} */ +export default [ + { + ignores: [], + }, + ...baseConfig, +]; diff --git a/packages/cli/index.ts b/packages/cli/index.ts new file mode 100644 index 000000000..3bd16e178 --- /dev/null +++ b/packages/cli/index.ts @@ -0,0 +1 @@ +export * from "./src"; diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 000000000..62706c30a --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,39 @@ +{ + "name": "@homarr/cli", + "private": true, + "version": "0.1.0", + "type": "module", + "exports": { + ".": "./index.ts" + }, + "typesVersions": { + "*": { + "*": [ + "src/*" + ] + } + }, + "license": "MIT", + "scripts": { + "clean": "rm -rf .turbo node_modules", + "lint": "eslint", + "build": "esbuild src/index.ts --bundle --platform=node --outfile=cli.cjs --external:bcrypt --external:cpu-features --loader:.html=text --loader:.node=text", + "format": "prettier --check . --ignore-path ../../.gitignore", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@drizzle-team/brocli": "^0.9.2", + "@homarr/db": "workspace:^0.1.0", + "@homarr/common": "workspace:^0.1.0", + "@homarr/auth": "workspace:^0.1.0", + "dotenv": "^16.4.5" + }, + "devDependencies": { + "@homarr/eslint-config": "workspace:^0.2.0", + "@homarr/prettier-config": "workspace:^0.1.0", + "@homarr/tsconfig": "workspace:^0.1.0", + "eslint": "^9.8.0", + "typescript": "^5.5.4" + }, + "prettier": "@homarr/prettier-config" +} diff --git a/packages/cli/src/commands/reset-password.ts b/packages/cli/src/commands/reset-password.ts new file mode 100644 index 000000000..a2a31cac0 --- /dev/null +++ b/packages/cli/src/commands/reset-password.ts @@ -0,0 +1,46 @@ +import { command, string } from "@drizzle-team/brocli"; + +import { hashPasswordAsync } from "@homarr/auth"; +import { generateSecureRandomToken } from "@homarr/common/server"; +import { and, db, eq } from "@homarr/db"; +import { sessions, users } from "@homarr/db/schema/sqlite"; + +export const resetPassword = command({ + name: "reset-password", + desc: "Reset password for a user", + options: { + username: string("username").required().alias("u").desc("Name of the user"), + }, + // eslint-disable-next-line no-restricted-syntax + handler: async (options) => { + if (!process.env.AUTH_PROVIDERS?.toLowerCase().includes("credentials")) { + console.error("Credentials provider is not enabled"); + return; + } + + const user = await db.query.users.findFirst({ + where: and(eq(users.name, options.username), eq(users.provider, "credentials")), + }); + + if (!user?.salt) { + console.error(`User ${options.username} not found`); + return; + } + + // Generates a new password with 48 characters + const newPassword = generateSecureRandomToken(24); + + await db + .update(users) + .set({ + password: await hashPasswordAsync(newPassword, user.salt), + }) + .where(eq(users.id, user.id)); + + await db.delete(sessions).where(eq(sessions.userId, user.id)); + console.log(`All sessions for user ${options.username} have been deleted`); + + console.log("You can now login with the new password"); + console.log(`New password for user ${options.username}: ${newPassword}`); + }, +}); diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 000000000..cdda88527 --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,10 @@ +import { run } from "@drizzle-team/brocli"; + +import { resetPassword } from "./commands/reset-password"; + +const commands = [resetPassword]; + +void run(commands, { + cliName: "homarr-cli", + version: "1.0.0", +}); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 000000000..cbe8483d9 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@homarr/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["*.ts", "src"], + "exclude": ["node_modules"] +} diff --git a/packages/common/package.json b/packages/common/package.json index 04e20d694..100d1bea9 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -5,6 +5,7 @@ "type": "module", "exports": { ".": "./index.ts", + "./server": "./src/server.ts", "./types": "./src/types.ts" }, "typesVersions": { diff --git a/packages/common/src/security.ts b/packages/common/src/security.ts new file mode 100644 index 000000000..b3a0ee758 --- /dev/null +++ b/packages/common/src/security.ts @@ -0,0 +1,10 @@ +import { randomBytes } from "crypto"; + +/** + * Generates a random hex token twice the size of the given size + * @param size amount of bytes to generate + * @returns a random hex token twice the length of the given size + */ +export const generateSecureRandomToken = (size: number) => { + return randomBytes(size).toString("hex"); +}; diff --git a/packages/common/src/server.ts b/packages/common/src/server.ts new file mode 100644 index 000000000..549972b93 --- /dev/null +++ b/packages/common/src/server.ts @@ -0,0 +1 @@ +export * from "./security"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32348d921..d90c0f1ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -591,6 +591,40 @@ importers: specifier: ^5.5.4 version: 5.5.4 + packages/cli: + dependencies: + '@drizzle-team/brocli': + specifier: ^0.9.2 + version: 0.9.2 + '@homarr/auth': + specifier: workspace:^0.1.0 + version: link:../auth + '@homarr/common': + specifier: workspace:^0.1.0 + version: link:../common + '@homarr/db': + specifier: workspace:^0.1.0 + version: link:../db + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + devDependencies: + '@homarr/eslint-config': + specifier: workspace:^0.2.0 + version: link:../../tooling/eslint + '@homarr/prettier-config': + specifier: workspace:^0.1.0 + version: link:../../tooling/prettier + '@homarr/tsconfig': + specifier: workspace:^0.1.0 + version: link:../../tooling/typescript + eslint: + specifier: ^9.8.0 + version: 9.8.0 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + packages/common: dependencies: dayjs: @@ -1608,6 +1642,9 @@ packages: '@drizzle-team/brocli@0.8.2': resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} + '@drizzle-team/brocli@0.9.2': + resolution: {integrity: sha512-yOrIWbgYMTcXuG+4sTn5OX1UtNVmtHqIqlTyp7OpYOQgIIOjLUdiG8GBVmMOwV6qelcojDB/9MHOL0POIRLMug==} + '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -6885,6 +6922,8 @@ snapshots: '@drizzle-team/brocli@0.8.2': {} + '@drizzle-team/brocli@0.9.2': {} + '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 diff --git a/turbo/generators/templates/package.json.hbs b/turbo/generators/templates/package.json.hbs index 0b52369f4..cd72632c4 100644 --- a/turbo/generators/templates/package.json.hbs +++ b/turbo/generators/templates/package.json.hbs @@ -24,8 +24,8 @@ "@homarr/eslint-config": "workspace:^0.2.0", "@homarr/prettier-config": "workspace:^0.1.0", "@homarr/tsconfig": "workspace:^0.1.0", - "eslint": "^9.5.0", - "typescript": "^5.5.2" + "eslint": "^9.8.0", + "typescript": "^5.5.4" }, "prettier": "@homarr/prettier-config" } \ No newline at end of file From 796261c5f5f1fa2b02ce3d9ef338a5196d90ec07 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 08:32:53 +0000 Subject: [PATCH 07/42] fix(deps): update dependency video.js to ^8.17.2 (#917) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/widgets/package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/widgets/package.json b/packages/widgets/package.json index eb40df708..02bfb9212 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -58,7 +58,7 @@ "next": "^14.2.5", "mantine-react-table": "2.0.0-beta.6", "react": "^18.3.1", - "video.js": "^8.17.1" + "video.js": "^8.17.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d90c0f1ea..072fd7139 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1400,8 +1400,8 @@ importers: specifier: ^18.3.1 version: 18.3.1 video.js: - specifier: ^8.17.1 - version: 8.17.1 + specifier: ^8.17.2 + version: 8.17.2 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -2970,8 +2970,8 @@ packages: '@umami/node@0.3.0': resolution: {integrity: sha512-+1cZ7o7jVN8oXDYZRqigfLHrWbEv5vtGWjB7blfVH1QUa+DRmWB6GfhMZtE2aSW+P9ACal8ZW7xD2PCAejlNCQ==} - '@videojs/http-streaming@3.13.1': - resolution: {integrity: sha512-G7YrgNEq9ETaUmtkoTnTuwkY9U+xP7Xncedzgxio/Rmz2Gn2zmodEbBIVQinb2UDznk7X8uY5XBr/Ew6OD/LWg==} + '@videojs/http-streaming@3.13.2': + resolution: {integrity: sha512-eCfQp61w00hg7Y9npmLnsJ6UvDF+SsFYzu7mQJgVXxWpVm9AthYWA3KQEKA7F7Sy6yzlm/Sps8BHs5ItelNZgQ==} engines: {node: '>=8', npm: '>=5'} peerDependencies: video.js: ^8.14.0 @@ -6488,8 +6488,8 @@ packages: resolution: {integrity: sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - video.js@8.17.1: - resolution: {integrity: sha512-MKW/oRs5B9UeN6TiF+CsVNGacxV4mPWlyDt1VzRkNXy6gPkCK04oQKB2XEhHHQCtACv3PeOkOXnr5b1ID2LwPg==} + video.js@8.17.2: + resolution: {integrity: sha512-oa4BGAr5H965OBcn83qM9xMMtjtSCRh0zMLnyouD9itQJ994FY/NlYo+XSPujk4NpsBGHSUF/+rGy0Wu5Mrzqg==} videojs-contrib-quality-levels@4.1.0: resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==} @@ -8100,7 +8100,7 @@ snapshots: '@umami/node@0.3.0': {} - '@videojs/http-streaming@3.13.1(video.js@8.17.1)': + '@videojs/http-streaming@3.13.2(video.js@8.17.2)': dependencies: '@babel/runtime': 7.23.9 '@videojs/vhs-utils': 4.0.0 @@ -8109,7 +8109,7 @@ snapshots: m3u8-parser: 7.1.0 mpd-parser: 1.3.0 mux.js: 7.0.3 - video.js: 8.17.1 + video.js: 8.17.2 '@videojs/vhs-utils@3.0.5': dependencies: @@ -12167,10 +12167,10 @@ snapshots: dependencies: builtins: 5.0.1 - video.js@8.17.1: + video.js@8.17.2: dependencies: '@babel/runtime': 7.23.9 - '@videojs/http-streaming': 3.13.1(video.js@8.17.1) + '@videojs/http-streaming': 3.13.2(video.js@8.17.2) '@videojs/vhs-utils': 4.0.0 '@videojs/xhr': 2.7.0 aes-decrypter: 4.0.1 @@ -12179,14 +12179,14 @@ snapshots: mpd-parser: 1.3.0 mux.js: 7.0.3 safe-json-parse: 4.0.0 - videojs-contrib-quality-levels: 4.1.0(video.js@8.17.1) + videojs-contrib-quality-levels: 4.1.0(video.js@8.17.2) videojs-font: 4.2.0 videojs-vtt.js: 0.15.5 - videojs-contrib-quality-levels@4.1.0(video.js@8.17.1): + videojs-contrib-quality-levels@4.1.0(video.js@8.17.2): dependencies: global: 4.4.0 - video.js: 8.17.1 + video.js: 8.17.2 videojs-font@4.2.0: {} From d378ddb42bd43971d88b43cb90e24d83d69d9812 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:48:23 +0000 Subject: [PATCH 08/42] fix(deps): update dependency drizzle-kit to ^0.23.2 (#918) 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 fabb52e6a..d9d06bdbb 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -38,7 +38,7 @@ "drizzle-orm": "^0.32.1", "dotenv": "^16.4.5", "mysql2": "3.11.0", - "drizzle-kit": "^0.23.1" + "drizzle-kit": "^0.23.2" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 072fd7139..b340b53ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -816,8 +816,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.23.1 - version: 0.23.1 + specifier: ^0.23.2 + version: 0.23.2 drizzle-orm: specifier: ^0.32.1 version: 0.32.1(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) @@ -3804,8 +3804,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.23.1: - resolution: {integrity: sha512-posGQhj8/K4S4CPhk7BO9+IcpNdIh96t0DvcAr/NvMKhPhe5D0MELzmpq9R2MpmSP3fd+Z3upwidtetrw7xnjg==} + drizzle-kit@0.23.2: + resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} hasBin: true drizzle-orm@0.32.1: @@ -9116,7 +9116,7 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.23.1: + drizzle-kit@0.23.2: dependencies: '@drizzle-team/brocli': 0.8.2 '@esbuild-kit/esm-loader': 2.6.5 From 3f35163481c85f434a60438ea7425a75b4b2285d Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:31:47 +0000 Subject: [PATCH 09/42] fix(deps): update dependency drizzle-orm to ^0.32.2 (#919) 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 d9d06bdbb..2db0571f6 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -35,7 +35,7 @@ "@paralleldrive/cuid2": "^2.2.2", "@auth/core": "^0.34.2", "better-sqlite3": "^11.1.2", - "drizzle-orm": "^0.32.1", + "drizzle-orm": "^0.32.2", "dotenv": "^16.4.5", "mysql2": "3.11.0", "drizzle-kit": "^0.23.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b340b53ae..d199c6e52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -819,8 +819,8 @@ importers: specifier: ^0.23.2 version: 0.23.2 drizzle-orm: - specifier: ^0.32.1 - version: 0.32.1(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) + specifier: ^0.32.2 + version: 0.32.2(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) mysql2: specifier: 3.11.0 version: 3.11.0 @@ -3808,8 +3808,8 @@ packages: resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} hasBin: true - drizzle-orm@0.32.1: - resolution: {integrity: sha512-Wq1J+lL8PzwR5K3a1FfoWsbs8powjr3pGA4+5+2ueN1VTLDNFYEolUyUWFtqy8DVRvYbL2n7sXZkgVmK9dQkng==} + drizzle-orm@0.32.2: + resolution: {integrity: sha512-3fXKzPzrgZIcnWCSLiERKN5Opf9Iagrag75snfFlKeKSYB1nlgPBshzW3Zn6dQymkyiib+xc4nIz0t8U+Xdpuw==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -9125,7 +9125,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.32.1(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1): + drizzle-orm@0.32.2(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1): optionalDependencies: '@prisma/client': 5.16.1 '@types/better-sqlite3': 7.6.11 From 137ebf6d22bc1a420bab52444e2cd3df5fe31852 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:48:06 +0000 Subject: [PATCH 10/42] fix(deps): update mantine monorepo to ^7.12.0 (#920) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 10 +- packages/form/package.json | 2 +- packages/modals/package.json | 4 +- packages/notifications/package.json | 2 +- packages/spotlight/package.json | 6 +- packages/ui/package.json | 6 +- packages/widgets/package.json | 4 +- pnpm-lock.yaml | 192 ++++++++++++++-------------- 8 files changed, 113 insertions(+), 113 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 9fbf6f904..640d05682 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -32,11 +32,11 @@ "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", "@homarr/widgets": "workspace:^0.1.0", - "@mantine/colors-generator": "^7.11.2", - "@mantine/core": "^7.11.2", - "@mantine/hooks": "^7.11.2", - "@mantine/modals": "^7.11.2", - "@mantine/tiptap": "^7.11.2", + "@mantine/colors-generator": "^7.12.0", + "@mantine/core": "^7.12.0", + "@mantine/hooks": "^7.12.0", + "@mantine/modals": "^7.12.0", + "@mantine/tiptap": "^7.12.0", "@homarr/server-settings": "workspace:^0.1.0", "@t3-oss/env-nextjs": "^0.11.0", "@tanstack/react-query": "^5.51.21", diff --git a/packages/form/package.json b/packages/form/package.json index e62eff03c..e68659f4c 100644 --- a/packages/form/package.json +++ b/packages/form/package.json @@ -21,7 +21,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@mantine/form": "^7.11.2", + "@mantine/form": "^7.12.0", "@homarr/validation": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0" }, diff --git a/packages/modals/package.json b/packages/modals/package.json index 5a04c112b..a6047c113 100644 --- a/packages/modals/package.json +++ b/packages/modals/package.json @@ -24,8 +24,8 @@ "@homarr/ui": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", "react": "^18.3.1", - "@mantine/core": "^7.11.2", - "@mantine/hooks": "^7.11.2" + "@mantine/core": "^7.12.0", + "@mantine/hooks": "^7.12.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 8dca7eeda..0b30c4a33 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -22,7 +22,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@mantine/notifications": "^7.11.2", + "@mantine/notifications": "^7.12.0", "@homarr/ui": "workspace:^0.1.0", "@tabler/icons-react": "^3.11.0" }, diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index ec6c63f69..1226b9565 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -24,9 +24,9 @@ "dependencies": { "@homarr/ui": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", - "@mantine/core": "^7.11.2", - "@mantine/hooks": "^7.11.2", - "@mantine/spotlight": "^7.11.2", + "@mantine/core": "^7.12.0", + "@mantine/hooks": "^7.12.0", + "@mantine/spotlight": "^7.12.0", "@tabler/icons-react": "^3.11.0", "jotai": "^2.9.1", "next": "^14.2.5", diff --git a/packages/ui/package.json b/packages/ui/package.json index 15964bcf9..fee017f06 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -26,9 +26,9 @@ "@homarr/log": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/translation": "workspace:^0.1.0", - "@mantine/core": "^7.11.2", - "@mantine/dates": "^7.11.2", - "@mantine/hooks": "^7.11.2", + "@mantine/core": "^7.12.0", + "@mantine/dates": "^7.12.0", + "@mantine/hooks": "^7.12.0", "@tabler/icons-react": "^3.11.0", "mantine-react-table": "2.0.0-beta.6", "next": "^14.2.5", diff --git a/packages/widgets/package.json b/packages/widgets/package.json index 02bfb9212..ef9dc5945 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -35,8 +35,8 @@ "@homarr/translation": "workspace:^0.1.0", "@homarr/ui": "workspace:^0.1.0", "@homarr/validation": "workspace:^0.1.0", - "@mantine/hooks": "^7.11.2", - "@mantine/core": "^7.11.2", + "@mantine/hooks": "^7.12.0", + "@mantine/core": "^7.12.0", "@tabler/icons-react": "^3.11.0", "@tiptap/extension-color": "2.5.8", "@tiptap/extension-highlight": "2.5.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d199c6e52..0bcf06988 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,20 +108,20 @@ importers: specifier: workspace:^0.1.0 version: link:../../packages/widgets '@mantine/colors-generator': - specifier: ^7.11.2 - version: 7.11.2(chroma-js@2.6.0) + specifier: ^7.12.0 + version: 7.12.0(chroma-js@2.6.0) '@mantine/core': - specifier: ^7.11.2 - version: 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) '@mantine/modals': - specifier: ^7.11.2 - version: 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/tiptap': - specifier: ^7.11.2 - version: 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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) + specifier: ^7.12.0 + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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) '@t3-oss/env-nextjs': specifier: ^0.11.0 version: 0.11.0(typescript@5.5.4)(zod@3.23.8) @@ -181,7 +181,7 @@ importers: version: 2.9.1(@types/react@18.3.3)(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -881,8 +881,8 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/form': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -999,11 +999,11 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.11.2 - version: 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -1030,8 +1030,8 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/notifications': - specifier: ^7.11.2 - version: 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tabler/icons-react': specifier: ^3.11.0 version: 3.11.0(react@18.3.1) @@ -1141,14 +1141,14 @@ importers: specifier: workspace:^0.1.0 version: link:../ui '@mantine/core': - specifier: ^7.11.2 - version: 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) '@mantine/spotlight': - specifier: ^7.11.2 - version: 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tabler/icons-react': specifier: ^3.11.0 version: 3.11.0(react@18.3.1) @@ -1188,7 +1188,7 @@ importers: version: 1.11.12 mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-international: specifier: ^1.2.4 version: 1.2.4 @@ -1221,20 +1221,20 @@ importers: specifier: workspace:^0.1.0 version: link:../translation '@mantine/core': - specifier: ^7.11.2 - version: 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/dates': - specifier: ^7.11.2 - version: 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) '@tabler/icons-react': specifier: ^3.11.0 version: 3.11.0(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -1331,11 +1331,11 @@ importers: specifier: workspace:^0.1.0 version: link:../validation '@mantine/core': - specifier: ^7.11.2 - version: 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': - specifier: ^7.11.2 - version: 7.11.2(react@18.3.1) + specifier: ^7.12.0 + version: 7.12.0(react@18.3.1) '@tabler/icons-react': specifier: ^3.11.0 version: 3.11.0(react@18.3.1) @@ -1392,7 +1392,7 @@ importers: version: 1.11.12 mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -2174,71 +2174,71 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mantine/colors-generator@7.11.2': - resolution: {integrity: sha512-WAMNdZhoHQSrSKBp+aBVl17DwzfK4k41i6RQ99YEecuYoV0NGT0nlHI2QGZPS+jlRdSjCZ6Qh99dlk0Lp2RHAQ==} + '@mantine/colors-generator@7.12.0': + resolution: {integrity: sha512-gpnDoKeZGG/nB4NcFK7zB40mk7GfRjUWGeF1jc8GquaOdLcEyWKZhVU1hsp/SDuD6+y/dMB0sc8TGSM5p+T2Lg==} peerDependencies: chroma-js: ^2.4.2 - '@mantine/core@7.11.2': - resolution: {integrity: sha512-T64RjdgY8UPAv249miW1lQyPPot1JbCcKKsAZMNQHgcttcxLhrFpKVvglc4/48hdSoxI4LYJPNvqp7zciZmucQ==} + '@mantine/core@7.12.0': + resolution: {integrity: sha512-FxsaIaEnqxV71MBGGsvXXad2q9KYTaIQFVP4TSAZI6xLChklXF/qJTqvabweaoW9BaVQT75b/BnUoJFzPfyAfw==} peerDependencies: - '@mantine/hooks': 7.11.2 + '@mantine/hooks': 7.12.0 react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/dates@7.11.2': - resolution: {integrity: sha512-BEZs949EvfIG1fRNsEpcB0YqSe53z/KObwHyBwiqFjFHJ2eFPVMpxw6Rpy1Bud0/FZRV+QBokebxaf6+2tbCCw==} + '@mantine/dates@7.12.0': + resolution: {integrity: sha512-68oDcDV+FnhQK90J9vFtO872rT303nGwR4DpAQqFAzdNBWxc3h5089/S+rehYryH4Pcwru4t0FqSB4fRvlUtLw==} peerDependencies: - '@mantine/core': 7.11.2 - '@mantine/hooks': 7.11.2 + '@mantine/core': 7.12.0 + '@mantine/hooks': 7.12.0 dayjs: '>=1.0.0' react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/form@7.11.2': - resolution: {integrity: sha512-NRY4HDgcArDEP+wUaHITnoVh0Ce3rM3Blo9fLNj2VYO8k7AfuSWp+fQdqrjDI0k9wGU3YEj4/dbwOjKbtXEhxw==} + '@mantine/form@7.12.0': + resolution: {integrity: sha512-npNHxjis/tOun12EYPYP9cQwJbtFHcGZF1m2yNCcNFVMdkBtTiqH23DdGByXmJRkypYQssSMdQTm3F1zfGsjdQ==} peerDependencies: react: ^18.2.0 - '@mantine/hooks@7.11.2': - resolution: {integrity: sha512-jhyVe/sbDEG2U8rr2lMecUPgQxcfr5hh9HazqGfkS7ZRIMDO7uJ947yAcTMGGkp5Lxtt5TBFt1Cb6tiB2/1agg==} + '@mantine/hooks@7.12.0': + resolution: {integrity: sha512-UKMSpQZMdmecZX1PKPoknfUOE9MfDPiZR1myU4wUUKpaZibvvmhYuy8mcOOmYWegapRS3ErKIAc2cNnJ1Dk4RQ==} peerDependencies: react: ^18.2.0 - '@mantine/modals@7.11.2': - resolution: {integrity: sha512-AsVyGP5+F9jkQdQ9J0qzaK8q7n9bPcpswAjScpzIgEfUBC4RCvf63bmh9Yp1OEgxl1xkNdzGUYGVau0SQqHasA==} + '@mantine/modals@7.12.0': + resolution: {integrity: sha512-CXt2nUK0VuWc+cwC1flCeH5FnQYjA8iQfGgZ37wSFv2qxzJFQ61QlRJjdgIG7T+DccUHjqXKkjYohLxXE36EQQ==} peerDependencies: - '@mantine/core': 7.11.2 - '@mantine/hooks': 7.11.2 + '@mantine/core': 7.12.0 + '@mantine/hooks': 7.12.0 react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/notifications@7.11.2': - resolution: {integrity: sha512-KB/6mp3mU3LvcFlfMc5zK5mWcrAO+zAGeiBb1oUjNFXBECCn9xizqqUeT0YbWBHL7wysq9IThDJxLwUBnQt+8Q==} + '@mantine/notifications@7.12.0': + resolution: {integrity: sha512-eW2g66b1K/EUdHD842QnQHWdKWbk1mCJkzDAyxcMGZ2BqU2zzpTUZdexbfDg2BqE/Mj/BGc3B9r2mKHt/6ebBg==} peerDependencies: - '@mantine/core': 7.11.2 - '@mantine/hooks': 7.11.2 + '@mantine/core': 7.12.0 + '@mantine/hooks': 7.12.0 react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/spotlight@7.11.2': - resolution: {integrity: sha512-/90ck+7wuRPyg7Ix8Wn6W6BUH5BX5pjAghugopLCEUcLL6gtuTHf9Pd5DG4Bd2Mf4iabpW2hiaBJoC1aJ7yDNA==} + '@mantine/spotlight@7.12.0': + resolution: {integrity: sha512-5Adf7+k07G0YSuTuJCkNwH+PPprV9MLZDXdY66DbZub4a2W7GmI7AmYg4P6Ebyi2DxhyM8o2ZiJNu1W7UDuBSw==} peerDependencies: - '@mantine/core': 7.11.2 - '@mantine/hooks': 7.11.2 + '@mantine/core': 7.12.0 + '@mantine/hooks': 7.12.0 react: ^18.2.0 react-dom: ^18.2.0 - '@mantine/store@7.11.2': - resolution: {integrity: sha512-FfkmnOnCivOjqwNaTZeV4TgDANUs7fP+0uSgzp0GuvwTuDfQNVafPBRzPkjKuz5ug+Nn9l6WwjfJ6LBDv9U0LQ==} + '@mantine/store@7.12.0': + resolution: {integrity: sha512-gKOJQVKTxJQbjhG/qlaLiv47ydHgdN+ZC2jFRJHr1jjNeiCqzIT4wX1ofG27c5byPTAwAHvuf+/FLOV3rywUpA==} peerDependencies: react: ^18.2.0 - '@mantine/tiptap@7.11.2': - resolution: {integrity: sha512-ZAnxq9YC693PLV1PyN0FhuG3iUEazlbZenqkyi7ziUZwSiWhqOM94BT/VP/R0zWjsQjAeQcq9yt8gpLfsTbDig==} + '@mantine/tiptap@7.12.0': + resolution: {integrity: sha512-5oJd0z802IV9uTHD5+1F3fyP5QfEpbdSmXCiIoslHGR+8wKI3BJp9cIYFkYx62HvL7KiCzFe6Qdlh7bX/+ttBg==} peerDependencies: - '@mantine/core': 7.11.2 - '@mantine/hooks': 7.11.2 + '@mantine/core': 7.12.0 + '@mantine/hooks': 7.12.0 '@tiptap/extension-link': '>=2.1.12' '@tiptap/react': '>=2.1.12' react: ^18.2.0 @@ -7271,14 +7271,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@mantine/colors-generator@7.11.2(chroma-js@2.6.0)': + '@mantine/colors-generator@7.12.0(chroma-js@2.6.0)': dependencies: chroma-js: 2.6.0 - '@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7289,57 +7289,57 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) clsx: 2.1.1 dayjs: 1.11.12 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@mantine/form@7.11.2(react@18.3.1)': + '@mantine/form@7.12.0(react@18.3.1)': dependencies: fast-deep-equal: 3.1.3 klona: 2.0.6 react: 18.3.1 - '@mantine/hooks@7.11.2(react@18.3.1)': + '@mantine/hooks@7.12.0(react@18.3.1)': dependencies: react: 18.3.1 - '@mantine/modals@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/modals@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@mantine/notifications@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/notifications@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) - '@mantine/store': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) + '@mantine/store': 7.12.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/spotlight@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mantine/spotlight@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) - '@mantine/store': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) + '@mantine/store': 7.12.0(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@mantine/store@7.11.2(react@18.3.1)': + '@mantine/store@7.12.0(react@18.3.1)': dependencies: react: 18.3.1 - '@mantine/tiptap@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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)': + '@mantine/tiptap@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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)': dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) '@tiptap/extension-link': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) '@tiptap/react': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -10494,11 +10494,11 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.6(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mantine-react-table@2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@mantine/core': 7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/dates': 7.11.2(@mantine/core@7.11.2(@mantine/hooks@7.11.2(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.11.2(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@mantine/hooks': 7.11.2(react@18.3.1) + '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/dates': 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mantine/hooks': 7.12.0(react@18.3.1) '@tabler/icons-react': 3.11.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) From c69483a12c14ab284dd3cacd0e31d194dcc48cfc Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 17:38:02 +0000 Subject: [PATCH 11/42] fix(deps): update dependency typescript-eslint to ^8.0.1 (#921) 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 0bcf06988..f02b5b187 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1435,7 +1435,7 @@ importers: version: 2.0.11(eslint@9.8.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) + version: 2.29.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) eslint-plugin-jsx-a11y: specifier: ^6.9.0 version: 6.9.0(eslint@9.8.0) @@ -1446,8 +1446,8 @@ importers: specifier: ^4.6.2 version: 4.6.2(eslint@9.8.0) typescript-eslint: - specifier: ^8.0.0 - version: 8.0.0(eslint@9.8.0)(typescript@5.5.4) + specifier: ^8.0.1 + version: 8.0.1(eslint@9.8.0)(typescript@5.5.4) devDependencies: '@homarr/prettier-config': specifier: workspace:^0.1.0 @@ -2910,8 +2910,8 @@ packages: '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - '@typescript-eslint/eslint-plugin@8.0.0': - resolution: {integrity: sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==} + '@typescript-eslint/eslint-plugin@8.0.1': + resolution: {integrity: sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -2921,8 +2921,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.0.0': - resolution: {integrity: sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==} + '@typescript-eslint/parser@8.0.1': + resolution: {integrity: sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2931,12 +2931,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.0.0': - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} + '@typescript-eslint/scope-manager@8.0.1': + resolution: {integrity: sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.0.0': - resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} + '@typescript-eslint/type-utils@8.0.1': + resolution: {integrity: sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2944,12 +2944,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.0.0': - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} + '@typescript-eslint/types@8.0.1': + resolution: {integrity: sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.0.0': - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} + '@typescript-eslint/typescript-estree@8.0.1': + resolution: {integrity: sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2957,14 +2957,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.0.0': - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} + '@typescript-eslint/utils@8.0.1': + resolution: {integrity: sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.0.0': - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} + '@typescript-eslint/visitor-keys@8.0.1': + resolution: {integrity: sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@umami/node@0.3.0': @@ -6348,8 +6348,8 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript-eslint@8.0.0: - resolution: {integrity: sha512-yQWBJutWL1PmpmDddIOl9/Mi6vZjqNCjqSGBMQ4vsc2Aiodk0SnbQQWPXbSy0HNuKCuGkw1+u4aQ2mO40TdhDQ==} + typescript-eslint@8.0.1: + resolution: {integrity: sha512-V3Y+MdfhawxEjE16dWpb7/IOgeXnLwAEEkS7v8oDqNcR1oYlqWhGH/iHqHdKVdpWme1VPZ0SoywXAkCqawj2eQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -8017,14 +8017,14 @@ snapshots: dependencies: '@types/node': 20.14.14 - '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@8.0.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/type-utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.0.1 eslint: 9.8.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -8035,12 +8035,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.0.1 debug: 4.3.5 eslint: 9.8.0 optionalDependencies: @@ -8048,15 +8048,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.0.0': + '@typescript-eslint/scope-manager@8.0.1': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 - '@typescript-eslint/type-utils@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) debug: 4.3.5 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -8065,12 +8065,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.0.0': {} + '@typescript-eslint/types@8.0.1': {} - '@typescript-eslint/typescript-estree@8.0.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@8.0.1(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 @@ -8082,20 +8082,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.0.0(eslint@9.8.0)(typescript@5.5.4)': + '@typescript-eslint/utils@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.0.0': + '@typescript-eslint/visitor-keys@8.0.1': dependencies: - '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/types': 8.0.1 eslint-visitor-keys: 3.4.3 '@umami/node@0.3.0': {} @@ -9430,17 +9430,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) eslint: 9.8.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 @@ -9450,7 +9450,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.8.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.8.0) hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -9461,7 +9461,7 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -12048,11 +12048,11 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typescript-eslint@8.0.0(eslint@9.8.0)(typescript@5.5.4): + typescript-eslint@8.0.1(eslint@9.8.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 8.0.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 56f4ecc27..fd3550976 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -23,7 +23,7 @@ "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-react": "^7.35.0", "eslint-plugin-react-hooks": "^4.6.2", - "typescript-eslint": "^8.0.0" + "typescript-eslint": "^8.0.1" }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", From c6bb272318eccc4cf9c2790513a89cec650526e5 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:36:34 +0000 Subject: [PATCH 12/42] fix(deps): update tiptap monorepo to v2.5.9 (#922) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/widgets/package.json | 30 +-- pnpm-lock.yaml | 490 +++++++++++++++++----------------- 2 files changed, 260 insertions(+), 260 deletions(-) diff --git a/packages/widgets/package.json b/packages/widgets/package.json index ef9dc5945..f6f3d479f 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -38,21 +38,21 @@ "@mantine/hooks": "^7.12.0", "@mantine/core": "^7.12.0", "@tabler/icons-react": "^3.11.0", - "@tiptap/extension-color": "2.5.8", - "@tiptap/extension-highlight": "2.5.8", - "@tiptap/extension-image": "2.5.8", - "@tiptap/extension-link": "^2.5.8", - "@tiptap/extension-table": "2.5.8", - "@tiptap/extension-table-cell": "2.5.8", - "@tiptap/extension-table-header": "2.5.8", - "@tiptap/extension-table-row": "2.5.8", - "@tiptap/extension-task-item": "2.5.8", - "@tiptap/extension-task-list": "2.5.8", - "@tiptap/extension-text-align": "2.5.8", - "@tiptap/extension-text-style": "2.5.8", - "@tiptap/extension-underline": "2.5.8", - "@tiptap/react": "^2.5.8", - "@tiptap/starter-kit": "^2.5.8", + "@tiptap/extension-color": "2.5.9", + "@tiptap/extension-highlight": "2.5.9", + "@tiptap/extension-image": "2.5.9", + "@tiptap/extension-link": "^2.5.9", + "@tiptap/extension-table": "2.5.9", + "@tiptap/extension-table-cell": "2.5.9", + "@tiptap/extension-table-header": "2.5.9", + "@tiptap/extension-table-row": "2.5.9", + "@tiptap/extension-task-item": "2.5.9", + "@tiptap/extension-task-list": "2.5.9", + "@tiptap/extension-text-align": "2.5.9", + "@tiptap/extension-text-style": "2.5.9", + "@tiptap/extension-underline": "2.5.9", + "@tiptap/react": "^2.5.9", + "@tiptap/starter-kit": "^2.5.9", "clsx": "^2.1.1", "dayjs": "^1.11.12", "next": "^14.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f02b5b187..c77b9029f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,7 +121,7 @@ importers: version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/tiptap': specifier: ^7.12.0 - version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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) + version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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) '@t3-oss/env-nextjs': specifier: ^0.11.0 version: 0.11.0(typescript@5.5.4)(zod@3.23.8) @@ -1340,50 +1340,50 @@ importers: specifier: ^3.11.0 version: 3.11.0(react@18.3.1) '@tiptap/extension-color': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/extension-text-style@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))) '@tiptap/extension-highlight': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-image': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-link': - specifier: ^2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + specifier: ^2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) '@tiptap/extension-table': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) '@tiptap/extension-table-cell': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-table-header': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-table-row': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-task-item': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) '@tiptap/extension-task-list': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-text-align': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-text-style': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/extension-underline': - specifier: 2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + specifier: 2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) '@tiptap/react': - specifier: ^2.5.8 - version: 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^2.5.9 + version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.5.8 - version: 2.5.8(@tiptap/pm@2.2.4) + specifier: ^2.5.9 + version: 2.5.9(@tiptap/pm@2.2.4) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -2503,200 +2503,200 @@ packages: '@tanstack/virtual-core@3.8.3': resolution: {integrity: sha512-vd2A2TnM5lbnWZnHi9B+L2gPtkSeOtJOAw358JqokIH1+v2J7vUAzFVPwB/wrye12RFOurffXu33plm4uQ+JBQ==} - '@tiptap/core@2.5.8': - resolution: {integrity: sha512-lkWCKyoAoMTxM137MoEsorG7tZ5MZU6O3wMRuZ0P9fcTRY5vd1NWncWuPzuGSJIpL20gwBQOsS6PaQSfR3xjlA==} + '@tiptap/core@2.5.9': + resolution: {integrity: sha512-PPUR+0tbr+wX2G8RG4FEps4qhbnAPEeXK1FUtirLXSRh8vm+TDgafu3sms7wBc4fAyw9zTO/KNNZ90GBe04guA==} peerDependencies: - '@tiptap/pm': ^2.5.8 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-blockquote@2.5.8': - resolution: {integrity: sha512-P8vDiagtRrUfIewfCKrJe0ddDSjPgOTKzqoM1UXKS+MenT8C/wT4bjiwopAoWP6zMoV0TfHWXah9emllmCfXFA==} + '@tiptap/extension-blockquote@2.5.9': + resolution: {integrity: sha512-LhGyigmd/v1OjYPeoVK8UvFHbH6ffh175ZuNvseZY4PsBd7kZhrSUiuMG8xYdNX8FxamsxAzr2YpsYnOzu3W7A==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-bold@2.5.8': - resolution: {integrity: sha512-4vEn+U7Y8B4e8izcL7QuEKYJ9thCSdo+UF1K3TOqQWuJTzTrJLPMwTZ4vYOHzvuq5uIXyPLnWzLgnRLgy5mJRg==} + '@tiptap/extension-bold@2.5.9': + resolution: {integrity: sha512-XUJdzFb31t0+bwiRquJf0btBpqOB3axQNHTKM9XADuL4S+Z6OBPj0I5rYINeElw/Q7muvdWrHWHh/ovNJA1/5A==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-bubble-menu@2.5.8': - resolution: {integrity: sha512-COmd1Azudu7i281emZFIESECe7FnvWiRoBoQBVjjWSyq5PVzwJaA3PAlnU7GyNZKtVXMZ4xbrckdyNQfDeVQDA==} + '@tiptap/extension-bubble-menu@2.5.9': + resolution: {integrity: sha512-NddZ8Qn5dgPPa1W4yk0jdhF4tDBh0FwzBpbnDu2Xz/0TUHrA36ugB2CvR5xS1we4zUKckgpVqOqgdelrmqqFVg==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-bullet-list@2.5.8': - resolution: {integrity: sha512-Wvf0HWBI0ulssoCsCOguxJB1Ntmj9PtE8b/ieFwFvrNptP+sf25XiWgjMs7H1KQrtmpngBu/Bhh5jJRgAmAgeQ==} + '@tiptap/extension-bullet-list@2.5.9': + resolution: {integrity: sha512-hJTv1x4omFgaID4LMRT5tOZb/VKmi8Kc6jsf4JNq4Grxd2sANmr9qpmKtBZvviK+XD5PpTXHvL+1c8C1SQtuHQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-code-block@2.5.8': - resolution: {integrity: sha512-atMtT1Ddc4hv9+OiH/UCLfQ6Ooo45xpPaaOhqs1Ab509YyqxoyEbfNSOth/yx9DFb8VOenRWE1WV3Z3C0ial0Q==} + '@tiptap/extension-code-block@2.5.9': + resolution: {integrity: sha512-+MUwp0VFFv2aFiZ/qN6q10vfIc6VhLoFFpfuETX10eIRks0Xuj2nGiqCDj7ca0/M44bRg2VvW8+tg/ZEHFNl9g==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-code@2.5.8': - resolution: {integrity: sha512-56lb4NnaYAbIkqBTCIg4ZoITrw86Dj8C2HSi6DrU7f5q9cfvGuH+2057I5n8eEEfASu1AeDN6tSnCz3NR+yiHw==} + '@tiptap/extension-code@2.5.9': + resolution: {integrity: sha512-Q1PL3DUXiEe5eYUwOug1haRjSaB0doAKwx7KFVI+kSGbDwCV6BdkKAeYf3us/O2pMP9D0im8RWX4dbSnatgwBA==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-color@2.5.8': - resolution: {integrity: sha512-XId+CbRqkgyvbeJunnL3E0EF4/dpolj6gy6AITk9CyghLNBHegOaz+AmECO9+i1Zbpituv00Nh8KUrGlVI6aOA==} + '@tiptap/extension-color@2.5.9': + resolution: {integrity: sha512-VUGCT9iqD/Ni9arLIxkCbykAElRMFyew7uk2kbbNvttzdwzmZkbslEgCiaEZQTqKr8w4wjuQL14YOtXc6iwEww==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/extension-text-style': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/extension-text-style': ^2.5.9 - '@tiptap/extension-document@2.5.8': - resolution: {integrity: sha512-r3rP4ihCJAdp3VRIeqd80etHx7jttzZaKNFX8hkQShHK6eTHwrR92VL0jDE4K+NOE3bxjMsOlYizJYWV042BtA==} + '@tiptap/extension-document@2.5.9': + resolution: {integrity: sha512-VdNZYDyCzC3W430UdeRXR9IZzPeODSbi5Xz/JEdV93THVp8AC9CrZR7/qjqdBTgbTB54VP8Yr6bKfCoIAF0BeQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-dropcursor@2.5.8': - resolution: {integrity: sha512-xPmIfTYqurFF8RukCPlHd8mT8I7hDinWrgq7CQTRROxcJ3DNw8PooWrKWaBYs9HXHe1pbiQ5EK0uOsNvQ1bcDg==} + '@tiptap/extension-dropcursor@2.5.9': + resolution: {integrity: sha512-nEOb37UryG6bsU9JAs/HojE6Jg43LupNTAMISbnuB1CPAeAqNsFMwORd9eEPkyEwnQT7MkhsMOSJM44GoPGIFA==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-floating-menu@2.5.8': - resolution: {integrity: sha512-qsM6tCyRlXnI/gADrkO/2p0Tldu5aY96CnsXpZMaflMgsO577qhcXD0ReGg17uLXBzJa5xmV8qOik0Ptq3WEWg==} + '@tiptap/extension-floating-menu@2.5.9': + resolution: {integrity: sha512-MWJIQQT6e5MgqHny8neeH2Dx926nVPF7sv4p84nX4E0dnkRbEYUP8mCsWYhSUvxxIif6e+yY+4654f2Q9qTx1w==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-gapcursor@2.5.8': - resolution: {integrity: sha512-nR7AUOE4xWdp0sDbLbe4uwAhQ/xq+MTLVafvffMLT81U/Hl9R+w0Ap2XF0+c6/JTQwVjZiOalAmg4dobx7rJUQ==} + '@tiptap/extension-gapcursor@2.5.9': + resolution: {integrity: sha512-yW7V2ebezsa7mWEDWCg4A1ZGsmSV5bEHKse9wzHCDkb7TutSVhLZxGo72U6hNN9PnAksv+FJQk03NuZNYvNyRQ==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-hard-break@2.5.8': - resolution: {integrity: sha512-samZEL0EXzHSmMQ7KyLnfSxdDv3qSjia0JzelfCnFZS6LLcbwjrIjV8ZPxEhJ7UlZqroQdFxPegllkLHZj/MdQ==} + '@tiptap/extension-hard-break@2.5.9': + resolution: {integrity: sha512-8hQ63SgZRG4BqHOeSfeaowG2eMr2beced018pOGbpHbE3XSYoISkMVuFz4Z8UEVR3W9dTbKo4wxNufSTducocQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-heading@2.5.8': - resolution: {integrity: sha512-fDQoUkTLN+U8MNQ8PI+syKyshS9qFHlKihxzMLf/+tRisJvP47gzHDur99nffTSbXFDnASDqhavhKjI/2xTWlQ==} + '@tiptap/extension-heading@2.5.9': + resolution: {integrity: sha512-HHowAlGUbFn1qvmY02ydM7qiPPMTGhAJn2A46enDRjNHW5UoqeMfkMpTEYaioOexyguRFSfDT3gpK68IHkQORQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-highlight@2.5.8': - resolution: {integrity: sha512-Auli6YBdUjF8mo0beEYw6Eh1hySukoQVjq+Yz6RKpaRzrrvXjoZUciQ6RoGXS4BHT7sfp8fMw9OIVo9Ifx8d8w==} + '@tiptap/extension-highlight@2.5.9': + resolution: {integrity: sha512-tRaSIIbCI7aBlvlmgUgBI5lVBqnMy49lc++UVAx1Pjey1j2KW031vUyvZfEwf6wk8Y7W3kVSkN0mW9IYCcOAOQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-history@2.5.8': - resolution: {integrity: sha512-5IrZZfp2Rg9Tov/08aYTKhwoiqdun8v3j3vleuqyW5RB7LU/NKLR19EtSSMh9mVkFZVbhab2zDOFmn5ilsEOhw==} + '@tiptap/extension-history@2.5.9': + resolution: {integrity: sha512-hGPtJgoZSwnVVqi/xipC2ET/9X2G2UI/Y+M3IYV1ZlM0tCYsv4spNi3uXlZqnXRwYcBXLk5u6e/dmsy5QFbL8g==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-horizontal-rule@2.5.8': - resolution: {integrity: sha512-L8Is73WGaP6VNdKrIry+lCIM9W1KaL/Tw2Z6DGMVMU5mr1lLx0xq7nWEStqD7e4zh+n4+3PV15cZSA2F34DZrg==} + '@tiptap/extension-horizontal-rule@2.5.9': + resolution: {integrity: sha512-/ES5NdxCndBmZAgIXSpCJH8YzENcpxR0S8w34coSWyv+iW0Sq7rW/mksQw8ZIVsj8a7ntpoY5OoRFpSlqcvyGw==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-image@2.5.8': - resolution: {integrity: sha512-xlF3dqzXSN/6vWdmGOaIz0YVUO/B69mPw9vUITg7bQdc4X2pc52tvTGhpAzAc/kbwSVrW33icxAsXx8XH9Bkkg==} + '@tiptap/extension-image@2.5.9': + resolution: {integrity: sha512-v4WZISCvbriac6HE6v7kYYY7KX+v9rJaIZC3gbYGtqnBWfaAwZiVVu8Z03xSrqYhoc+KHuI+oQ4VubcvZ/i7OQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-italic@2.5.8': - resolution: {integrity: sha512-Kh35a7slBai+Qr/tiF9XFXmuWMgUQz4Nt51hmzqVGVuG+QsdWzQE8IZBGypKm8aAzxTGSY0d0QA0rys+YRNq1Q==} + '@tiptap/extension-italic@2.5.9': + resolution: {integrity: sha512-Bw+P139L4cy+B56zpUiRjP8BZSaAUl3JFMnr/FO+FG55QhCxFMXIc6XrC3vslNy5ef3B3zv4gCttS3ee8ByMiw==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-link@2.5.8': - resolution: {integrity: sha512-qfeWR7sG2V7bn8z0f3HMyoR68pFlxYJmLs9cbW30diE9/zKClYEd3zTMPCgJ9yMSagCj4PWkqksIuktAhyRqOQ==} + '@tiptap/extension-link@2.5.9': + resolution: {integrity: sha512-7v9yRsX7NuiY8DPslIsPIlFqcD8aGBMLqfEGXltJDvuG6kykdr+khEZeWcJ8ihHIL4yWR3/MAgeT2W72Z/nxiQ==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-list-item@2.5.8': - resolution: {integrity: sha512-RFIIzHxxXdPmdf7BL0zhE4VPHoR6BTWtfi3JCTftmNqKoH7o+mLKT0RHMGvF1CGNn2HewHzXAF0iXfKCwmEgHQ==} + '@tiptap/extension-list-item@2.5.9': + resolution: {integrity: sha512-d9Eo+vBz74SMxP0r25aqiErV256C+lGz+VWMjOoqJa6xWLM1keYy12JtGQWJi8UDVZrDskJKCHq81A0uLt27WA==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-ordered-list@2.5.8': - resolution: {integrity: sha512-84gWdWhc8rUCCssn8+6Z1rFKdG7/yIe+gwYkU6WqAtDrcluJdt5jRHrcMOLxb2dbY8ww9pa72EYV/bwOisZlFQ==} + '@tiptap/extension-ordered-list@2.5.9': + resolution: {integrity: sha512-9MsWpvVvzILuEOd/GdroF7RI7uDuE1M6at9rzsaVGvCPVHZBvu1XR3MSVK5OdiJbbJuPGttlzEFLaN/rQdCGFg==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-paragraph@2.5.8': - resolution: {integrity: sha512-AMfD3lfGSiomfkSE2tUourUjVahLtIfWUQew13NTPuWoxAXaSyoCGO0ULkiou/lO3JVUUUmF9+KJrAHWGIARdA==} + '@tiptap/extension-paragraph@2.5.9': + resolution: {integrity: sha512-HDXGiHTJ/V85dbDMjcFj4XfqyTQZqry6V21ucMzgBZYX60X3gIn7VpQTQnnRjvULSgtfOASSJP6BELc5TyiK0w==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-strike@2.5.8': - resolution: {integrity: sha512-uiHhBIEqawX9Up2ofklotVQ5XpGIjwRL6wprZF38s1le3XpsgyhVV7oDnqDkC7ujCsGkOJJfXZtv3LsO3R2nzQ==} + '@tiptap/extension-strike@2.5.9': + resolution: {integrity: sha512-QezkOZpczpl09S8lp5JL7sRkwREoPY16Y/lTvBcFKm3TZbVzYZZ/KwS0zpwK9HXTfXr8os4L9AGjQf0tHonX+w==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-table-cell@2.5.8': - resolution: {integrity: sha512-t3fITH/sefWiOMSrqn34fhLRDSIZxTCwWvwvlrXnV0J5zaIjjJyP499JM3gAfB6Kb9+7Hd1VvdyDCeJbgEIgWQ==} + '@tiptap/extension-table-cell@2.5.9': + resolution: {integrity: sha512-83zg+d8iY7FLZDC2qJVvHFEIwqB9e/zGPyfRMglYH7YxHeJSycG2K969DQhwkSq+z0PhHEO2XHDcD9aFnXRQNQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-table-header@2.5.8': - resolution: {integrity: sha512-ehR/8IZpeAq8nRfkVMOlrClzTN9ZosGPz48SdhqN0V7aRaHe7MZcVOGbxrAXo9P6/3UTjh21qXFgatBVx8xoTA==} + '@tiptap/extension-table-header@2.5.9': + resolution: {integrity: sha512-+FKfxpEO8RnsHUhcWFeSpsI3ZRaDtgcX2c4kBBXZGJBMWHxw71VK9gkRM+JtxCl70hNyZR13qpOw1RmByf2kdw==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-table-row@2.5.8': - resolution: {integrity: sha512-AESSqAB2XI1X/V8nlJhcNMmzCUmXKM6K0suZPiwdK9LlhPcTrLe8q7V09fPB23ZNL5dEVxVGIREyrdKiZnshIA==} + '@tiptap/extension-table-row@2.5.9': + resolution: {integrity: sha512-VPmkzraT9m7g2/88qsTF9EQdFvkcwhvOD+WWZTflN92LMsRHddJt3peJ/fpuf0QKnwwn5qIB3fXWja4VcZe3wQ==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-table@2.5.8': - resolution: {integrity: sha512-91LTBn0tVfXYJsTcl8sOeqaoz3XNb2FUmyyQJmaLAoW8XbjnBLMk8V+BnSJdo9/RdhnujL9p9PfUvMdeUMIMJg==} + '@tiptap/extension-table@2.5.9': + resolution: {integrity: sha512-kLZdYBO0Ug4sNjzyDfa3W29qL4HdRK/IaMxcmcEbyKSt42qiMJlIelbGzVENzxe9AbcNTeiWje70Nhk4dbb8Ag==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-task-item@2.5.8': - resolution: {integrity: sha512-l20/6ieSs1J658Lj/gfLQZV9HMKp7TS6I+weJSoo+S2Cfm2VUCPp20/TXpdvhFMCF1Sma7Xpxn53289Ae6SHBg==} + '@tiptap/extension-task-item@2.5.9': + resolution: {integrity: sha512-g4HK3r3yNE0RcXQOkJHs94Ws/fhhTqa1L5iAy4gwYKNNFFnIQl8BpE6nn9d5h33kWDN9jjY+PZmq+0PvxCLODQ==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 - '@tiptap/extension-task-list@2.5.8': - resolution: {integrity: sha512-rKM/n7Zzmu0CZ0xhqiwFFY2ZrdhPDtK7KQS0U1XPZzQ8vIl/LPA9wxVYibUsAF3kJLqhAfUYUp3yDYM7ST6/EA==} + '@tiptap/extension-task-list@2.5.9': + resolution: {integrity: sha512-OylVo5cAh0117PzhyM8MGaUIrCskGiF7v7x6/zAHMFIqVdcbKsq+hMueVPnABfOyLcIH5Zojo3NzNOJeKeblCg==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-text-align@2.5.8': - resolution: {integrity: sha512-TtkEUkgHkV6nYwcvx0+vVIpgXkawZhG55IQ9CZI5PnD6tbzHTK8qFnuhnTgmX+ZQkqz4qEg5erFY/fC1gVvQ4g==} + '@tiptap/extension-text-align@2.5.9': + resolution: {integrity: sha512-WYp9v7NEWddTt2Avbk3k/3g/fkL0hh4HEG97ubCPAj2aZzlZ85AEcRN8o4wLXJvZNj43nKQtZeel84INS5uzOg==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-text-style@2.5.8': - resolution: {integrity: sha512-E3bE85/rG3NxNr0D/c24zfDgkLF1jMn5UTF1cmrSB5Z3I+fWW/QvnIlb5Jfp4yTfLTaMWr1Eg+8UKXWVCjss8g==} + '@tiptap/extension-text-style@2.5.9': + resolution: {integrity: sha512-1pNnl/a5EdY7g3IeFomm0B6eiTvAFOBeJGswoYxogzHmkWbLFhXFdgZ6qz7+k985w4qscsG1GpvtOW3IrJ9J6g==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-text@2.5.8': - resolution: {integrity: sha512-CNkD51jRMdcYCqFVOkrnebqBQ6pCD3ZD5z9kO5bOC5UPZKZBkLsWdlrHGAVwosxcGxdJACbqJ0Nj+fMgIw4tNA==} + '@tiptap/extension-text@2.5.9': + resolution: {integrity: sha512-W0pfiQUPsMkwaV5Y/wKW4cFsyXAIkyOFt7uN5u6LrZ/iW9KZ/IsDODPJDikWp0aeQnXzT9NNQULTpCjbHzzS6g==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 - '@tiptap/extension-underline@2.5.8': - resolution: {integrity: sha512-MxtOcYXVSpiYWNE1hzmBNUJELyH70Y/fFNbOyI5VPOoCZT7a3XjtWIbiZhBvN1lIzXYMHDj8Wacxzt6whK5KJw==} + '@tiptap/extension-underline@2.5.9': + resolution: {integrity: sha512-1gFBLzzphwJHsPLwUl9xosErEmtG2c2Sa2ajyS4uRjfl9X7+Li2O2WelZLHZGgTHWliE6ptA3m1MyXppHoitbg==} peerDependencies: - '@tiptap/core': ^2.5.8 + '@tiptap/core': ^2.5.9 '@tiptap/pm@2.2.4': resolution: {integrity: sha512-Po0klR165zgtinhVp1nwMubjyKx6gAY9kH3IzcniYLCkqhPgiqnAcCr61TBpp4hfK8YURBS4ihvCB1dyfCyY8A==} - '@tiptap/react@2.5.8': - resolution: {integrity: sha512-twUMm8HV7scUgR/E1hYS9N6JDtKPl7cgDiPjxTynNHc5S5f5Ecv4ns/BZRq3TMZ/JDrp4rghLvgq+ImQsLvPOA==} + '@tiptap/react@2.5.9': + resolution: {integrity: sha512-NZYAslIb79oxIOFHx9T9ey5oX0aJ1uRbtT2vvrvvyRaO6fKWgAwMYN92bOu5/f2oUVGUp6l7wkYZGdjz/XP5bA==} peerDependencies: - '@tiptap/core': ^2.5.8 - '@tiptap/pm': ^2.5.8 + '@tiptap/core': ^2.5.9 + '@tiptap/pm': ^2.5.9 react: ^17.0.0 || ^18.0.0 react-dom: ^17.0.0 || ^18.0.0 - '@tiptap/starter-kit@2.5.8': - resolution: {integrity: sha512-Beb6Q3cFmJ1pE22WlFrG3wj8XAGXqaGkbqtsGAJDnoyWL4uoSs4vLt5I/UJshK/nQlNqTWFdpd9SxRFsxBYpqg==} + '@tiptap/starter-kit@2.5.9': + resolution: {integrity: sha512-nZ4V+vRayomjxUsajFMHv1iJ5SiSaEA65LAXze/CzyZXGMXfL2OLzY7wJoaVJ4BgwINuO0dOSAtpNDN6jI+6mQ==} '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -7336,12 +7336,12 @@ snapshots: dependencies: react: 18.3.1 - '@mantine/tiptap@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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)': + '@mantine/tiptap@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tiptap/extension-link@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4))(@tiptap/react@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(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)': dependencies: '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': 7.12.0(react@18.3.1) - '@tiptap/extension-link': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/react': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/extension-link': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/react': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7552,155 +7552,155 @@ snapshots: '@tanstack/virtual-core@3.8.3': {} - '@tiptap/core@2.5.8(@tiptap/pm@2.2.4)': + '@tiptap/core@2.5.9(@tiptap/pm@2.2.4)': dependencies: '@tiptap/pm': 2.2.4 - '@tiptap/extension-blockquote@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-blockquote@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-bold@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-bold@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-bubble-menu@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-bubble-menu@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 tippy.js: 6.3.7 - '@tiptap/extension-bullet-list@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-bullet-list@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-code-block@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-code-block@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-code@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-code@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-color@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/extension-text-style@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)))': + '@tiptap/extension-color@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) - '@tiptap/extension-text-style': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) + '@tiptap/extension-text-style': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) - '@tiptap/extension-document@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-document@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-dropcursor@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-dropcursor@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-floating-menu@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-floating-menu@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 tippy.js: 6.3.7 - '@tiptap/extension-gapcursor@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-gapcursor@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-hard-break@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-hard-break@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-heading@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-heading@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-highlight@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-highlight@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-history@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-history@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-horizontal-rule@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-horizontal-rule@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-image@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-image@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-italic@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-italic@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-link@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-link@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 linkifyjs: 4.1.3 - '@tiptap/extension-list-item@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-list-item@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-ordered-list@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-ordered-list@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-paragraph@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-paragraph@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-strike@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-strike@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-table-cell@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-table-cell@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-table-header@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-table-header@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-table-row@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-table-row@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-table@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-table@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-task-item@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': + '@tiptap/extension-task-item@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 - '@tiptap/extension-task-list@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-task-list@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-text-align@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-text-align@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-text-style@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-text@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-text@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) - '@tiptap/extension-underline@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))': + '@tiptap/extension-underline@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) '@tiptap/pm@2.2.4': dependencies: @@ -7723,38 +7723,38 @@ snapshots: prosemirror-transform: 1.8.0 prosemirror-view: 1.33.1 - '@tiptap/react@2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) - '@tiptap/extension-bubble-menu': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-floating-menu': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) + '@tiptap/extension-bubble-menu': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-floating-menu': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) '@tiptap/pm': 2.2.4 '@types/use-sync-external-store': 0.0.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.2.2(react@18.3.1) - '@tiptap/starter-kit@2.5.8(@tiptap/pm@2.2.4)': + '@tiptap/starter-kit@2.5.9(@tiptap/pm@2.2.4)': dependencies: - '@tiptap/core': 2.5.8(@tiptap/pm@2.2.4) - '@tiptap/extension-blockquote': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-bold': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-bullet-list': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-code': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-code-block': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-document': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-dropcursor': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-gapcursor': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-hard-break': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-heading': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-history': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-horizontal-rule': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) - '@tiptap/extension-italic': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-list-item': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-ordered-list': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-paragraph': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-strike': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) - '@tiptap/extension-text': 2.5.8(@tiptap/core@2.5.8(@tiptap/pm@2.2.4)) + '@tiptap/core': 2.5.9(@tiptap/pm@2.2.4) + '@tiptap/extension-blockquote': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-bold': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-bullet-list': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-code': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-code-block': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-document': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-dropcursor': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-gapcursor': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-hard-break': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-heading': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-history': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-horizontal-rule': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/pm@2.2.4) + '@tiptap/extension-italic': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-list-item': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-ordered-list': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-paragraph': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-strike': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) + '@tiptap/extension-text': 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4)) transitivePeerDependencies: - '@tiptap/pm' From 693e319e262ccbb87d4ae023b263c70bdec6bb60 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:37:19 +0000 Subject: [PATCH 13/42] chore(deps): update turbo monorepo to ^2.0.12 (#923) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 4 +- pnpm-lock.yaml | 94 ++++++++++++++++++------------------- tooling/eslint/package.json | 2 +- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/package.json b/package.json index a966aafae..6ed2f8651 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "@homarr/prettier-config": "workspace:^0.1.0", - "@turbo/gen": "^2.0.11", + "@turbo/gen": "^2.0.12", "@vitejs/plugin-react": "^4.3.1", "@vitest/coverage-v8": "^2.0.5", "@vitest/ui": "^2.0.5", @@ -38,7 +38,7 @@ "jsdom": "^24.1.1", "prettier": "^3.3.3", "testcontainers": "^10.11.0", - "turbo": "^2.0.11", + "turbo": "^2.0.12", "typescript": "^5.5.4", "vite-tsconfig-paths": "^4.3.2", "vitest": "^2.0.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c77b9029f..efee6d049 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: workspace:^0.1.0 version: link:tooling/prettier '@turbo/gen': - specifier: ^2.0.11 - version: 2.0.11(@types/node@20.14.14)(typescript@5.5.4) + specifier: ^2.0.12 + version: 2.0.12(@types/node@20.14.14)(typescript@5.5.4) '@vitejs/plugin-react': specifier: ^4.3.1 version: 4.3.1(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0)) @@ -36,8 +36,8 @@ importers: specifier: ^10.11.0 version: 10.11.0 turbo: - specifier: ^2.0.11 - version: 2.0.11 + specifier: ^2.0.12 + version: 2.0.12 typescript: specifier: ^5.5.4 version: 5.5.4 @@ -1431,8 +1431,8 @@ importers: specifier: ^9.1.0 version: 9.1.0(eslint@9.8.0) eslint-config-turbo: - specifier: ^2.0.11 - version: 2.0.11(eslint@9.8.0) + specifier: ^2.0.12 + version: 2.0.12(eslint@9.8.0) eslint-plugin-import: specifier: ^2.29.1 version: 2.29.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) @@ -2746,12 +2746,12 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@turbo/gen@2.0.11': - resolution: {integrity: sha512-9F2JvM2hwpPtTZii5CESVQZFquVlpEKM1F2JOQgyBnmuhyCylI7s/oz/v/G/reu8zO9NQy22MashkgUCpyV9Zg==} + '@turbo/gen@2.0.12': + resolution: {integrity: sha512-6+7pV6XypJY91i0j00E2EapR2eRnQw3xdl1CYgRhhp+m4apUPLAVS/Ya7Hq3IT4ow65Pbt7mHns/UQGz22m9cw==} hasBin: true - '@turbo/workspaces@2.0.11': - resolution: {integrity: sha512-/S1Q5lAGya+hKWO/iabN7a0vbXQwDac6am9r/CSmKbxvRwRVB2hNzcqLIx+xKmIj0N8GCK028CbgYOY3+SWXAw==} + '@turbo/workspaces@2.0.12': + resolution: {integrity: sha512-4AlT+cq+VoUmgcq9bAxUM7U9eJtStpF0LMyz4ch23o0c5XalyofEXA2WbvFTP9xaRvryjksK4h5RDB3Q8m7Bgw==} hasBin: true '@types/asn1@0.2.4': @@ -4018,8 +4018,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.0.11: - resolution: {integrity: sha512-hriQ+OQvKbtE1w7JH+w2X+Lh/9YPgnaNJmjrfhANWStFJTDa1NrJMCm2UaxHbDNKxFsr/mN9TTkVCRiTktIaqw==} + eslint-config-turbo@2.0.12: + resolution: {integrity: sha512-3PUzoyeJi2SjsTSjfWgTUIHK7kOqsapDEaOT7sCjFnZXvuhYLKxW37lysjq7+55abGGm0yQTXxNFLjrQKUORag==} peerDependencies: eslint: '>6.6.0' @@ -4075,8 +4075,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-turbo@2.0.11: - resolution: {integrity: sha512-cM2KRlC6zh8Y5pOpiGTkBMp3/V4f4sEebSYcHjotfc4VQziPXuZtf/4Si4pd6l1FpmYfkgE+AReZsRfEfK17bw==} + eslint-plugin-turbo@2.0.12: + resolution: {integrity: sha512-vXWKer7F0RPTcVy1B+hFTEK4mlEOpouB8MCAFD3WW4C6t98wvuDCsIPjxIldpxg7CnwmRxALpNWgNVkU2LVVEQ==} peerDependencies: eslint: '>6.6.0' @@ -6264,38 +6264,38 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.0.11: - resolution: {integrity: sha512-YlHEEhcm+jI1BSZoLugGHUWDfRXaNaQIv7tGQBfadYjo9kixBnqoTOU6s1ubOrQMID+lizZZQs79GXwqM6vohg==} + turbo-darwin-64@2.0.12: + resolution: {integrity: sha512-NAgfgbXxX/JScWQmmQnGbPuFZq7LIswHfcMk5JwyBXQM/xmklNOxxac7MnGGIOf19Z2f6S3qHy17VIj0SeGfnA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.0.11: - resolution: {integrity: sha512-K/YW+hWzRQ/wGmtffxllH4M1tgy8OlwgXODrIiAGzkSpZl9+pIsem/F86UULlhsIeavBYK/LS5+dzV3DPMjJ9w==} + turbo-darwin-arm64@2.0.12: + resolution: {integrity: sha512-cP02uer5KSJ+fXL+OfRRk5hnVjV0c60hxDgNcJxrZpfhun7HHoKDDR7w2xhQntiA45aC6ZZEXRqMKpj6GAmKbg==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.0.11: - resolution: {integrity: sha512-mv8CwGP06UPweMh1Vlp6PI6OWnkuibxfIJ4Vlof7xqjohAaZU5FLqeOeHkjQflH/6YrCVuS9wrK0TFOu+meTtA==} + turbo-linux-64@2.0.12: + resolution: {integrity: sha512-+mQgGfg1eq5qF+wenK/FKJaNMNAo5DQLC4htQy+8osW+fx6U+8+6UlPQPaycAWDEqwOI7NwuqkeHfkEQLQUTyQ==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.0.11: - resolution: {integrity: sha512-wLE5tl4oriTmHbuayc0ki0csaCplmVLj+uCWtecM/mfBuZgNS9ICNM9c4sB+Cfl5tlBBFeepqRNgvRvn8WeVZg==} + turbo-linux-arm64@2.0.12: + resolution: {integrity: sha512-KFyEZDXfPU1DK4zimxdCcqAcK7IIttX4mfsgB7NsSEOmH0dhHOih/YFYiyEDC1lTRx0C2RlzQ0Kjjdz48AN5Eg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.0.11: - resolution: {integrity: sha512-tja3zvVCSWu3HizOoeQv0qDJ+GeWGWRFOOM6a8i3BYnXLgGKAaDZFcjwzgC50tWiAw4aowIVR4OouwIyRhLBaQ==} + turbo-windows-64@2.0.12: + resolution: {integrity: sha512-kJj4KCkZTkDTDCqsSw1m1dbO4WeoQq1mYUm/thXOH0OkeqYbSMt0EyoTcJOgKUDsrMnzZD2gPfYrlYHtV69lVA==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.0.11: - resolution: {integrity: sha512-sYjXP6k94Bqh99R+y3M1Ks6LRIEZybMz+7enA8GKl6JJ2ZFaXxTnS6q+/2+ii1+rRwxohj5OBb4gxODcF8Jd4w==} + turbo-windows-arm64@2.0.12: + resolution: {integrity: sha512-TY3ROxguDilN2olCwcZMaePdW01Xhma0pZU7bNhsQEqca9RGAmsZBuzfGnTMcWPmv4tpnb/PlX1hrt1Hod/44Q==} cpu: [arm64] os: [win32] - turbo@2.0.11: - resolution: {integrity: sha512-imDlFFAvitbCm1JtDFJ6eG882qwxHUmVT2noPb3p2jq5o5DuXOchMbkVS9kUeC3/4WpY5N0GBZ3RvqNyjHZw1Q==} + turbo@2.0.12: + resolution: {integrity: sha512-8s2KwqjwQj7z8Z53SUZSKVkQOZ2/Sl4D2F440oaBY/k2lGju60dW6srEpnn8/RIDeICZmQn3pQHF79Jfnc5Skw==} hasBin: true tweetnacl@0.14.5: @@ -7793,9 +7793,9 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@2.0.11(@types/node@20.14.14)(typescript@5.5.4)': + '@turbo/gen@2.0.12(@types/node@20.14.14)(typescript@5.5.4)': dependencies: - '@turbo/workspaces': 2.0.11 + '@turbo/workspaces': 2.0.12 commander: 10.0.1 fs-extra: 10.1.0 inquirer: 8.2.6 @@ -7813,7 +7813,7 @@ snapshots: - supports-color - typescript - '@turbo/workspaces@2.0.11': + '@turbo/workspaces@2.0.12': dependencies: commander: 10.0.1 execa: 5.1.1 @@ -9417,10 +9417,10 @@ snapshots: dependencies: eslint: 9.8.0 - eslint-config-turbo@2.0.11(eslint@9.8.0): + eslint-config-turbo@2.0.12(eslint@9.8.0): dependencies: eslint: 9.8.0 - eslint-plugin-turbo: 2.0.11(eslint@9.8.0) + eslint-plugin-turbo: 2.0.12(eslint@9.8.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -9513,7 +9513,7 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.0.11(eslint@9.8.0): + eslint-plugin-turbo@2.0.12(eslint@9.8.0): dependencies: dotenv: 16.0.3 eslint: 9.8.0 @@ -11950,32 +11950,32 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo-darwin-64@2.0.11: + turbo-darwin-64@2.0.12: optional: true - turbo-darwin-arm64@2.0.11: + turbo-darwin-arm64@2.0.12: optional: true - turbo-linux-64@2.0.11: + turbo-linux-64@2.0.12: optional: true - turbo-linux-arm64@2.0.11: + turbo-linux-arm64@2.0.12: optional: true - turbo-windows-64@2.0.11: + turbo-windows-64@2.0.12: optional: true - turbo-windows-arm64@2.0.11: + turbo-windows-arm64@2.0.12: optional: true - turbo@2.0.11: + turbo@2.0.12: optionalDependencies: - turbo-darwin-64: 2.0.11 - turbo-darwin-arm64: 2.0.11 - turbo-linux-64: 2.0.11 - turbo-linux-arm64: 2.0.11 - turbo-windows-64: 2.0.11 - turbo-windows-arm64: 2.0.11 + turbo-darwin-64: 2.0.12 + turbo-darwin-arm64: 2.0.12 + turbo-linux-64: 2.0.12 + turbo-linux-arm64: 2.0.12 + turbo-windows-64: 2.0.12 + turbo-windows-arm64: 2.0.12 tweetnacl@0.14.5: {} diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index fd3550976..cc964f882 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -18,7 +18,7 @@ "dependencies": { "@next/eslint-plugin-next": "^14.2.5", "eslint-config-prettier": "^9.1.0", - "eslint-config-turbo": "^2.0.11", + "eslint-config-turbo": "^2.0.12", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.9.0", "eslint-plugin-react": "^7.35.0", From c4c4d41e4d7c37d498ba25c91a734a9d7f66f233 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Tue, 6 Aug 2024 21:43:12 +0200 Subject: [PATCH 14/42] feat: add support for app url variables (#915) * feat: add support for app url variables * fix: test not working * fix: format issue --- .../src/app/[locale]/manage/apps/page.tsx | 5 ++-- packages/auth/redirect.ts | 13 ++++------- packages/common/package.json | 6 +++-- packages/common/src/app-url/base.ts | 23 +++++++++++++++++++ packages/common/src/app-url/client.ts | 5 ++++ packages/common/src/app-url/server.ts | 8 +++++++ packages/common/src/client.ts | 1 + packages/common/src/server.ts | 1 + packages/common/src/url.ts | 15 ++++++++++++ packages/widgets/src/app/component.tsx | 11 ++++++--- packages/widgets/src/app/serverData.ts | 5 +++- .../widgets/src/app/test/serverData.spec.ts | 3 +++ pnpm-lock.yaml | 16 +++++++++++++ 13 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 packages/common/src/app-url/base.ts create mode 100644 packages/common/src/app-url/client.ts create mode 100644 packages/common/src/app-url/server.ts create mode 100644 packages/common/src/client.ts diff --git a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx index 2e6983b6e..7ddf2816a 100644 --- a/apps/nextjs/src/app/[locale]/manage/apps/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/apps/page.tsx @@ -4,6 +4,7 @@ import { IconApps, IconPencil } from "@tabler/icons-react"; import type { RouterOutputs } from "@homarr/api"; import { api } from "@homarr/api/server"; +import { parseAppHrefWithVariablesServer } from "@homarr/common/server"; import { getI18n, getScopedI18n } from "@homarr/translation/server"; import { ManageContainer } from "~/components/manage/manage-container"; @@ -69,8 +70,8 @@ const AppCard = async ({ app }: AppCardProps) => { )} {app.href && ( - - {app.href} + + {parseAppHrefWithVariablesServer(app.href)} )} diff --git a/packages/auth/redirect.ts b/packages/auth/redirect.ts index 4f3848981..94ed327a1 100644 --- a/packages/auth/redirect.ts +++ b/packages/auth/redirect.ts @@ -1,5 +1,7 @@ import type { ReadonlyHeaders } from "next/dist/server/web/spec-extension/adapters/headers"; +import { extractBaseUrlFromHeaders } from "@homarr/common"; + /** * The redirect_uri is constructed to work behind a reverse proxy. It is constructed from the headers x-forwarded-proto and x-forwarded-host. * @param headers @@ -11,16 +13,9 @@ export const createRedirectUri = (headers: ReadonlyHeaders | null, pathname: str return pathname; } - let protocol = headers.get("x-forwarded-proto") ?? "http"; - - // @see https://support.glitch.com/t/x-forwarded-proto-contains-multiple-protocols/17219 - if (protocol.includes(",")) { - protocol = protocol.includes("https") ? "https" : "http"; - } + const baseUrl = extractBaseUrlFromHeaders(headers); const path = pathname.startsWith("/") ? pathname : `/${pathname}`; - const host = headers.get("x-forwarded-host") ?? headers.get("host"); - - return `${protocol}://${host}${path}`; + return `${baseUrl}${path}`; }; diff --git a/packages/common/package.json b/packages/common/package.json index 100d1bea9..5d9f28f71 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -5,8 +5,9 @@ "type": "module", "exports": { ".": "./index.ts", + "./types": "./src/types.ts", "./server": "./src/server.ts", - "./types": "./src/types.ts" + "./client": "./src/client.ts" }, "typesVersions": { "*": { @@ -24,8 +25,9 @@ }, "dependencies": { "dayjs": "^1.11.12", + "next": "^14.2.5", "react": "^18.3.1", - "next": "^14.2.5" + "tldts": "^6.1.37" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/packages/common/src/app-url/base.ts b/packages/common/src/app-url/base.ts new file mode 100644 index 000000000..b189c9352 --- /dev/null +++ b/packages/common/src/app-url/base.ts @@ -0,0 +1,23 @@ +import * as tldts from "tldts"; + +const safeParseTldts = (url: string) => { + try { + return tldts.parse(url); + } catch { + return null; + } +}; + +export const parseAppHrefWithVariables = (url: TInput, currentHref: string): TInput => { + if (!url || url.length === 0) return url; + + const tldtsResult = safeParseTldts(currentHref); + + const urlObject = new URL(currentHref); + + return url + .replaceAll("[homarr_base]", `${urlObject.protocol}//${urlObject.hostname}`) + .replaceAll("[homarr_hostname]", tldtsResult?.hostname ?? "") + .replaceAll("[homarr_domain]", tldtsResult?.domain ?? "") + .replaceAll("[homarr_protocol]", urlObject.protocol.replace(":", "")) as TInput; +}; diff --git a/packages/common/src/app-url/client.ts b/packages/common/src/app-url/client.ts new file mode 100644 index 000000000..e3c08268b --- /dev/null +++ b/packages/common/src/app-url/client.ts @@ -0,0 +1,5 @@ +import { parseAppHrefWithVariables } from "./base"; + +export const parseAppHrefWithVariablesClient = (url: TInput): TInput => { + return parseAppHrefWithVariables(url, window.location.href); +}; diff --git a/packages/common/src/app-url/server.ts b/packages/common/src/app-url/server.ts new file mode 100644 index 000000000..1f4ff363d --- /dev/null +++ b/packages/common/src/app-url/server.ts @@ -0,0 +1,8 @@ +import { headers } from "next/headers"; + +import { extractBaseUrlFromHeaders } from "../url"; +import { parseAppHrefWithVariables } from "./base"; + +export const parseAppHrefWithVariablesServer = (url: TInput): TInput => { + return parseAppHrefWithVariables(url, extractBaseUrlFromHeaders(headers())); +}; diff --git a/packages/common/src/client.ts b/packages/common/src/client.ts new file mode 100644 index 000000000..ce5720136 --- /dev/null +++ b/packages/common/src/client.ts @@ -0,0 +1 @@ +export * from "./app-url/client"; diff --git a/packages/common/src/server.ts b/packages/common/src/server.ts index 549972b93..8916238d4 100644 --- a/packages/common/src/server.ts +++ b/packages/common/src/server.ts @@ -1 +1,2 @@ +export * from "./app-url/server"; export * from "./security"; diff --git a/packages/common/src/url.ts b/packages/common/src/url.ts index 5c46343ff..e734ae6e8 100644 --- a/packages/common/src/url.ts +++ b/packages/common/src/url.ts @@ -1,3 +1,5 @@ +import type { ReadonlyHeaders } from "next/dist/server/web/spec-extension/adapters/headers"; + export const appendPath = (url: URL | string, path: string) => { const newUrl = new URL(url); newUrl.pathname = removeTrailingSlash(newUrl.pathname) + path; @@ -7,3 +9,16 @@ export const appendPath = (url: URL | string, path: string) => { const removeTrailingSlash = (path: string) => { return path.at(-1) === "/" ? path.substring(0, path.length - 1) : path; }; + +export const extractBaseUrlFromHeaders = (headers: ReadonlyHeaders): `${string}://${string}` => { + let protocol = headers.get("x-forwarded-proto") ?? "http"; + + // @see https://support.glitch.com/t/x-forwarded-proto-contains-multiple-protocols/17219 + if (protocol.includes(",")) { + protocol = protocol.includes("https") ? "https" : "http"; + } + + const host = headers.get("x-forwarded-host") ?? headers.get("host"); + + return `${protocol}://${host}`; +}; diff --git a/packages/widgets/src/app/component.tsx b/packages/widgets/src/app/component.tsx index bff9ad604..cf9422832 100644 --- a/packages/widgets/src/app/component.tsx +++ b/packages/widgets/src/app/component.tsx @@ -8,6 +8,7 @@ import combineClasses from "clsx"; import type { RouterOutputs } from "@homarr/api"; import { clientApi } from "@homarr/api/client"; +import { parseAppHrefWithVariablesClient } from "@homarr/common/client"; import { useRegisterSpotlightActions } from "@homarr/spotlight"; import { useScopedI18n } from "@homarr/translation/client"; @@ -40,7 +41,7 @@ export default function AppWidget({ options, serverData, isEditMode, width }: Wi const shouldRunPing = Boolean(app?.href) && options.pingEnabled; clientApi.widget.app.updatedPing.useSubscription( - { url: app?.href ?? "" }, + { url: parseAppHrefWithVariablesClient(app?.href ?? "") }, { enabled: shouldRunPing, onData(data) { @@ -60,7 +61,7 @@ export default function AppWidget({ options, serverData, isEditMode, width }: Wi icon: app.iconUrl, group: "app", type: "link", - href: app.href, + href: parseAppHrefWithVariablesClient(app.href), openInNewTab: options.openInNewTab, }, ] @@ -92,7 +93,11 @@ export default function AppWidget({ options, serverData, isEditMode, width }: Wi } return ( - + let pingResult: RouterOutputs["widget"]["app"]["ping"] | null = null; if (app.href && options.pingEnabled) { - pingResult = await api.widget.app.ping({ url: app.href }); + pingResult = await api.widget.app.ping({ + url: parseAppHrefWithVariablesServer(app.href), + }); } return { app, pingResult }; diff --git a/packages/widgets/src/app/test/serverData.spec.ts b/packages/widgets/src/app/test/serverData.spec.ts index 2834eab58..999d7d1e8 100644 --- a/packages/widgets/src/app/test/serverData.spec.ts +++ b/packages/widgets/src/app/test/serverData.spec.ts @@ -30,6 +30,9 @@ vi.mock("@homarr/api/server", () => ({ }, }, })); +vi.mock("@homarr/common/server", () => ({ + parseAppHrefWithVariablesServer: () => "http://localhost", +})); describe("getServerDataAsync should load app and ping result", () => { test("when appId is empty it should return null for app and pingResult", async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efee6d049..cfac14700 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -636,6 +636,9 @@ importers: react: specifier: ^18.3.1 version: 18.3.1 + tldts: + specifier: ^6.1.37 + version: 6.1.37 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -6174,6 +6177,13 @@ packages: title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + tldts-core@6.1.37: + resolution: {integrity: sha512-q6M/RBjZcUoF/KRhHFuGrcnaXLaXH8kHKH/e8XaAd9ULGYYhB32kr1ceIXR77a57OxRB/NR471BcYwU7jf4PAg==} + + tldts@6.1.37: + resolution: {integrity: sha512-QMvNTwl3b3vyweq158Cf+IeEWe/P1HVDULo5n7qnt70rzkU3Ya2amaWO36lX0C8w6X3l92fftcuHwLIX9QBkZg==} + hasBin: true + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -11869,6 +11879,12 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + tldts-core@6.1.37: {} + + tldts@6.1.37: + dependencies: + tldts-core: 6.1.37 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 From a2be781f81465b32543b28dee7df8f1b0290f12a Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 20:09:19 +0000 Subject: [PATCH 15/42] fix(deps): update dependency tldts to ^6.1.38 (#931) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/common/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/common/package.json b/packages/common/package.json index 5d9f28f71..9f87095a6 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -27,7 +27,7 @@ "dayjs": "^1.11.12", "next": "^14.2.5", "react": "^18.3.1", - "tldts": "^6.1.37" + "tldts": "^6.1.38" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cfac14700..7e3a3dafd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -637,8 +637,8 @@ importers: specifier: ^18.3.1 version: 18.3.1 tldts: - specifier: ^6.1.37 - version: 6.1.37 + specifier: ^6.1.38 + version: 6.1.38 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -6177,11 +6177,11 @@ packages: title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} - tldts-core@6.1.37: - resolution: {integrity: sha512-q6M/RBjZcUoF/KRhHFuGrcnaXLaXH8kHKH/e8XaAd9ULGYYhB32kr1ceIXR77a57OxRB/NR471BcYwU7jf4PAg==} + tldts-core@6.1.38: + resolution: {integrity: sha512-TKmqyzXCha5k3WFSIW0ofB7W8BkUe1euZ1z9rZLckai5JxqndBt8CuWfusU9EB1qS5ycS+k9zf6Zs0bucKRDkg==} - tldts@6.1.37: - resolution: {integrity: sha512-QMvNTwl3b3vyweq158Cf+IeEWe/P1HVDULo5n7qnt70rzkU3Ya2amaWO36lX0C8w6X3l92fftcuHwLIX9QBkZg==} + tldts@6.1.38: + resolution: {integrity: sha512-1onihAOxYDzhsQXl9XMlDQSjdIgMAz3ugom3BdS4K71GbHmNmrRSR5PYFYIBoE4QBB0v1dPqj47D3o/2C9M+KQ==} hasBin: true tmp@0.0.33: @@ -11879,11 +11879,11 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 - tldts-core@6.1.37: {} + tldts-core@6.1.38: {} - tldts@6.1.37: + tldts@6.1.38: dependencies: - tldts-core: 6.1.37 + tldts-core: 6.1.38 tmp@0.0.33: dependencies: From d4c2bd2789c41e30a4602dc2c95e72f8f546fd88 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 01:53:06 +0000 Subject: [PATCH 16/42] chore(deps): update pnpm to v9.7.0 (#932) 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 6ed2f8651..97491d6ed 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "engines": { "node": ">=20.16.0" }, - "packageManager": "pnpm@9.6.0", + "packageManager": "pnpm@9.7.0", "scripts": { "build": "turbo build", "clean": "git clean -xdf node_modules", From 44712608b7e0dfcbaf5d36c40792b04f2edec8d7 Mon Sep 17 00:00:00 2001 From: Yossi Hillali Date: Wed, 7 Aug 2024 09:06:59 +0300 Subject: [PATCH 17/42] feat: AdGuard Home integration (#929) * feat: AdGuard Home integration * fix: code improvments * fix: a better errorMessages method --- packages/api/src/router/widgets/dns-hole.ts | 35 ++-- .../adguard-home/adguard-home-integration.ts | 150 ++++++++++++++++++ .../src/adguard-home/adguard-home-types.ts | 43 +++++ packages/integrations/src/base/creator.ts | 3 + packages/integrations/src/index.ts | 5 +- 5 files changed, 209 insertions(+), 27 deletions(-) create mode 100644 packages/integrations/src/adguard-home/adguard-home-integration.ts create mode 100644 packages/integrations/src/adguard-home/adguard-home-types.ts diff --git a/packages/api/src/router/widgets/dns-hole.ts b/packages/api/src/router/widgets/dns-hole.ts index ea6ebc375..f12c36edb 100644 --- a/packages/api/src/router/widgets/dns-hole.ts +++ b/packages/api/src/router/widgets/dns-hole.ts @@ -1,6 +1,6 @@ import { TRPCError } from "@trpc/server"; -import { PiHoleIntegration } from "@homarr/integrations"; +import { AdGuardHomeIntegration, PiHoleIntegration } from "@homarr/integrations"; import type { DnsHoleSummary } from "@homarr/integrations/types"; import { logger } from "@homarr/log"; import { createCacheChannel } from "@homarr/redis"; @@ -22,14 +22,9 @@ export const dnsHoleRouter = createTRPCRouter({ case "piHole": client = new PiHoleIntegration(integration); break; - // case 'adGuardHome': - // client = new AdGuardHomeIntegration(integration); - // break; - default: - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: `Unsupported integration type: ${integration.kind}`, - }); + case "adGuardHome": + client = new AdGuardHomeIntegration(integration); + break; } return await client.getSummaryAsync().catch((err) => { @@ -59,14 +54,9 @@ export const dnsHoleRouter = createTRPCRouter({ case "piHole": client = new PiHoleIntegration(ctx.integration); break; - // case 'adGuardHome': - // client = new AdGuardHomeIntegration(ctx.integration); - // break; - default: - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: `Unsupported integration type: ${ctx.integration.kind}`, - }); + case "adGuardHome": + client = new AdGuardHomeIntegration(ctx.integration); + break; } await client.enableAsync(); }), @@ -80,14 +70,9 @@ export const dnsHoleRouter = createTRPCRouter({ case "piHole": client = new PiHoleIntegration(ctx.integration); break; - // case 'adGuardHome': - // client = new AdGuardHomeIntegration(ctx.integration); - // break; - default: - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: `Unsupported integration type: ${ctx.integration.kind}`, - }); + case "adGuardHome": + client = new AdGuardHomeIntegration(ctx.integration); + break; } await client.disableAsync(input.duration); }), diff --git a/packages/integrations/src/adguard-home/adguard-home-integration.ts b/packages/integrations/src/adguard-home/adguard-home-integration.ts new file mode 100644 index 000000000..b60b3f69d --- /dev/null +++ b/packages/integrations/src/adguard-home/adguard-home-integration.ts @@ -0,0 +1,150 @@ +import { Integration } from "../base/integration"; +import { IntegrationTestConnectionError } from "../base/test-connection-error"; +import type { DnsHoleSummaryIntegration } from "../interfaces/dns-hole-summary/dns-hole-summary-integration"; +import type { DnsHoleSummary } from "../interfaces/dns-hole-summary/dns-hole-summary-types"; +import { filteringStatusSchema, statsResponseSchema, statusResponseSchema } from "./adguard-home-types"; + +export class AdGuardHomeIntegration extends Integration implements DnsHoleSummaryIntegration { + public async getSummaryAsync(): Promise { + const statsResponse = await fetch(`${this.integration.url}/control/stats`, { + headers: { + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + }); + + if (!statsResponse.ok) { + throw new Error( + `Failed to fetch stats for ${this.integration.name} (${this.integration.id}): ${statsResponse.statusText}`, + ); + } + + const statusResponse = await fetch(`${this.integration.url}/control/status`, { + headers: { + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + }); + + if (!statusResponse.ok) { + throw new Error( + `Failed to fetch status for ${this.integration.name} (${this.integration.id}): ${statusResponse.statusText}`, + ); + } + + const filteringStatusResponse = await fetch(`${this.integration.url}/control/filtering/status`, { + headers: { + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + }); + + if (!filteringStatusResponse.ok) { + throw new Error( + `Failed to fetch filtering status for ${this.integration.name} (${this.integration.id}): ${filteringStatusResponse.statusText}`, + ); + } + + const stats = statsResponseSchema.safeParse(await statsResponse.json()); + const status = statusResponseSchema.safeParse(await statusResponse.json()); + const filteringStatus = filteringStatusSchema.safeParse(await filteringStatusResponse.json()); + + const errorMessages: string[] = []; + if (!stats.success) { + errorMessages.push(`Stats parsing error: ${stats.error.message}`); + } + if (!status.success) { + errorMessages.push(`Status parsing error: ${status.error.message}`); + } + if (!filteringStatus.success) { + errorMessages.push(`Filtering status parsing error: ${filteringStatus.error.message}`); + } + if (!stats.success || !status.success || !filteringStatus.success) { + throw new Error( + `Failed to parse summary for ${this.integration.name} (${this.integration.id}):\n${errorMessages.join("\n")}`, + ); + } + + const blockedQueriesToday = + stats.data.time_units === "days" + ? (stats.data.blocked_filtering[stats.data.blocked_filtering.length - 1] ?? 0) + : stats.data.blocked_filtering.reduce((prev, sum) => prev + sum, 0); + const queriesToday = + stats.data.time_units === "days" + ? (stats.data.dns_queries[stats.data.dns_queries.length - 1] ?? 0) + : stats.data.dns_queries.reduce((prev, sum) => prev + sum, 0); + const countFilteredDomains = filteringStatus.data.filters + .filter((filter) => filter.enabled) + .reduce((sum, filter) => filter.rules_count + sum, 0); + + return { + status: status.data.protection_enabled ? ("enabled" as const) : ("disabled" as const), + adsBlockedToday: blockedQueriesToday, + adsBlockedTodayPercentage: (queriesToday / blockedQueriesToday) * 100, + domainsBeingBlocked: countFilteredDomains, + dnsQueriesToday: queriesToday, + }; + } + + public async testConnectionAsync(): Promise { + await super.handleTestConnectionResponseAsync({ + queryFunctionAsync: async () => { + return await fetch(`${this.integration.url}/control/status`, { + headers: { + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + }); + }, + handleResponseAsync: async (response) => { + try { + const result = (await response.json()) as unknown; + if (typeof result === "object" && result !== null) return; + } catch (error) { + throw new IntegrationTestConnectionError("invalidJson"); + } + + throw new IntegrationTestConnectionError("invalidCredentials"); + }, + }); + } + + public async enableAsync(): Promise { + const response = await fetch(`${this.integration.url}/control/protection`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + body: JSON.stringify({ + enabled: true, + }), + }); + if (!response.ok) { + throw new Error( + `Failed to enable AdGuard Home for ${this.integration.name} (${this.integration.id}): ${response.statusText}`, + ); + } + } + + public async disableAsync(duration?: number): Promise { + const response = await fetch(`${this.integration.url}/control/protection`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Basic ${this.getAuthorizationHeaderValue()}`, + }, + body: JSON.stringify({ + enabled: false, + duration: duration, + }), + }); + if (!response.ok) { + throw new Error( + `Failed to disable AdGuard Home for ${this.integration.name} (${this.integration.id}): ${response.statusText}`, + ); + } + } + + private getAuthorizationHeaderValue() { + const username = super.getSecretValue("username"); + const password = super.getSecretValue("password"); + return Buffer.from(`${username}:${password}`).toString("base64"); + } +} diff --git a/packages/integrations/src/adguard-home/adguard-home-types.ts b/packages/integrations/src/adguard-home/adguard-home-types.ts new file mode 100644 index 000000000..adc56b4d9 --- /dev/null +++ b/packages/integrations/src/adguard-home/adguard-home-types.ts @@ -0,0 +1,43 @@ +import { z } from "@homarr/validation"; + +export const statsResponseSchema = z.object({ + time_units: z.enum(["hours", "days"]), + top_queried_domains: z.array(z.record(z.string(), z.number())), + top_clients: z.array(z.record(z.string(), z.number())), + top_blocked_domains: z.array(z.record(z.string(), z.number())), + dns_queries: z.array(z.number()), + blocked_filtering: z.array(z.number()), + replaced_safebrowsing: z.array(z.number()), + replaced_parental: z.array(z.number()), + num_dns_queries: z.number().min(0), + num_blocked_filtering: z.number().min(0), + num_replaced_safebrowsing: z.number().min(0), + num_replaced_safesearch: z.number().min(0), + num_replaced_parental: z.number().min(0), + avg_processing_time: z.number().min(0), +}); + +export const statusResponseSchema = z.object({ + version: z.string(), + language: z.string(), + dns_addresses: z.array(z.string()), + dns_port: z.number().positive(), + http_port: z.number().positive(), + protection_disabled_duration: z.number(), + protection_enabled: z.boolean(), + dhcp_available: z.boolean(), + running: z.boolean(), +}); + +export const filteringStatusSchema = z.object({ + filters: z.array( + z.object({ + url: z.string(), + name: z.string(), + last_updated: z.string().optional(), + id: z.number().nonnegative(), + rules_count: z.number().nonnegative(), + enabled: z.boolean(), + }), + ), +}); diff --git a/packages/integrations/src/base/creator.ts b/packages/integrations/src/base/creator.ts index fb7106e89..53d91a046 100644 --- a/packages/integrations/src/base/creator.ts +++ b/packages/integrations/src/base/creator.ts @@ -1,5 +1,6 @@ import type { IntegrationKind } from "@homarr/definitions"; +import { AdGuardHomeIntegration } from "../adguard-home/adguard-home-integration"; import { HomeAssistantIntegration } from "../homeassistant/homeassistant-integration"; import { JellyfinIntegration } from "../jellyfin/jellyfin-integration"; import { SonarrIntegration } from "../media-organizer/sonarr/sonarr-integration"; @@ -10,6 +11,8 @@ export const integrationCreatorByKind = (kind: IntegrationKind, integration: Int switch (kind) { case "piHole": return new PiHoleIntegration(integration); + case "adGuardHome": + return new AdGuardHomeIntegration(integration); case "homeAssistant": return new HomeAssistantIntegration(integration); case "jellyfin": diff --git a/packages/integrations/src/index.ts b/packages/integrations/src/index.ts index 13267b54c..5a7dc7eb7 100644 --- a/packages/integrations/src/index.ts +++ b/packages/integrations/src/index.ts @@ -1,12 +1,13 @@ // General integrations -export { PiHoleIntegration } from "./pi-hole/pi-hole-integration"; +export { AdGuardHomeIntegration } from "./adguard-home/adguard-home-integration"; export { HomeAssistantIntegration } from "./homeassistant/homeassistant-integration"; export { JellyfinIntegration } from "./jellyfin/jellyfin-integration"; export { SonarrIntegration } from "./media-organizer/sonarr/sonarr-integration"; +export { PiHoleIntegration } from "./pi-hole/pi-hole-integration"; // Types export type { StreamSession } from "./interfaces/media-server/session"; // Helpers -export { IntegrationTestConnectionError } from "./base/test-connection-error"; export { integrationCreatorByKind } from "./base/creator"; +export { IntegrationTestConnectionError } from "./base/test-connection-error"; From c2bf6779c0664720a180192813ed4bfab02bf0e1 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 07:04:17 +0200 Subject: [PATCH 18/42] fix(deps): update dependency jotai to ^2.9.2 (#933) * fix(deps): update dependency jotai to ^2.9.2 * fix: lint issue --------- Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- apps/nextjs/package.json | 2 +- .../adguard-home/adguard-home-integration.ts | 2 +- packages/spotlight/package.json | 2 +- pnpm-lock.yaml | 48 +++++++++---------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 640d05682..1128ea948 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -56,7 +56,7 @@ "dotenv": "^16.4.5", "flag-icons": "^7.2.3", "glob": "^11.0.0", - "jotai": "^2.9.1", + "jotai": "^2.9.2", "mantine-react-table": "2.0.0-beta.6", "next": "^14.2.5", "postcss-preset-mantine": "^1.17.0", diff --git a/packages/integrations/src/adguard-home/adguard-home-integration.ts b/packages/integrations/src/adguard-home/adguard-home-integration.ts index b60b3f69d..a41070c78 100644 --- a/packages/integrations/src/adguard-home/adguard-home-integration.ts +++ b/packages/integrations/src/adguard-home/adguard-home-integration.ts @@ -96,7 +96,7 @@ export class AdGuardHomeIntegration extends Integration implements DnsHoleSummar try { const result = (await response.json()) as unknown; if (typeof result === "object" && result !== null) return; - } catch (error) { + } catch { throw new IntegrationTestConnectionError("invalidJson"); } diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 1226b9565..5908921b3 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -28,7 +28,7 @@ "@mantine/hooks": "^7.12.0", "@mantine/spotlight": "^7.12.0", "@tabler/icons-react": "^3.11.0", - "jotai": "^2.9.1", + "jotai": "^2.9.2", "next": "^14.2.5", "react": "^18.3.1", "use-deep-compare-effect": "^1.8.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e3a3dafd..0cd4962b7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: 2.0.12(@types/node@20.14.14)(typescript@5.5.4) '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0)) + version: 4.3.1(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) '@vitest/coverage-v8': specifier: ^2.0.5 - version: 2.0.5(vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0)) + version: 2.0.5(vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) '@vitest/ui': specifier: ^2.0.5 version: 2.0.5(vitest@2.0.5) @@ -43,10 +43,10 @@ importers: version: 5.5.4 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0)) + version: 4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) vitest: specifier: ^2.0.5 - version: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + version: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) apps/nextjs: dependencies: @@ -177,8 +177,8 @@ importers: specifier: ^11.0.0 version: 11.0.0 jotai: - specifier: ^2.9.1 - version: 2.9.1(@types/react@18.3.3)(react@18.3.1) + specifier: ^2.9.2 + version: 2.9.2(@types/react@18.3.3)(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.6 version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1156,8 +1156,8 @@ importers: specifier: ^3.11.0 version: 3.11.0(react@18.3.1) jotai: - specifier: ^2.9.1 - version: 2.9.1(@types/react@18.3.3)(react@18.3.1) + specifier: ^2.9.2 + version: 2.9.2(@types/react@18.3.3)(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -4766,8 +4766,8 @@ packages: jose@5.2.2: resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==} - jotai@2.9.1: - resolution: {integrity: sha512-t4Q7FIqQB3N/1art4OcqdlEtPmQ2h4DNIzTFhvt06WE0kCpQ1QoG+1A1IGTaQBi2KdDRsnywj+ojmHHKgw6PDA==} + jotai@2.9.2: + resolution: {integrity: sha512-jIBXEadOHCziOuMY6HAy2KQcHipGhnsbF+twqh8Lcmcz/Yei0gdBtW5mOYdKmbQxGqkvfvXM3w/oHtJ2WNGSFg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -8139,18 +8139,18 @@ snapshots: global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-react@4.3.1(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0))': + '@vitejs/plugin-react@4.3.1(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0))': dependencies: '@babel/core': 7.24.6 '@babel/plugin-transform-react-jsx-self': 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-react-jsx-source': 7.24.6(@babel/core@7.24.6) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0))': + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -8164,7 +8164,7 @@ snapshots: std-env: 3.7.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vitest: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) transitivePeerDependencies: - supports-color @@ -8203,7 +8203,7 @@ snapshots: pathe: 1.1.2 sirv: 2.0.4 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vitest: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) '@vitest/utils@2.0.5': dependencies: @@ -10293,7 +10293,7 @@ snapshots: jose@5.2.2: {} - jotai@2.9.1(@types/react@18.3.3)(react@18.3.1): + jotai@2.9.2(@types/react@18.3.3)(react@18.3.1): optionalDependencies: '@types/react': 18.3.3 react: 18.3.1 @@ -12210,13 +12210,13 @@ snapshots: dependencies: global: 4.4.0 - vite-node@2.0.5(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0): + vite-node@2.0.5(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) transitivePeerDependencies: - '@types/node' - less @@ -12227,18 +12227,18 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)): dependencies: debug: 4.3.4 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.4) optionalDependencies: - vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) transitivePeerDependencies: - supports-color - typescript - vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0): + vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0): dependencies: esbuild: 0.20.2 postcss: 8.4.38 @@ -12250,7 +12250,7 @@ snapshots: sugarss: 4.0.1(postcss@8.4.38) terser: 5.31.0 - vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0): + vitest@2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -12268,8 +12268,8 @@ snapshots: tinybench: 2.8.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) - vite-node: 2.0.5(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1)(terser@5.31.0) + vite: 5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) + vite-node: 2.0.5(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.14.14 From ac4b4ed9cf5fc815dd83dce5e3f9608b4aac07af Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 05:29:08 +0000 Subject: [PATCH 19/42] fix(deps): update dependency winston to v3.14.0 (#935) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/log/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/log/package.json b/packages/log/package.json index 52320fa60..2801ccf35 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -27,7 +27,7 @@ "dependencies": { "ioredis": "5.4.1", "superjson": "2.2.1", - "winston": "3.13.1" + "winston": "3.14.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cd4962b7..418a89554 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -974,8 +974,8 @@ importers: specifier: 2.2.1 version: 2.2.1 winston: - specifier: 3.13.1 - version: 3.13.1 + specifier: 3.14.0 + version: 3.14.0 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -6664,8 +6664,8 @@ packages: resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} engines: {node: '>= 12.0.0'} - winston@3.13.1: - resolution: {integrity: sha512-SvZit7VFNvXRzbqGHsv5KSmgbEYR5EiQfDAL9gxYkRqa934Hnk++zze0wANKtMHcy/gI4W/3xmSDwlhf865WGw==} + winston@3.14.0: + resolution: {integrity: sha512-XEJvmKJglhTW2TgfpKdkpj0119Yn5AClR7LJ0rBNUQFx20mNQj3s1ukTA1i77q+YBaHYbcKtXpxgPqfdUPCIYA==} engines: {node: '>= 12.0.0'} wordwrap@1.0.0: @@ -12417,7 +12417,7 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.13.1: + winston@3.14.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 From c399d832e58edce29b5bc657ff10970c50123a85 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 14:36:20 +0000 Subject: [PATCH 20/42] fix(deps): update dependency drizzle-orm to ^0.33.0 (#938) 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 2db0571f6..8801e4845 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -35,7 +35,7 @@ "@paralleldrive/cuid2": "^2.2.2", "@auth/core": "^0.34.2", "better-sqlite3": "^11.1.2", - "drizzle-orm": "^0.32.2", + "drizzle-orm": "^0.33.0", "dotenv": "^16.4.5", "mysql2": "3.11.0", "drizzle-kit": "^0.23.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 418a89554..7682cbd47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -822,8 +822,8 @@ importers: specifier: ^0.23.2 version: 0.23.2 drizzle-orm: - specifier: ^0.32.2 - version: 0.32.2(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) + specifier: ^0.33.0 + version: 0.33.0(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) mysql2: specifier: 3.11.0 version: 3.11.0 @@ -3811,8 +3811,8 @@ packages: resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} hasBin: true - drizzle-orm@0.32.2: - resolution: {integrity: sha512-3fXKzPzrgZIcnWCSLiERKN5Opf9Iagrag75snfFlKeKSYB1nlgPBshzW3Zn6dQymkyiib+xc4nIz0t8U+Xdpuw==} + drizzle-orm@0.33.0: + resolution: {integrity: sha512-SHy72R2Rdkz0LEq0PSG/IdvnT3nGiWuRk+2tXZQ90GVq/XQhpCzu/EFT3V2rox+w8MlkBQxifF8pCStNYnERfA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=3' @@ -9135,7 +9135,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.32.2(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1): + drizzle-orm@0.33.0(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1): optionalDependencies: '@prisma/client': 5.16.1 '@types/better-sqlite3': 7.6.11 From 940a4890e26a0c080fb084e6026c0438d9df6914 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 14:48:48 +0000 Subject: [PATCH 21/42] fix(deps): update dependency drizzle-kit to ^0.24.0 (#939) 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 8801e4845..d2e98128a 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -38,7 +38,7 @@ "drizzle-orm": "^0.33.0", "dotenv": "^16.4.5", "mysql2": "3.11.0", - "drizzle-kit": "^0.23.2" + "drizzle-kit": "^0.24.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7682cbd47..65ebb7562 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -819,8 +819,8 @@ importers: specifier: ^16.4.5 version: 16.4.5 drizzle-kit: - specifier: ^0.23.2 - version: 0.23.2 + specifier: ^0.24.0 + version: 0.24.0 drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@prisma/client@5.16.1)(@types/better-sqlite3@7.6.11)(@types/react@18.3.3)(better-sqlite3@11.1.2)(mysql2@3.11.0)(react@18.3.1) @@ -3807,8 +3807,8 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - drizzle-kit@0.23.2: - resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} + drizzle-kit@0.24.0: + resolution: {integrity: sha512-rUl5Rf5HLOVkAwHEVEi8xgulIRWzoys0q77RHGCxv5e9v8AI3JGFg7Ug5K1kn513RwNZbuNJMUKOXo0j8kPRgg==} hasBin: true drizzle-orm@0.33.0: @@ -9126,7 +9126,7 @@ snapshots: dotenv@16.4.5: {} - drizzle-kit@0.23.2: + drizzle-kit@0.24.0: dependencies: '@drizzle-team/brocli': 0.8.2 '@esbuild-kit/esm-loader': 2.6.5 From f9e2df085b2ba737c2ef6375474865b34a3f43cf Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:07:53 +0200 Subject: [PATCH 22/42] fix(deps): update tanstack-query monorepo to ^5.51.23 (#936) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 6 ++--- pnpm-lock.yaml | 54 ++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index 1128ea948..e8ea34330 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -39,9 +39,9 @@ "@mantine/tiptap": "^7.12.0", "@homarr/server-settings": "workspace:^0.1.0", "@t3-oss/env-nextjs": "^0.11.0", - "@tanstack/react-query": "^5.51.21", - "@tanstack/react-query-devtools": "^5.51.21", - "@tanstack/react-query-next-experimental": "5.51.21", + "@tanstack/react-query": "^5.51.23", + "@tanstack/react-query-devtools": "^5.51.23", + "@tanstack/react-query-next-experimental": "5.51.23", "@tabler/icons-react": "^3.11.0", "@trpc/client": "next", "@trpc/next": "next", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65ebb7562..420717144 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,23 +129,23 @@ importers: specifier: ^3.11.0 version: 3.11.0(react@18.3.1) '@tanstack/react-query': - specifier: ^5.51.21 - version: 5.51.21(react@18.3.1) + specifier: ^5.51.23 + version: 5.51.23(react@18.3.1) '@tanstack/react-query-devtools': - specifier: ^5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1) + specifier: ^5.51.23 + version: 5.51.23(@tanstack/react-query@5.51.23(react@18.3.1))(react@18.3.1) '@tanstack/react-query-next-experimental': - specifier: 5.51.21 - version: 5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1) + specifier: 5.51.23 + version: 5.51.23(@tanstack/react-query@5.51.23(react@18.3.1))(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1) '@trpc/client': specifier: next version: 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) '@trpc/next': specifier: next - version: 11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.477)(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.477)(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/react-query': specifier: next - version: 11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next version: 11.0.0-rc.477 @@ -479,7 +479,7 @@ importers: version: 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) '@trpc/react-query': specifier: next - version: 11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@trpc/server': specifier: next version: 11.0.0-rc.477 @@ -2468,21 +2468,21 @@ packages: '@tanstack/query-devtools@5.51.16': resolution: {integrity: sha512-ajwuq4WnkNCMj/Hy3KR8d3RtZ6PSKc1dD2vs2T408MdjgKzQ3klVoL6zDgVO7X+5jlb5zfgcO3thh4ojPhfIaw==} - '@tanstack/react-query-devtools@5.51.21': - resolution: {integrity: sha512-mi5ef8dvsS48GsG6/8M60O2EgrzPK1kNPngOcHBTlIUrB5dGkxP9fuHf05GQRxtSp5W5GlyeUpzOmtkKNpf9dQ==} + '@tanstack/react-query-devtools@5.51.23': + resolution: {integrity: sha512-XpHrdyfUPGULIyJ1K7UvhAcK+KjMJdw4NjmRjryoj3XEgfAU5qU1rz8gIFvGc3gTGT07yIseGo7GEll/ICfJfQ==} peerDependencies: - '@tanstack/react-query': ^5.51.21 + '@tanstack/react-query': ^5.51.23 react: ^18 || ^19 - '@tanstack/react-query-next-experimental@5.51.21': - resolution: {integrity: sha512-cS+OK8uM3xaiu3kqpHs2vq3jV5KOWviJIYQrJC18RPN/fnv72A2j6runggDDnW8ubVTPfO4ofidhRDxixygdYw==} + '@tanstack/react-query-next-experimental@5.51.23': + resolution: {integrity: sha512-5fPPLbnASRdea24AxdpMd3gs21q1ZB8ZsWDQDzrYih1SkaT3gADOixMsqM0l5MUvfj2O/u1ZcAizG/IA0EA1bw==} peerDependencies: - '@tanstack/react-query': ^5.51.21 + '@tanstack/react-query': ^5.51.23 next: ^13 || ^14 || ^15 react: ^18 || ^19 - '@tanstack/react-query@5.51.21': - resolution: {integrity: sha512-Q/V81x3sAYgCsxjwOkfLXfrmoG+FmDhLeHH5okC/Bp8Aaw2c33lbEo/mMcMnkxUPVtB2FLpzHT0tq3c+OlZEbw==} + '@tanstack/react-query@5.51.23': + resolution: {integrity: sha512-CfJCfX45nnVIZjQBRYYtvVMIsGgWLKLYC4xcUiYEey671n1alvTZoCBaU9B85O8mF/tx9LPyrI04A6Bs2THv4A==} peerDependencies: react: ^18.0.0 @@ -7529,19 +7529,19 @@ snapshots: '@tanstack/query-devtools@5.51.16': {} - '@tanstack/react-query-devtools@5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.51.23(@tanstack/react-query@5.51.23(react@18.3.1))(react@18.3.1)': dependencies: '@tanstack/query-devtools': 5.51.16 - '@tanstack/react-query': 5.51.21(react@18.3.1) + '@tanstack/react-query': 5.51.23(react@18.3.1) react: 18.3.1 - '@tanstack/react-query-next-experimental@5.51.21(@tanstack/react-query@5.51.21(react@18.3.1))(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': + '@tanstack/react-query-next-experimental@5.51.23(@tanstack/react-query@5.51.23(react@18.3.1))(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.51.21(react@18.3.1) + '@tanstack/react-query': 5.51.23(react@18.3.1) next: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) react: 18.3.1 - '@tanstack/react-query@5.51.21(react@18.3.1)': + '@tanstack/react-query@5.51.23(react@18.3.1)': dependencies: '@tanstack/query-core': 5.51.21 react: 18.3.1 @@ -7774,7 +7774,7 @@ snapshots: dependencies: '@trpc/server': 11.0.0-rc.477 - '@trpc/next@11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.477)(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/next@11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@trpc/server@11.0.0-rc.477)(next@14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@trpc/client': 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) '@trpc/server': 11.0.0-rc.477 @@ -7782,12 +7782,12 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@tanstack/react-query': 5.51.21(react@18.3.1) - '@trpc/react-query': 11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-query': 5.51.23(react@18.3.1) + '@trpc/react-query': 11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.21(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@trpc/react-query@11.0.0-rc.477(@tanstack/react-query@5.51.23(react@18.3.1))(@trpc/client@11.0.0-rc.477(@trpc/server@11.0.0-rc.477))(@trpc/server@11.0.0-rc.477)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/react-query': 5.51.21(react@18.3.1) + '@tanstack/react-query': 5.51.23(react@18.3.1) '@trpc/client': 11.0.0-rc.477(@trpc/server@11.0.0-rc.477) '@trpc/server': 11.0.0-rc.477 react: 18.3.1 From 365e267b8d7ba75e47af974dec6f427592095185 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 8 Aug 2024 20:36:51 +0200 Subject: [PATCH 23/42] fix: ping urls are not reset when restarting (#924) --- packages/cron-jobs-core/src/creator.ts | 6 ++++++ packages/cron-jobs/src/jobs/ping.ts | 9 ++++++++- packages/redis/src/lib/channel.ts | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/cron-jobs-core/src/creator.ts b/packages/cron-jobs-core/src/creator.ts index 7418ff158..62607377e 100644 --- a/packages/cron-jobs-core/src/creator.ts +++ b/packages/cron-jobs-core/src/creator.ts @@ -16,6 +16,7 @@ export interface CreateCronJobCreatorOptions { interface CreateCronJobOptions { runOnStart?: boolean; + beforeStart?: () => MaybePromise; } const createCallback = ( @@ -62,6 +63,11 @@ const createCallback = { +const resetPreviousUrlsAsync = async () => { + await pingUrlChannel.clearAsync(); + logger.info("Cleared previous ping urls"); +}; + +export const pingJob = createCronJob("ping", EVERY_MINUTE, { + beforeStart: resetPreviousUrlsAsync, +}).withCallback(async () => { const urls = await pingUrlChannel.getAllAsync(); for (const url of new Set(urls)) { diff --git a/packages/redis/src/lib/channel.ts b/packages/redis/src/lib/channel.ts index 0fd1b45f4..f707e20c0 100644 --- a/packages/redis/src/lib/channel.ts +++ b/packages/redis/src/lib/channel.ts @@ -77,6 +77,12 @@ export const createListChannel = (name: string) => { removeAsync: async (item: TItem) => { await getSetClient.lrem(listChannelName, 0, superjson.stringify(item)); }, + /** + * Clear all items from the channels list + */ + clearAsync: async () => { + await getSetClient.del(listChannelName); + }, /** * Add an item to the channels list * @param item item to add From 81946e50a9f643826f6c75ce2de54f92b74819bc Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 8 Aug 2024 20:37:41 +0200 Subject: [PATCH 24/42] feat: add duplication action for items (#926) --- .../components/board/items/item-actions.tsx | 37 +++++++++++++++++++ .../src/components/board/sections/content.tsx | 8 +++- packages/translation/src/lang/en.ts | 1 + 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/apps/nextjs/src/components/board/items/item-actions.tsx b/apps/nextjs/src/components/board/items/item-actions.tsx index 5fd6c0841..937ca6246 100644 --- a/apps/nextjs/src/components/board/items/item-actions.tsx +++ b/apps/nextjs/src/components/board/items/item-actions.tsx @@ -45,6 +45,10 @@ interface CreateItem { kind: WidgetKind; } +interface DuplicateItem { + itemId: string; +} + export const useItemActions = () => { const { updateBoard } = useUpdateBoard(); @@ -87,6 +91,38 @@ export const useItemActions = () => { [updateBoard], ); + const duplicateItem = useCallback( + ({ itemId }: DuplicateItem) => { + updateBoard((previous) => { + const itemToDuplicate = previous.sections + .flatMap((section) => section.items) + .find((item) => item.id === itemId); + + if (!itemToDuplicate) return previous; + + const newItem = { + ...itemToDuplicate, + id: createId(), + yOffset: undefined, + xOffset: undefined, + } satisfies Omit & { yOffset?: number; xOffset?: number }; + + return { + ...previous, + sections: previous.sections.map((section) => { + // Return same section if item is not in it + if (!section.items.some((item) => item.id === itemId)) return section; + return { + ...section, + items: section.items.concat(newItem as unknown as Item), + }; + }), + }; + }); + }, + [updateBoard], + ); + const updateItemOptions = useCallback( ({ itemId, newOptions }: UpdateItemOptions) => { updateBoard((previous) => { @@ -258,6 +294,7 @@ export const useItemActions = () => { updateItemOptions, updateItemAdvancedOptions, updateItemIntegrations, + duplicateItem, createItem, }; }; diff --git a/apps/nextjs/src/components/board/sections/content.tsx b/apps/nextjs/src/components/board/sections/content.tsx index d68e35df0..cae6e6fb0 100644 --- a/apps/nextjs/src/components/board/sections/content.tsx +++ b/apps/nextjs/src/components/board/sections/content.tsx @@ -2,7 +2,7 @@ import type { RefObject } from "react"; import { useEffect, useMemo, useRef } from "react"; import { ActionIcon, Card, Menu } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; -import { IconDotsVertical, IconLayoutKanban, IconPencil, IconTrash } from "@tabler/icons-react"; +import { IconCopy, IconDotsVertical, IconLayoutKanban, IconPencil, IconTrash } from "@tabler/icons-react"; import { QueryErrorResetBoundary } from "@tanstack/react-query"; import combineClasses from "clsx"; import { ErrorBoundary } from "react-error-boundary"; @@ -147,7 +147,8 @@ const ItemMenu = ({ const { openModal } = useModalAction(WidgetEditModal); const { openConfirmModal } = useConfirmModal(); const [isEditMode] = useEditMode(); - const { updateItemOptions, updateItemAdvancedOptions, updateItemIntegrations, removeItem } = useItemActions(); + const { updateItemOptions, updateItemAdvancedOptions, updateItemIntegrations, duplicateItem, removeItem } = + useItemActions(); const { data: integrationData, isPending } = clientApi.integration.all.useQuery(); const currentDefinition = useMemo(() => widgetImports[item.kind].definition, [item.kind]); @@ -216,6 +217,9 @@ const ItemMenu = ({ {tItem("action.edit")} }>{tItem("action.move")} + } onClick={() => duplicateItem({ itemId: item.id })}> + {tItem("action.duplicate")} + {t("common.dangerZone")} } onClick={openRemoveModal}> diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index 00aa2f60d..26e182939 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -662,6 +662,7 @@ export default { import: "Import item", edit: "Edit item", move: "Move item", + duplicate: "Duplicate item", remove: "Remove item", }, menu: { From 9258c397e0689bf46969614f3c634b5af20a2d8c Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 8 Aug 2024 20:38:17 +0200 Subject: [PATCH 25/42] fix: alert that certain fields in user settings are disabled is always shown (#928) * fix: alert that certain fields in user settings are disabled is always shown * fix: wrong inverted check --- .../app/[locale]/manage/users/[userId]/general/page.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 20099f17c..756554366 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 @@ -58,9 +58,11 @@ export default async function EditUserPage({ params }: Props) { return ( - }> - {t("management.page.user.fieldsDisabledExternalProvider")} - + {!isCredentialsUser && ( + }> + {t("management.page.user.fieldsDisabledExternalProvider")} + + )} {tGeneral("title")} From 013c0c0eebb3edec9f32a1e51f76751bd5da097d Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:29:52 +0200 Subject: [PATCH 26/42] chore(deps): update dependency vite-tsconfig-paths to v5 (#934) * chore(deps): update dependency vite-tsconfig-paths to v5 * fix: esm only issue --------- Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- package.json | 2 +- pnpm-lock.yaml | 12 ++++++------ vitest.config.ts => vitest.config.mts | 0 3 files changed, 7 insertions(+), 7 deletions(-) rename vitest.config.ts => vitest.config.mts (100%) diff --git a/package.json b/package.json index 97491d6ed..3a0457fba 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "testcontainers": "^10.11.0", "turbo": "^2.0.12", "typescript": "^5.5.4", - "vite-tsconfig-paths": "^4.3.2", + "vite-tsconfig-paths": "^5.0.0", "vitest": "^2.0.5" }, "prettier": "@homarr/prettier-config" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 420717144..7f06698ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: ^5.5.4 version: 5.5.4 vite-tsconfig-paths: - specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) + specifier: ^5.0.0 + version: 5.0.0(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) vitest: specifier: ^2.0.5 version: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) @@ -6518,8 +6518,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-tsconfig-paths@4.3.2: - resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + vite-tsconfig-paths@5.0.0: + resolution: {integrity: sha512-sCdKc6uC7ir102lW8deBiMnS0NGEs0100OJX8WZQmf3Uf7tJ/T3uQnzznq/tZWph7tkG+44JYOsKE7YTZjDn+Q==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -12227,9 +12227,9 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)): + vite-tsconfig-paths@5.0.0(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)): dependencies: - debug: 4.3.4 + debug: 4.3.5 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.4) optionalDependencies: diff --git a/vitest.config.ts b/vitest.config.mts similarity index 100% rename from vitest.config.ts rename to vitest.config.mts From a80b49a03e8174a1c4ae7e7abc8c9d32939946b6 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 21:43:04 +0200 Subject: [PATCH 27/42] fix(deps): update dependency @drizzle-team/brocli to ^0.10.0 (#937) * fix(deps): update dependency @drizzle-team/brocli to ^0.10.0 * fix: rename cliName to name --------- Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas --- packages/cli/package.json | 2 +- packages/cli/src/index.ts | 2 +- pnpm-lock.yaml | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 62706c30a..5eb09143f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -22,7 +22,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@drizzle-team/brocli": "^0.9.2", + "@drizzle-team/brocli": "^0.10.0", "@homarr/db": "workspace:^0.1.0", "@homarr/common": "workspace:^0.1.0", "@homarr/auth": "workspace:^0.1.0", diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index cdda88527..e84f7d202 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -5,6 +5,6 @@ import { resetPassword } from "./commands/reset-password"; const commands = [resetPassword]; void run(commands, { - cliName: "homarr-cli", + name: "homarr-cli", version: "1.0.0", }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f06698ef..8be7a160c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -594,8 +594,8 @@ importers: packages/cli: dependencies: '@drizzle-team/brocli': - specifier: ^0.9.2 - version: 0.9.2 + specifier: ^0.10.0 + version: 0.10.0 '@homarr/auth': specifier: workspace:^0.1.0 version: link:../auth @@ -1642,12 +1642,12 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@drizzle-team/brocli@0.10.0': + resolution: {integrity: sha512-razqxuTZizzm14gtockWvc3L0m320QuuzTgeNmX3e32dE5JWQ5jhb5tjnFpdkHFQGoYSDXrhEQgRPZ74kB+8cw==} + '@drizzle-team/brocli@0.8.2': resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} - '@drizzle-team/brocli@0.9.2': - resolution: {integrity: sha512-yOrIWbgYMTcXuG+4sTn5OX1UtNVmtHqIqlTyp7OpYOQgIIOjLUdiG8GBVmMOwV6qelcojDB/9MHOL0POIRLMug==} - '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} @@ -6930,9 +6930,9 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@drizzle-team/brocli@0.8.2': {} + '@drizzle-team/brocli@0.10.0': {} - '@drizzle-team/brocli@0.9.2': {} + '@drizzle-team/brocli@0.8.2': {} '@esbuild-kit/core-utils@3.3.2': dependencies: From 017c378582cca20688acac171bab803597d825b4 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 8 Aug 2024 22:02:36 +0200 Subject: [PATCH 28/42] fix: renovate approval run for all pull requests on every pull request change (#942) * fix: renovate approval run for all pull requests on every pull request change * fix: run approval only for renovate branches * fix: restrict actor to renovate bot --- .github/workflows/renovate-automatic-approval.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/renovate-automatic-approval.yml b/.github/workflows/renovate-automatic-approval.yml index 1185fd800..ee84a2263 100644 --- a/.github/workflows/renovate-automatic-approval.yml +++ b/.github/workflows/renovate-automatic-approval.yml @@ -2,10 +2,13 @@ name: "[Dependency Updates] Auto Approve" on: pull_request: types: [opened, synchronize] + branches: + - "renovate/**" jobs: approve-renovate-prs: runs-on: ubuntu-latest + if: github.actor == 'homarr-renovate[bot]' steps: - name: Checkout code uses: actions/checkout@v4 @@ -21,6 +24,4 @@ jobs: env: GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} run: | - for pr in $(gh pr list --author homarr-renovate[bot] --json number --jq .[].number); do - gh pr review $pr --approve --body "Automatically approved by GitHub Action" - done + gh pr review ${{github.event.pull_request.number}} --approve --body "Automatically approved by GitHub Action" From db9c200f890c70be6163b451e30f8950b676c2a1 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 20:26:50 +0000 Subject: [PATCH 29/42] fix(deps): update dependency winston to v3.14.1 (#941) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- packages/log/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/log/package.json b/packages/log/package.json index 2801ccf35..9ca182551 100644 --- a/packages/log/package.json +++ b/packages/log/package.json @@ -27,7 +27,7 @@ "dependencies": { "ioredis": "5.4.1", "superjson": "2.2.1", - "winston": "3.14.0" + "winston": "3.14.1" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8be7a160c..4f8dd5535 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -974,8 +974,8 @@ importers: specifier: 2.2.1 version: 2.2.1 winston: - specifier: 3.14.0 - version: 3.14.0 + specifier: 3.14.1 + version: 3.14.1 devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -6664,8 +6664,8 @@ packages: resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} engines: {node: '>= 12.0.0'} - winston@3.14.0: - resolution: {integrity: sha512-XEJvmKJglhTW2TgfpKdkpj0119Yn5AClR7LJ0rBNUQFx20mNQj3s1ukTA1i77q+YBaHYbcKtXpxgPqfdUPCIYA==} + winston@3.14.1: + resolution: {integrity: sha512-CJi4Il/msz8HkdDfXOMu+r5Au/oyEjFiOZzbX2d23hRLY0narGjqfE5lFlrT5hfYJhPtM8b85/GNFsxIML/RVA==} engines: {node: '>= 12.0.0'} wordwrap@1.0.0: @@ -12417,7 +12417,7 @@ snapshots: readable-stream: 3.6.2 triple-beam: 1.4.1 - winston@3.14.0: + winston@3.14.1: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 From c833f2cbf2560919f5e2381678a46d2d8d649854 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Thu, 8 Aug 2024 22:27:01 +0200 Subject: [PATCH 30/42] fix: github actor name for automatic approval wrong (#943) --- .github/workflows/renovate-automatic-approval.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate-automatic-approval.yml b/.github/workflows/renovate-automatic-approval.yml index ee84a2263..fe98f6f80 100644 --- a/.github/workflows/renovate-automatic-approval.yml +++ b/.github/workflows/renovate-automatic-approval.yml @@ -8,7 +8,7 @@ on: jobs: approve-renovate-prs: runs-on: ubuntu-latest - if: github.actor == 'homarr-renovate[bot]' + if: github.actor == 'homarr-renovate' steps: - name: Checkout code uses: actions/checkout@v4 From e18c773af944d22c6a90b60c4a3b98394ca4cea0 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 01:57:01 +0000 Subject: [PATCH 31/42] chore(deps): update dependency vite-tsconfig-paths to ^5.0.1 (#946) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3a0457fba..756177a24 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "testcontainers": "^10.11.0", "turbo": "^2.0.12", "typescript": "^5.5.4", - "vite-tsconfig-paths": "^5.0.0", + "vite-tsconfig-paths": "^5.0.1", "vitest": "^2.0.5" }, "prettier": "@homarr/prettier-config" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f8dd5535..389a00311 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: ^5.5.4 version: 5.5.4 vite-tsconfig-paths: - specifier: ^5.0.0 - version: 5.0.0(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) + specifier: ^5.0.1 + version: 5.0.1(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)) vitest: specifier: ^2.0.5 version: 2.0.5(@types/node@20.14.14)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0) @@ -6518,8 +6518,8 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-tsconfig-paths@5.0.0: - resolution: {integrity: sha512-sCdKc6uC7ir102lW8deBiMnS0NGEs0100OJX8WZQmf3Uf7tJ/T3uQnzznq/tZWph7tkG+44JYOsKE7YTZjDn+Q==} + vite-tsconfig-paths@5.0.1: + resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -12227,7 +12227,7 @@ snapshots: - supports-color - terser - vite-tsconfig-paths@5.0.0(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)): + vite-tsconfig-paths@5.0.1(typescript@5.5.4)(vite@5.2.6(@types/node@20.14.14)(sass@1.77.8)(sugarss@4.0.1(postcss@8.4.38))(terser@5.31.0)): dependencies: debug: 4.3.5 globrex: 0.1.2 From 21c0e4b35471071cd73472a116f42550a4b7a509 Mon Sep 17 00:00:00 2001 From: "homarr-renovate[bot]" <158783068+homarr-renovate[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 02:33:55 +0000 Subject: [PATCH 32/42] fix(deps): update dependency @tabler/icons-react to ^3.12.0 (#944) Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> --- apps/nextjs/package.json | 2 +- packages/notifications/package.json | 2 +- packages/spotlight/package.json | 2 +- packages/ui/package.json | 2 +- packages/widgets/package.json | 2 +- pnpm-lock.yaml | 46 ++++++++++++++--------------- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json index e8ea34330..a504c2383 100644 --- a/apps/nextjs/package.json +++ b/apps/nextjs/package.json @@ -42,7 +42,7 @@ "@tanstack/react-query": "^5.51.23", "@tanstack/react-query-devtools": "^5.51.23", "@tanstack/react-query-next-experimental": "5.51.23", - "@tabler/icons-react": "^3.11.0", + "@tabler/icons-react": "^3.12.0", "@trpc/client": "next", "@trpc/next": "next", "@trpc/react-query": "next", diff --git a/packages/notifications/package.json b/packages/notifications/package.json index 0b30c4a33..d157eeec1 100644 --- a/packages/notifications/package.json +++ b/packages/notifications/package.json @@ -24,7 +24,7 @@ "dependencies": { "@mantine/notifications": "^7.12.0", "@homarr/ui": "workspace:^0.1.0", - "@tabler/icons-react": "^3.11.0" + "@tabler/icons-react": "^3.12.0" }, "devDependencies": { "@homarr/eslint-config": "workspace:^0.2.0", diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 5908921b3..1f2dd31b4 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -27,7 +27,7 @@ "@mantine/core": "^7.12.0", "@mantine/hooks": "^7.12.0", "@mantine/spotlight": "^7.12.0", - "@tabler/icons-react": "^3.11.0", + "@tabler/icons-react": "^3.12.0", "jotai": "^2.9.2", "next": "^14.2.5", "react": "^18.3.1", diff --git a/packages/ui/package.json b/packages/ui/package.json index fee017f06..f0767beed 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -29,7 +29,7 @@ "@mantine/core": "^7.12.0", "@mantine/dates": "^7.12.0", "@mantine/hooks": "^7.12.0", - "@tabler/icons-react": "^3.11.0", + "@tabler/icons-react": "^3.12.0", "mantine-react-table": "2.0.0-beta.6", "next": "^14.2.5", "react": "^18.3.1" diff --git a/packages/widgets/package.json b/packages/widgets/package.json index f6f3d479f..7bf77cf8d 100644 --- a/packages/widgets/package.json +++ b/packages/widgets/package.json @@ -37,7 +37,7 @@ "@homarr/validation": "workspace:^0.1.0", "@mantine/hooks": "^7.12.0", "@mantine/core": "^7.12.0", - "@tabler/icons-react": "^3.11.0", + "@tabler/icons-react": "^3.12.0", "@tiptap/extension-color": "2.5.9", "@tiptap/extension-highlight": "2.5.9", "@tiptap/extension-image": "2.5.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 389a00311..72e6172f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,8 +126,8 @@ importers: specifier: ^0.11.0 version: 0.11.0(typescript@5.5.4)(zod@3.23.8) '@tabler/icons-react': - specifier: ^3.11.0 - version: 3.11.0(react@18.3.1) + specifier: ^3.12.0 + version: 3.12.0(react@18.3.1) '@tanstack/react-query': specifier: ^5.51.23 version: 5.51.23(react@18.3.1) @@ -181,7 +181,7 @@ importers: version: 2.9.2(@types/react@18.3.3)(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.12.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -1036,8 +1036,8 @@ importers: specifier: ^7.12.0 version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tabler/icons-react': - specifier: ^3.11.0 - version: 3.11.0(react@18.3.1) + specifier: ^3.12.0 + version: 3.12.0(react@18.3.1) devDependencies: '@homarr/eslint-config': specifier: workspace:^0.2.0 @@ -1153,8 +1153,8 @@ importers: specifier: ^7.12.0 version: 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tabler/icons-react': - specifier: ^3.11.0 - version: 3.11.0(react@18.3.1) + specifier: ^3.12.0 + version: 3.12.0(react@18.3.1) jotai: specifier: ^2.9.2 version: 2.9.2(@types/react@18.3.3)(react@18.3.1) @@ -1191,7 +1191,7 @@ importers: version: 1.11.12 mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.12.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-international: specifier: ^1.2.4 version: 1.2.4 @@ -1233,11 +1233,11 @@ importers: specifier: ^7.12.0 version: 7.12.0(react@18.3.1) '@tabler/icons-react': - specifier: ^3.11.0 - version: 3.11.0(react@18.3.1) + specifier: ^3.12.0 + version: 3.12.0(react@18.3.1) mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.12.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -1340,8 +1340,8 @@ importers: specifier: ^7.12.0 version: 7.12.0(react@18.3.1) '@tabler/icons-react': - specifier: ^3.11.0 - version: 3.11.0(react@18.3.1) + specifier: ^3.12.0 + version: 3.12.0(react@18.3.1) '@tiptap/extension-color': specifier: 2.5.9 version: 2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))(@tiptap/extension-text-style@2.5.9(@tiptap/core@2.5.9(@tiptap/pm@2.2.4))) @@ -1395,7 +1395,7 @@ importers: version: 1.11.12 mantine-react-table: specifier: 2.0.0-beta.6 - version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.12.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next: specifier: ^14.2.5 version: 14.2.5(@babel/core@7.24.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.8) @@ -2450,13 +2450,13 @@ packages: typescript: optional: true - '@tabler/icons-react@3.11.0': - resolution: {integrity: sha512-xHNBi9mns1slvqos+7LkP3ube4CjWrANMbxMaorzwzO9J/+y1sAEG/sN8CV8FmtpYW/9/gDR+OWCjjLLg0RmAw==} + '@tabler/icons-react@3.12.0': + resolution: {integrity: sha512-RnJl3HrCqInuC8JJEUxWuYP4OFNYnY2EUtBqZFSpYatPKY3AnvJBIrShJLHf3fiLPpo6xEYAIoB7Qow93JX0fQ==} peerDependencies: react: '>= 16' - '@tabler/icons@3.11.0': - resolution: {integrity: sha512-/vZinJNvCYhdAB+RUsyCpanSPuOEKHHIZi4Uu0Bw7ilewHnQhCWUPrT704uHCRli2ROl7spADPmWzAqOganA5A==} + '@tabler/icons@3.12.0': + resolution: {integrity: sha512-Im37ar/mQkqLb6XUXsU7nOc4/66VB9/3KLuZ+6tUsJKHHNLaDUkYfCTNG3pnGDI03laByxVf5+umSNK2yPTx8A==} '@tanstack/match-sorter-utils@8.15.1': resolution: {integrity: sha512-PnVV3d2poenUM31ZbZi/yXkBu3J7kd5k2u51CGwwNojag451AjTH9N6n41yjXz2fpLeewleyLBmNS6+HcGDlXw==} @@ -7514,12 +7514,12 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@tabler/icons-react@3.11.0(react@18.3.1)': + '@tabler/icons-react@3.12.0(react@18.3.1)': dependencies: - '@tabler/icons': 3.11.0 + '@tabler/icons': 3.12.0 react: 18.3.1 - '@tabler/icons@3.11.0': {} + '@tabler/icons@3.12.0': {} '@tanstack/match-sorter-utils@8.15.1': dependencies: @@ -10504,12 +10504,12 @@ snapshots: make-error@1.3.6: {} - mantine-react-table@2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.11.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mantine-react-table@2.0.0-beta.6(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/dates@7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(@tabler/icons-react@3.12.0(react@18.3.1))(clsx@2.1.1)(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@mantine/core': 7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/dates': 7.12.0(@mantine/core@7.12.0(@mantine/hooks@7.12.0(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@mantine/hooks@7.12.0(react@18.3.1))(dayjs@1.11.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mantine/hooks': 7.12.0(react@18.3.1) - '@tabler/icons-react': 3.11.0(react@18.3.1) + '@tabler/icons-react': 3.12.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) From ab7d3f8e4c82fcee9af6f79c70943633fec9af95 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 15:25:07 +0200 Subject: [PATCH 33/42] fix: renovate approval workflow not running (#948) --- .github/workflows/renovate-automatic-approval.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/renovate-automatic-approval.yml b/.github/workflows/renovate-automatic-approval.yml index fe98f6f80..97871968f 100644 --- a/.github/workflows/renovate-automatic-approval.yml +++ b/.github/workflows/renovate-automatic-approval.yml @@ -2,13 +2,11 @@ name: "[Dependency Updates] Auto Approve" on: pull_request: types: [opened, synchronize] - branches: - - "renovate/**" jobs: approve-renovate-prs: runs-on: ubuntu-latest - if: github.actor == 'homarr-renovate' + if: github.actor_id == 816230 # Id of renovate bot see https://github.com/organizations/homarr-labs/settings/apps/homarr-renovate steps: - name: Checkout code uses: actions/checkout@v4 From 25452ff063383397af6b5e41984657f9eb68e801 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 15:55:30 +0200 Subject: [PATCH 34/42] feat: change visibility in item options based on selected integration kinds (#949) --- packages/widgets/src/modals/widget-edit-modal.tsx | 13 +++++++++++-- packages/widgets/src/options.ts | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/widgets/src/modals/widget-edit-modal.tsx b/packages/widgets/src/modals/widget-edit-modal.tsx index 7a6f92042..574911492 100644 --- a/packages/widgets/src/modals/widget-edit-modal.tsx +++ b/packages/widgets/src/modals/widget-edit-modal.tsx @@ -92,8 +92,17 @@ export const WidgetEditModal = createModal>(({ actions, i {Object.entries(definition.options).map(([key, value]: [string, OptionsBuilderResult[string]]) => { const Input = getInputForType(value.type); - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (!Input || value.shouldHide?.(form.values.options as never)) { + if ( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + !Input || + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + value.shouldHide?.( + form.values.options as never, + innerProps.integrationData + .filter(({ id }) => form.values.integrationIds.includes(id)) + .map(({ kind }) => kind), + ) + ) { return null; } diff --git a/packages/widgets/src/options.ts b/packages/widgets/src/options.ts index d9d71d667..abe108dfb 100644 --- a/packages/widgets/src/options.ts +++ b/packages/widgets/src/options.ts @@ -1,5 +1,5 @@ import { objectEntries } from "@homarr/common"; -import type { WidgetKind } from "@homarr/definitions"; +import type { IntegrationKind, WidgetKind } from "@homarr/definitions"; import type { ZodType } from "@homarr/validation"; import { z } from "@homarr/validation"; @@ -123,7 +123,7 @@ export type inferOptionsFromDefinition = { }; interface FieldConfiguration { - shouldHide: (options: inferOptionsFromDefinition) => boolean; + shouldHide: (options: inferOptionsFromDefinition, integrationKinds: IntegrationKind[]) => boolean; } type ConfigurationInput = Partial< From 6dafbaae48f17ff519723fe33fc89034b10e8f1b Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 15:59:00 +0200 Subject: [PATCH 35/42] feat: add session expiry (#951) --- .../[locale]/_client-providers/session.tsx | 15 ++++++++++- packages/auth/callbacks.ts | 9 ++++--- packages/auth/configuration.ts | 5 ++-- packages/auth/env.mjs | 25 +++++++++++++++++++ packages/auth/session.ts | 1 - packages/auth/test/callbacks.spec.ts | 9 ++++++- turbo.json | 1 + 7 files changed, 56 insertions(+), 9 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/_client-providers/session.tsx b/apps/nextjs/src/app/[locale]/_client-providers/session.tsx index d4e0538db..a4622de94 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/session.tsx +++ b/apps/nextjs/src/app/[locale]/_client-providers/session.tsx @@ -1,14 +1,27 @@ "use client"; import type { PropsWithChildren } from "react"; +import { useEffect } from "react"; +import dayjs from "dayjs"; import type { Session } from "@homarr/auth"; -import { SessionProvider } from "@homarr/auth/client"; +import { SessionProvider, signIn } from "@homarr/auth/client"; interface AuthProviderProps { session: Session | null; } export const AuthProvider = ({ children, session }: PropsWithChildren) => { + useLoginRedirectOnSessionExpiry(session); return {children}; }; + +const useLoginRedirectOnSessionExpiry = (session: Session | null) => { + useEffect(() => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + if (!session) return () => {}; + //setTimeout doesn't allow for a number higher than 2147483647 (2³¹-1 , or roughly 24 days) + const timeout = setTimeout(() => void signIn(), Math.min(dayjs(session.expires).diff(), 2147483647)); + return () => clearTimeout(timeout); + }, [session]); +}; diff --git a/packages/auth/callbacks.ts b/packages/auth/callbacks.ts index b082e896a..90242b836 100644 --- a/packages/auth/callbacks.ts +++ b/packages/auth/callbacks.ts @@ -7,7 +7,8 @@ import { eq, inArray } from "@homarr/db"; import { groupMembers, groupPermissions } from "@homarr/db/schema/sqlite"; import { getPermissionsWithChildren } from "@homarr/definitions"; -import { expireDateAfter, generateSessionToken, sessionMaxAgeInSeconds, sessionTokenCookieName } from "./session"; +import { env } from "./env.mjs"; +import { expireDateAfter, generateSessionToken, sessionTokenCookieName } from "./session"; export const getCurrentUserPermissionsAsync = async (db: Database, userId: string) => { const dbGroupMembers = await db.query.groupMembers.findMany({ @@ -53,18 +54,18 @@ export const createSignInCallback = } const sessionToken = generateSessionToken(); - const sessionExpiry = expireDateAfter(sessionMaxAgeInSeconds); + const sessionExpires = expireDateAfter(env.AUTH_SESSION_EXPIRY_TIME); await adapter.createSession({ sessionToken, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion userId: user.id!, - expires: sessionExpiry, + expires: sessionExpires, }); cookies().set(sessionTokenCookieName, sessionToken, { path: "/", - expires: sessionExpiry, + expires: sessionExpires, httpOnly: true, sameSite: "lax", secure: true, diff --git a/packages/auth/configuration.ts b/packages/auth/configuration.ts index 0ee8ab302..32b8f4f26 100644 --- a/packages/auth/configuration.ts +++ b/packages/auth/configuration.ts @@ -7,12 +7,13 @@ import { db } from "@homarr/db"; import { adapter } from "./adapter"; import { createSessionCallback, createSignInCallback } from "./callbacks"; +import { env } from "./env.mjs"; import { createCredentialsConfiguration } from "./providers/credentials/credentials-provider"; import { EmptyNextAuthProvider } from "./providers/empty/empty-provider"; import { filterProviders } from "./providers/filter-providers"; import { OidcProvider } from "./providers/oidc/oidc-provider"; import { createRedirectUri } from "./redirect"; -import { sessionMaxAgeInSeconds, sessionTokenCookieName } from "./session"; +import { sessionTokenCookieName } from "./session"; export const createConfiguration = (isCredentialsRequest: boolean, headers: ReadonlyHeaders | null) => NextAuth({ @@ -43,7 +44,7 @@ export const createConfiguration = (isCredentialsRequest: boolean, headers: Read secret: "secret-is-not-defined-yet", // TODO: This should be added later session: { strategy: "database", - maxAge: sessionMaxAgeInSeconds, + maxAge: env.AUTH_SESSION_EXPIRY_TIME, }, pages: { signIn: "/auth/login", diff --git a/packages/auth/env.mjs b/packages/auth/env.mjs index 72f8fa396..1a15dd811 100644 --- a/packages/auth/env.mjs +++ b/packages/auth/env.mjs @@ -23,6 +23,29 @@ const authProvidersSchema = z ) .default("credentials"); +const createDurationSchema = (defaultValue) => + z + .string() + .regex(/^\d+[smhd]?$/) + .default(defaultValue) + .transform((duration) => { + const lastChar = duration[duration.length - 1]; + if (!isNaN(Number(lastChar))) { + return Number(defaultValue); + } + + const multipliers = { + s: 1, + m: 60, + h: 60 * 60, + d: 60 * 60 * 24, + }; + const numberDuration = Number(duration.slice(0, -1)); + const multiplier = multipliers[lastChar]; + + return numberDuration * multiplier; + }); + const booleanSchema = z .string() .default("false") @@ -39,6 +62,7 @@ const authProviders = skipValidation ? [] : authProvidersSchema.parse(process.en export const env = createEnv({ server: { + AUTH_SESSION_EXPIRY_TIME: createDurationSchema("30d"), AUTH_SECRET: process.env.NODE_ENV === "production" ? z.string().min(1) : z.string().min(1).optional(), AUTH_PROVIDERS: authProvidersSchema, ...(authProviders.includes("oidc") @@ -70,6 +94,7 @@ export const env = createEnv({ }, client: {}, runtimeEnv: { + AUTH_SESSION_EXPIRY_TIME: process.env.AUTH_SESSION_EXPIRY_TIME, AUTH_SECRET: process.env.AUTH_SECRET, AUTH_PROVIDERS: process.env.AUTH_PROVIDERS, AUTH_LDAP_BASE: process.env.AUTH_LDAP_BASE, diff --git a/packages/auth/session.ts b/packages/auth/session.ts index 249c3b1e1..48701ef0b 100644 --- a/packages/auth/session.ts +++ b/packages/auth/session.ts @@ -5,7 +5,6 @@ import type { Database } from "@homarr/db"; import { getCurrentUserPermissionsAsync } from "./callbacks"; -export const sessionMaxAgeInSeconds = 30 * 24 * 60 * 60; // 30 days export const sessionTokenCookieName = "next-auth.session-token"; export const expireDateAfter = (seconds: number) => { diff --git a/packages/auth/test/callbacks.spec.ts b/packages/auth/test/callbacks.spec.ts index db439fbc4..755b56fe8 100644 --- a/packages/auth/test/callbacks.spec.ts +++ b/packages/auth/test/callbacks.spec.ts @@ -132,6 +132,13 @@ const createAdapter = () => { type SessionExport = typeof import("../session"); const mockSessionToken = "e9ef3010-6981-4a81-b9d6-8495d09cf3b5"; const mockSessionExpiry = new Date("2023-07-01"); +vi.mock("../env.mjs", () => { + return { + env: { + AUTH_SESSION_EXPIRY_TIME: 60 * 60 * 24 * 7, + }, + }; +}); vi.mock("../session", async (importOriginal) => { const mod = await importOriginal(); @@ -185,7 +192,7 @@ describe("createSignInCallback", () => { expect(result).toBe(false); }); - it("should call adapter.createSession with correct input", async () => { + test("should call adapter.createSession with correct input", async () => { const adapter = createAdapter(); const isCredentialsRequest = true; const signInCallback = createSignInCallback(adapter, isCredentialsRequest); diff --git a/turbo.json b/turbo.json index 9be4b2792..9528e6d00 100644 --- a/turbo.json +++ b/turbo.json @@ -24,6 +24,7 @@ "AUTH_OIDC_AUTO_LOGIN", "AUTH_PROVIDERS", "AUTH_SECRET", + "AUTH_SESSION_EXPIRY_TIME", "CI", "DISABLE_REDIS_LOGS", "DB_URL", From 349c49462fdf29741910e036e4494909c13b6124 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 16:08:08 +0200 Subject: [PATCH 36/42] fix: redirect url from login not working (#952) --- apps/nextjs/src/app/[locale]/auth/login/page.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/auth/login/page.tsx b/apps/nextjs/src/app/[locale]/auth/login/page.tsx index 7823d050d..fb8472bd4 100644 --- a/apps/nextjs/src/app/[locale]/auth/login/page.tsx +++ b/apps/nextjs/src/app/[locale]/auth/login/page.tsx @@ -10,7 +10,7 @@ import { LoginForm } from "./_login-form"; interface LoginProps { searchParams: { - redirectAfterLogin?: string; + callbackUrl?: string; }; } @@ -18,7 +18,7 @@ export default async function Login({ searchParams }: LoginProps) { const session = await auth(); if (session) { - redirect(searchParams.redirectAfterLogin ?? "/"); + redirect(searchParams.callbackUrl ?? "/"); } const t = await getScopedI18n("user.page.login"); @@ -40,7 +40,7 @@ export default async function Login({ searchParams }: LoginProps) { providers={env.AUTH_PROVIDERS} oidcClientName={env.AUTH_OIDC_CLIENT_NAME} isOidcAutoLoginEnabled={env.AUTH_OIDC_AUTO_LOGIN} - callbackUrl={searchParams.redirectAfterLogin ?? "/"} + callbackUrl={searchParams.callbackUrl ?? "/"} /> From fcb72e67167d3549f4f5b35706cabb0ca155eb8e Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 18:28:52 +0200 Subject: [PATCH 37/42] feat: add column count and is public options to board creation modal (#930) * feat: add column count and is public options to board creation modal * test: adjust board creation test to match modified schema --- .../_components/create-board-button.tsx | 2 ++ .../manage/boards/add-board-modal.tsx | 31 ++++++++++++++----- packages/api/src/router/board.ts | 2 ++ packages/api/src/router/test/board.spec.ts | 6 ++-- packages/translation/src/lang/en.ts | 4 +++ packages/validation/src/board.ts | 2 +- 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx b/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx index 1c59db412..ed30fb23d 100644 --- a/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx +++ b/apps/nextjs/src/app/[locale]/manage/boards/_components/create-board-button.tsx @@ -30,6 +30,8 @@ export const CreateBoardButton = ({ boardNames }: CreateBoardButtonProps) => { onSuccess: async (values) => { await mutateAsync({ name: values.name, + columnCount: values.columnCount, + isPublic: values.isPublic, }); }, boardNames, diff --git a/apps/nextjs/src/components/manage/boards/add-board-modal.tsx b/apps/nextjs/src/components/manage/boards/add-board-modal.tsx index 1e1723edd..e3bf35f8a 100644 --- a/apps/nextjs/src/components/manage/boards/add-board-modal.tsx +++ b/apps/nextjs/src/components/manage/boards/add-board-modal.tsx @@ -1,31 +1,36 @@ -import { Button, Group, Stack, TextInput } from "@mantine/core"; +import { Button, Group, InputWrapper, Slider, Stack, Switch, TextInput } from "@mantine/core"; import { useZodForm } from "@homarr/form"; import { createModal } from "@homarr/modals"; import { useI18n } from "@homarr/translation/client"; -import { validation, z } from "@homarr/validation"; +import { validation } from "@homarr/validation"; import { createCustomErrorParams } from "@homarr/validation/form"; interface InnerProps { boardNames: string[]; - onSuccess: ({ name }: { name: string }) => Promise; + onSuccess: (props: { name: string; columnCount: number; isPublic: boolean }) => Promise; } export const AddBoardModal = createModal(({ actions, innerProps }) => { const t = useI18n(); const form = useZodForm( - z.object({ - name: validation.board.byName.shape.name.refine((value) => !innerProps.boardNames.includes(value), { - params: createCustomErrorParams("boardAlreadyExists"), - }), + validation.board.create.refine((value) => !innerProps.boardNames.includes(value.name), { + params: createCustomErrorParams("boardAlreadyExists"), + path: ["name"], }), { initialValues: { name: "", + columnCount: 10, + isPublic: false, }, }, ); + const columnCountChecks = validation.board.create.shape.columnCount._def.checks; + const minColumnCount = columnCountChecks.find((check) => check.kind === "min")?.value; + const maxColumnCount = columnCountChecks.find((check) => check.kind === "max")?.value; + return (
{ @@ -35,11 +40,21 @@ export const AddBoardModal = createModal(({ actions, innerProps }) = > + + + + + + - diff --git a/packages/api/src/router/board.ts b/packages/api/src/router/board.ts index f39a6ac1f..d4c42e44c 100644 --- a/packages/api/src/router/board.ts +++ b/packages/api/src/router/board.ts @@ -102,6 +102,8 @@ export const boardRouter = createTRPCRouter({ await transaction.insert(boards).values({ id: boardId, name: input.name, + isPublic: input.isPublic, + columnCount: input.columnCount, creatorId: ctx.session.user.id, }); await transaction.insert(sections).values({ diff --git a/packages/api/src/router/test/board.spec.ts b/packages/api/src/router/test/board.spec.ts index 5c121f91d..86e567965 100644 --- a/packages/api/src/router/test/board.spec.ts +++ b/packages/api/src/router/test/board.spec.ts @@ -294,12 +294,14 @@ describe("createBoard should create a new board", () => { }); // Act - await caller.createBoard({ name: "newBoard" }); + await caller.createBoard({ name: "newBoard", columnCount: 24, isPublic: true }); // Assert const dbBoard = await db.query.boards.findFirst(); expect(dbBoard).toBeDefined(); expect(dbBoard?.name).toBe("newBoard"); + expect(dbBoard?.columnCount).toBe(24); + expect(dbBoard?.isPublic).toBe(true); expect(dbBoard?.creatorId).toBe(defaultCreatorId); const dbSection = await db.query.sections.findFirst(); @@ -314,7 +316,7 @@ describe("createBoard should create a new board", () => { const caller = boardRouter.createCaller({ db, session: defaultSession }); // Act - const actAsync = async () => await caller.createBoard({ name: "newBoard" }); + const actAsync = async () => await caller.createBoard({ name: "newBoard", columnCount: 12, isPublic: true }); // Assert await expect(actAsync()).rejects.toThrowError("Permission denied"); diff --git a/packages/translation/src/lang/en.ts b/packages/translation/src/lang/en.ts index 26e182939..aa851a7c6 100644 --- a/packages/translation/src/lang/en.ts +++ b/packages/translation/src/lang/en.ts @@ -1201,6 +1201,10 @@ export default { name: { label: "Name", }, + isPublic: { + label: "Public", + description: "Public boards are accessible by everyone, even without an account.", + }, }, content: { metaTitle: "{boardName} board", diff --git a/packages/validation/src/board.ts b/packages/validation/src/board.ts index d8567cebb..c7eff93a6 100644 --- a/packages/validation/src/board.ts +++ b/packages/validation/src/board.ts @@ -61,7 +61,7 @@ const saveSchema = z.object({ sections: z.array(createSectionSchema(commonItemSchema)), }); -const createSchema = z.object({ name: boardNameSchema }); +const createSchema = z.object({ name: boardNameSchema, columnCount: z.number().min(1).max(24), isPublic: z.boolean() }); const permissionsSchema = z.object({ id: z.string(), From 67195c605139dfd4b3cd1e7d7e627752e71a7f1f Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 19:23:14 +0200 Subject: [PATCH 38/42] fix: wrong id for renovate auto approval (#957) --- .github/workflows/renovate-automatic-approval.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate-automatic-approval.yml b/.github/workflows/renovate-automatic-approval.yml index 97871968f..4f8020308 100644 --- a/.github/workflows/renovate-automatic-approval.yml +++ b/.github/workflows/renovate-automatic-approval.yml @@ -6,7 +6,7 @@ on: jobs: approve-renovate-prs: runs-on: ubuntu-latest - if: github.actor_id == 816230 # Id of renovate bot see https://github.com/organizations/homarr-labs/settings/apps/homarr-renovate + if: github.actor_id == 158783068 # Id of renovate bot see https://api.github.com/users/homarr-renovate%5Bbot%5D steps: - name: Checkout code uses: actions/checkout@v4 From 13e09968d928bc5e255dd3f93eca3d3e42f1b144 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 19:24:07 +0200 Subject: [PATCH 39/42] feat: add logout redirect url (#954) * feat: add logout redirect url * fix: format issue --- .../[locale]/_client-providers/session.tsx | 27 ++++++++++++++++--- apps/nextjs/src/app/[locale]/layout.tsx | 3 ++- .../src/components/user-avatar-menu.tsx | 6 +++++ packages/auth/env.mjs | 2 ++ turbo.json | 1 + 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/_client-providers/session.tsx b/apps/nextjs/src/app/[locale]/_client-providers/session.tsx index a4622de94..249299bbb 100644 --- a/apps/nextjs/src/app/[locale]/_client-providers/session.tsx +++ b/apps/nextjs/src/app/[locale]/_client-providers/session.tsx @@ -1,19 +1,38 @@ "use client"; +import { createContext, useContext, useEffect } from "react"; import type { PropsWithChildren } from "react"; -import { useEffect } from "react"; import dayjs from "dayjs"; import type { Session } from "@homarr/auth"; import { SessionProvider, signIn } from "@homarr/auth/client"; -interface AuthProviderProps { +interface AuthProviderProps extends AuthContextProps { session: Session | null; } -export const AuthProvider = ({ children, session }: PropsWithChildren) => { +export const AuthProvider = ({ children, session, logoutUrl }: PropsWithChildren) => { useLoginRedirectOnSessionExpiry(session); - return {children}; + + return ( + + {children} + + ); +}; + +interface AuthContextProps { + logoutUrl: string | undefined; +} + +const AuthContext = createContext(null); + +export const useAuthContext = () => { + const context = useContext(AuthContext); + + if (!context) throw new Error("useAuthContext must be used within an AuthProvider"); + + return context; }; const useLoginRedirectOnSessionExpiry = (session: Session | null) => { diff --git a/apps/nextjs/src/app/[locale]/layout.tsx b/apps/nextjs/src/app/[locale]/layout.tsx index 7b3a8d657..223ebf9be 100644 --- a/apps/nextjs/src/app/[locale]/layout.tsx +++ b/apps/nextjs/src/app/[locale]/layout.tsx @@ -8,6 +8,7 @@ import "~/styles/scroll-area.scss"; import { ColorSchemeScript, createTheme, MantineProvider } from "@mantine/core"; +import { env } from "@homarr/auth/env.mjs"; import { auth } from "@homarr/auth/next"; import { ModalProvider } from "@homarr/modals"; import { Notifications } from "@homarr/notifications"; @@ -56,7 +57,7 @@ export default function Layout(props: { children: React.ReactNode; params: { loc const StackedProvider = composeWrappers([ async (innerProps) => { const session = await auth(); - return ; + return ; }, (innerProps) => , (innerProps) => , diff --git a/apps/nextjs/src/components/user-avatar-menu.tsx b/apps/nextjs/src/components/user-avatar-menu.tsx index f8be743e6..6ac0f4bd7 100644 --- a/apps/nextjs/src/components/user-avatar-menu.tsx +++ b/apps/nextjs/src/components/user-avatar-menu.tsx @@ -23,6 +23,7 @@ import { useScopedI18n } from "@homarr/translation/client"; import "flag-icons/css/flag-icons.min.css"; +import { useAuthContext } from "~/app/[locale]/_client-providers/session"; import { LanguageCombobox } from "./language/language-combobox"; interface UserAvatarMenuProps { @@ -40,6 +41,7 @@ export const UserAvatarMenu = ({ children }: UserAvatarMenuProps) => { const session = useSession(); const router = useRouter(); + const { logoutUrl } = useAuthContext(); const { openModal } = useModalAction(LogoutModal); const handleSignout = useCallback(async () => { @@ -48,6 +50,10 @@ export const UserAvatarMenu = ({ children }: UserAvatarMenuProps) => { }); openModal({ onTimeout: () => { + if (logoutUrl) { + window.location.assign(logoutUrl); + return; + } router.refresh(); }, }); diff --git a/packages/auth/env.mjs b/packages/auth/env.mjs index 1a15dd811..d8f7b3121 100644 --- a/packages/auth/env.mjs +++ b/packages/auth/env.mjs @@ -62,6 +62,7 @@ const authProviders = skipValidation ? [] : authProvidersSchema.parse(process.en export const env = createEnv({ server: { + AUTH_LOGOUT_REDIRECT_URL: z.string().url().optional(), AUTH_SESSION_EXPIRY_TIME: createDurationSchema("30d"), AUTH_SECRET: process.env.NODE_ENV === "production" ? z.string().min(1) : z.string().min(1).optional(), AUTH_PROVIDERS: authProvidersSchema, @@ -94,6 +95,7 @@ export const env = createEnv({ }, client: {}, runtimeEnv: { + AUTH_LOGOUT_REDIRECT_URL: process.env.AUTH_LOGOUT_REDIRECT_URL, AUTH_SESSION_EXPIRY_TIME: process.env.AUTH_SESSION_EXPIRY_TIME, AUTH_SECRET: process.env.AUTH_SECRET, AUTH_PROVIDERS: process.env.AUTH_PROVIDERS, diff --git a/turbo.json b/turbo.json index 9528e6d00..67e69d087 100644 --- a/turbo.json +++ b/turbo.json @@ -22,6 +22,7 @@ "AUTH_LDAP_USER_MAIL_ATTRIBUTE", "AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG", "AUTH_OIDC_AUTO_LOGIN", + "AUTH_LOGOUT_REDIRECT_URL", "AUTH_PROVIDERS", "AUTH_SECRET", "AUTH_SESSION_EXPIRY_TIME", From f327837d82149c563b07e1d42850356930f20e50 Mon Sep 17 00:00:00 2001 From: Meier Lukas Date: Fri, 9 Aug 2024 19:24:50 +0200 Subject: [PATCH 40/42] feat: add user setting for home board (#956) --- .../_components/_change-home-board.tsx | 68 +++++++++++++++++++ .../_components/_profile-language-change.tsx | 12 ---- .../manage/users/[userId]/general/page.tsx | 21 +++++- packages/api/src/router/user.ts | 34 ++++++++++ packages/translation/src/lang/en.ts | 21 ++++++ packages/validation/src/user.ts | 5 ++ 6 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx delete mode 100644 apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_profile-language-change.tsx diff --git a/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx new file mode 100644 index 000000000..bbc8f308c --- /dev/null +++ b/apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx @@ -0,0 +1,68 @@ +"use client"; + +import { Button, Group, Select, Stack } from "@mantine/core"; + +import type { RouterOutputs } from "@homarr/api"; +import { clientApi } from "@homarr/api/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"; + +import { revalidatePathActionAsync } from "~/app/revalidatePathAction"; + +interface ChangeHomeBoardFormProps { + user: RouterOutputs["user"]["getById"]; + boardsData: { value: string; label: string }[]; +} + +export const ChangeHomeBoardForm = ({ user, boardsData }: ChangeHomeBoardFormProps) => { + const t = useI18n(); + const { mutate, isPending } = clientApi.user.changeHomeBoardId.useMutation({ + async onSettled() { + await revalidatePathActionAsync(`/manage/users/${user.id}`); + }, + onSuccess(_, variables) { + form.setInitialValues({ + homeBoardId: variables.homeBoardId, + }); + showSuccessNotification({ + message: t("user.action.changeHomeBoard.notification.success.message"), + }); + }, + onError() { + showErrorNotification({ + message: t("user.action.changeHomeBoard.notification.error.message"), + }); + }, + }); + const form = useZodForm(validation.user.changeHomeBoard, { + initialValues: { + homeBoardId: user.homeBoardId ?? "", + }, + }); + + const handleSubmit = (values: FormType) => { + mutate({ + userId: user.id, + ...values, + }); + }; + + return ( + + +