From 4bf4c6805cedc087958befd0617b791751fb65d8 Mon Sep 17 00:00:00 2001 From: chronark Date: Sun, 7 Sep 2025 14:39:19 +0200 Subject: [PATCH 01/12] feat: local first ratelimits --- .../_components/namespace-delete-dialog.tsx | 37 +- .../[namespaceId]/namespace-navbar.tsx | 34 +- .../settings/components/settings-client.tsx | 57 +- .../_components/create-namespace-button.tsx | 9 +- .../list/hooks/use-namespace-list-query.ts | 83 --- .../ratelimits/_components/list/index.tsx | 62 +- .../hooks/use-ratelimit-navigation.tsx | 127 ++-- .../navigation/sidebar/app-sidebar/index.tsx | 5 +- .../navigation/sidebar/team-switcher.tsx | 1 - apps/dashboard/lib/collections/index.ts | 78 +++ apps/dashboard/lib/trpc/routers/index.ts | 4 +- .../trpc/routers/ratelimit/namespaces_list.ts | 29 + .../ratelimit/query-namespaces/index.ts | 108 --- apps/dashboard/package.json | 3 + pnpm-lock.yaml | 618 ++++++++++++------ tools/migrate/main.ts | 64 -- 16 files changed, 662 insertions(+), 657 deletions(-) delete mode 100644 apps/dashboard/app/(app)/ratelimits/_components/list/hooks/use-namespace-list-query.ts create mode 100644 apps/dashboard/lib/collections/index.ts create mode 100644 apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts delete mode 100644 apps/dashboard/lib/trpc/routers/ratelimit/query-namespaces/index.ts delete mode 100644 tools/migrate/main.ts diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx index 6765297240..03d2ee3f77 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx @@ -1,8 +1,8 @@ "use client"; -import { trpc } from "@/lib/trpc/client"; +import { collection } from "@/lib/collections"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, DialogContainer, Input, toast } from "@unkey/ui"; +import { Button, DialogContainer, Input } from "@unkey/ui"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { z } from "zod"; @@ -20,7 +20,6 @@ type DeleteNamespaceProps = { onOpenChange: (value: boolean) => void; namespace: { id: string; - workspaceId: string; name: string; }; }; @@ -43,27 +42,19 @@ export const DeleteNamespaceDialog = ({ name: "", }, }); - const trpcUtils = trpc.useUtils(); const isValid = watch("name") === namespace.name; - const deleteNamespace = trpc.ratelimit.namespace.delete.useMutation({ - onSuccess() { - toast.success("Namespace Deleted", { - description: "Your namespace and all its overridden identifiers have been deleted.", - }); - trpcUtils.ratelimit.namespace.query.invalidate(); - router.push("/ratelimits"); - onOpenChange(false); - }, - onError(err) { - toast.error("Failed to delete namespace", { - description: err.message, - }); - }, - }); + + + + const onSubmit = async () => { - await deleteNamespace.mutateAsync({ namespaceId: namespace.id }); + collection.ratelimitNamespaces.delete(namespace.id) + router.push("/ratelimits"); + + + //await deleteNamespace.mutateAsync({ namespaceId: namespace.id }); }; return ( Delete Namespace @@ -92,8 +82,7 @@ export const DeleteNamespaceDialog = ({ >

Warning: - Deleting this namespace while it is in use may cause your current requests to fail. You will - lose access to analytical data. + Deleting this namespace while it is in use may cause your current requests to fail. You will lose access to analytical data.

diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx index c13edff2e7..b3e80a201b 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx @@ -3,7 +3,8 @@ import { QuickNavPopover } from "@/components/navbar-popover"; import { NavbarActionButton } from "@/components/navigation/action-button"; import { CopyableIDButton } from "@/components/navigation/copyable-id-button"; import { Navbar } from "@/components/navigation/navbar"; -import { trpc } from "@/lib/trpc/client"; +import { collection } from "@/lib/collections"; +import { useLiveQuery } from "@tanstack/react-db"; import { ChevronExpandY, Gauge, TaskUnchecked } from "@unkey/icons"; import dynamic from "next/dynamic"; import { useState } from "react"; @@ -27,17 +28,16 @@ type NamespaceNavbarProps = { export const NamespaceNavbar = ({ namespaceId, - includeOverrides = false, activePage, }: NamespaceNavbarProps) => { const [open, setOpen] = useState(false); - const { data, isLoading } = trpc.ratelimit.namespace.queryDetails.useQuery({ - namespaceId, - includeOverrides, - }); - if (!data || isLoading) { + const { data } = useLiveQuery((q) => q.from({ namespace: collection.ratelimitNamespaces })) + + + + if (!data) { return ( }> @@ -65,7 +65,7 @@ export const NamespaceNavbar = ({ ); } - const { namespace, ratelimitNamespaces } = data; + const namespace = data.find((ns) => ns.id === namespaceId); return ( <> @@ -73,20 +73,20 @@ export const NamespaceNavbar = ({ }> Ratelimits ({ + items={data.map((ns) => ({ id: ns.id, label: ns.name, href: `/ratelimits/${ns.id}`, }))} shortcutKey="N" > -
{namespace.name}
+
{namespace?.name}
@@ -95,22 +95,22 @@ export const NamespaceNavbar = ({ { id: "requests", label: "Requests", - href: `/ratelimits/${namespace.id}`, + href: `/ratelimits/${namespaceId}`, }, { id: "logs", label: "Logs", - href: `/ratelimits/${namespace.id}/logs`, + href: `/ratelimits/${namespaceId}/logs`, }, { id: "settings", label: "Settings", - href: `/ratelimits/${namespace.id}/settings`, + href: `/ratelimits/${namespaceId}/settings`, }, { id: "overrides", label: "Overrides", - href: `/ratelimits/${namespace.id}/overrides`, + href: `/ratelimits/${namespaceId}/overrides`, }, ]} shortcutKey="M" @@ -126,11 +126,11 @@ export const NamespaceNavbar = ({ setOpen(true)}> Override Identifier - +
{open && ( - + )} ); diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx index 5faaef4020..d57de20201 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx @@ -1,69 +1,51 @@ "use client"; -import { trpc } from "@/lib/trpc/client"; import { Button, CopyButton, Input, SettingCard, toast } from "@unkey/ui"; import { useEffect, useState } from "react"; import { DeleteNamespaceDialog } from "../../_components/namespace-delete-dialog"; import { SettingsClientSkeleton } from "./skeleton"; +import { useLiveQuery, eq } from "@tanstack/react-db"; +import { collection } from "@/lib/collections"; type Props = { namespaceId: string; }; export const SettingsClient = ({ namespaceId }: Props) => { - const trpcUtils = trpc.useUtils(); const [isNamespaceNameDeleteModalOpen, setIsNamespaceNameDeleteModalOpen] = useState(false); - const [isUpdating, setIsUpdating] = useState(false); - const { data, isLoading } = trpc.ratelimit.namespace.queryDetails.useQuery({ - namespaceId, - includeOverrides: false, - }); - const [namespaceName, setNamespaceName] = useState(data?.namespace.name || ""); + + const { data } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).where(({ namespace }) => eq(namespace.id, namespaceId))) + + const namespace = data.at(0) + + const [namespaceName, setNamespaceName] = useState(null); useEffect(() => { - if (data?.namespace.name && namespaceName === "") { - setNamespaceName(data.namespace.name); + if (namespaceName === null && namespace) { + setNamespaceName(namespace.name); } - }, [data?.namespace.name, namespaceName]); - - const updateNameMutation = trpc.ratelimit.namespace.update.name.useMutation({ - onSuccess() { - toast.success("Your namespace name has been renamed!"); - trpcUtils.ratelimit.namespace.query.invalidate(); - trpcUtils.ratelimit.namespace.queryDetails.invalidate(); - setIsUpdating(false); - }, - onError(err) { - toast.error("Failed to update namespace name", { - description: err.message, - }); - setIsUpdating(false); - }, - }); + + }, [namespace, namespaceName]); const handleUpdateName = async () => { - if (!data?.namespace) { + if (!namespace) { return; } - if (namespaceName === data.namespace.name || !namespaceName) { + if (namespaceName === namespace.name || !namespaceName) { return toast.error("Please provide a different name before saving."); } - setIsUpdating(true); - await updateNameMutation.mutateAsync({ - name: namespaceName, - namespaceId: data.namespace.id, - }); + collection.ratelimitNamespaces.update(namespace.id, draft => { draft.name = namespaceName }) + }; - if (!data || isLoading) { + if (!namespace) { return ; } - const { namespace } = data; return ( <>
@@ -94,7 +76,7 @@ export const SettingsClient = ({ namespaceId }: Props) => { > setNamespaceName(e.target.value)} /> @@ -103,8 +85,7 @@ export const SettingsClient = ({ namespaceId }: Props) => { className="h-full px-3.5 rounded-lg" size="lg" variant="primary" - loading={isUpdating} - disabled={isUpdating || namespaceName === namespace.name || !namespaceName} + disabled={namespaceName === namespace.name || !namespaceName} > Save diff --git a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx index f9f9d9ed9e..fd4a3c19e5 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx @@ -11,6 +11,7 @@ import { useState } from "react"; import type React from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; +import { collection } from "@/lib/collections"; const formSchema = z.object({ name: z @@ -31,7 +32,6 @@ export const CreateNamespaceButton = ({ }: React.ButtonHTMLAttributes) => { const [isOpen, setIsOpen] = useState(false); - const { ratelimit } = trpc.useUtils(); const { register, @@ -48,7 +48,6 @@ export const CreateNamespaceButton = ({ async onSuccess(res) { router.refresh(); await revalidate("/ratelimits"); - ratelimit.namespace.query.invalidate(); router.push(`/ratelimits/${res.id}`); toast.success("Your Namespace has been created"); setIsOpen(false); @@ -59,7 +58,11 @@ export const CreateNamespaceButton = ({ }); const onSubmit = (values: FormValues) => { - create.mutate(values); + collection.ratelimitNamespaces.insert({ + id: new Date().toISOString(), + name: values.name, + }) + setIsOpen(false) }; return ( diff --git a/apps/dashboard/app/(app)/ratelimits/_components/list/hooks/use-namespace-list-query.ts b/apps/dashboard/app/(app)/ratelimits/_components/list/hooks/use-namespace-list-query.ts deleted file mode 100644 index ab2e8d804f..0000000000 --- a/apps/dashboard/app/(app)/ratelimits/_components/list/hooks/use-namespace-list-query.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { trpc } from "@/lib/trpc/client"; -import { useEffect, useMemo, useState } from "react"; - -import { useNamespaceListFilters } from "../../hooks/use-namespace-list-filters"; -import { - namespaceListFilterFieldConfig, - namespaceListFilterFieldNames, -} from "../../namespace-list-filters.schema"; -import type { NamespaceListInputSchema, RatelimitNamespace } from "../namespace-list.schema"; - -export function useNamespaceListQuery() { - const [totalCount, setTotalCount] = useState(0); - const [namespacesMap, setNamespacesMap] = useState(() => new Map()); - const { filters } = useNamespaceListFilters(); - - const namespaces = useMemo(() => Array.from(namespacesMap.values()), [namespacesMap]); - - const queryParams = useMemo(() => { - const params: NamespaceListInputSchema = { - ...Object.fromEntries(namespaceListFilterFieldNames.map((field) => [field, []])), - }; - - filters.forEach((filter) => { - if (!namespaceListFilterFieldNames.includes(filter.field) || !params[filter.field]) { - return; - } - - const fieldConfig = namespaceListFilterFieldConfig[filter.field]; - const validOperators = fieldConfig.operators; - - if (!validOperators.includes(filter.operator)) { - throw new Error("Invalid operator"); - } - - if (typeof filter.value === "string") { - params[filter.field]?.push({ - operator: filter.operator, - value: filter.value, - }); - } - }); - - return params; - }, [filters]); - - const { - data: namespaceData, - hasNextPage, - fetchNextPage, - isFetchingNextPage, - isLoading: isLoadingInitial, - } = trpc.ratelimit.namespace.query.useInfiniteQuery(queryParams, { - getNextPageParam: (lastPage) => lastPage.nextCursor, - refetchOnMount: false, - refetchOnWindowFocus: false, - }); - - useEffect(() => { - if (namespaceData) { - const newMap = new Map(); - namespaceData.pages.forEach((page) => { - page.namespaceList.forEach((namespace) => { - newMap.set(namespace.id, namespace); - }); - }); - - if (namespaceData.pages.length > 0) { - setTotalCount(namespaceData.pages[0].total); - } - - setNamespacesMap(newMap); - } - }, [namespaceData]); - - return { - namespaces, - isLoading: isLoadingInitial, - hasMore: hasNextPage, - loadMore: fetchNextPage, - isLoadingMore: isFetchingNextPage, - totalCount, - }; -} diff --git a/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx b/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx index a6b11aed2e..62d92bda44 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx @@ -1,12 +1,9 @@ -import { LoadMoreFooter } from "@/components/virtual-table/components/loading-indicator"; import { Bookmark } from "@unkey/icons"; import { Button, CopyButton, Empty } from "@unkey/ui"; -import { useNamespaceListQuery } from "./hooks/use-namespace-list-query"; import { NamespaceCard } from "./namespace-card"; -import { NamespaceCardSkeleton } from "./skeletons"; +import { useLiveQuery } from "@tanstack/react-db"; +import { collection } from "@/lib/collections"; -const MAX_SKELETON_COUNT = 10; -const MINIMUM_DISPLAY_LIMIT = 10; const EXAMPLE_SNIPPET = `curl -XPOST 'https://api.unkey.dev/v2/ratelimits.limit' \\ -H 'Content-Type: application/json' \\ @@ -19,21 +16,12 @@ const EXAMPLE_SNIPPET = `curl -XPOST 'https://api.unkey.dev/v2/ratelimits.limit' }'`; export const NamespaceList = () => { - const { namespaces, isLoading, totalCount, hasMore, loadMore, isLoadingMore } = - useNamespaceListQuery(); - if (isLoading) { - return ( -
-
- {Array.from({ length: MAX_SKELETON_COUNT }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: skeleton items don't need stable keys - - ))} -
-
- ); - } + const { data: namespaces } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).orderBy(({ namespace }) => namespace.id, 'desc') + + ) + + if (namespaces.length === 0) { return ( @@ -67,35 +55,13 @@ export const NamespaceList = () => { } return ( - <> -
-
- {namespaces.map((namespace) => ( - - ))} -
+
+
+ {namespaces.map((namespace) => ( + + ))}
- {totalCount > MINIMUM_DISPLAY_LIMIT ? ( - - Viewing - {namespaces.length} - of - {totalCount} - Namespaces -
- } - /> - ) : null} - +
+ ); }; diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx index 5fbea9d555..3fd3d16e53 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/hooks/use-ratelimit-navigation.tsx @@ -1,7 +1,8 @@ "use client"; import type { NavItem } from "@/components/navigation/sidebar/workspace-navigations"; -import { trpc } from "@/lib/trpc/client"; +import { collection } from "@/lib/collections"; +import { useLiveQuery } from "@tanstack/react-db"; import { ArrowDottedRotateAnticlockwise, ArrowOppositeDirectionY, @@ -14,69 +15,63 @@ import { useMemo } from "react"; export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { const segments = useSelectedLayoutSegments() ?? []; - const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = - trpc.ratelimit.namespace.query.useInfiniteQuery( - { query: [] }, - { - getNextPageParam: (lastPage) => lastPage.nextCursor, - }, - ); + const { data } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).orderBy(({ namespace }) => namespace.id, 'desc') + + ) // Convert ratelimit namespaces data to navigation items with sub-items const ratelimitNavItems = useMemo(() => { - if (!data?.pages) { + if (data.length === 0) { return []; } - return data.pages.flatMap((page) => - page.namespaceList.map((namespace) => { - const currentNamespaceActive = - segments.at(0) === "ratelimits" && segments.at(1) === namespace.id; - - const isExactlyRatelimitRoot = currentNamespaceActive && segments.length === 2; - - // Create sub-items for logs, settings, and overrides - const subItems: NavItem[] = [ - { - icon: ArrowOppositeDirectionY, - href: `/ratelimits/${namespace.id}`, - label: "Requests", - active: isExactlyRatelimitRoot || (currentNamespaceActive && !segments.at(2)), - }, - { - icon: Layers3, - href: `/ratelimits/${namespace.id}/logs`, - label: "Logs", - active: currentNamespaceActive && segments.at(2) === "logs", - }, - { - icon: Gear, - href: `/ratelimits/${namespace.id}/settings`, - label: "Settings", - active: currentNamespaceActive && segments.at(2) === "settings", - }, - { - icon: ArrowDottedRotateAnticlockwise, - href: `/ratelimits/${namespace.id}/overrides`, - label: "Overrides", - active: currentNamespaceActive && segments.at(2) === "overrides", - }, - ]; - - // Create the main namespace nav item - const namespaceNavItem: NavItem = { - icon: null, - href: `/ratelimits/${namespace.id}`, - label: namespace.name, - active: currentNamespaceActive, - // Include sub-items - items: subItems, - }; + return data.map((namespace) => { + const currentNamespaceActive = + segments.at(0) === "ratelimits" && segments.at(1) === namespace.id; + + const isExactlyRatelimitRoot = currentNamespaceActive && segments.length === 2; - return namespaceNavItem; - }), - ); - }, [data?.pages, segments]); + // Create sub-items for logs, settings, and overrides + const subItems: NavItem[] = [ + { + icon: ArrowOppositeDirectionY, + href: `/ratelimits/${namespace.id}`, + label: "Requests", + active: isExactlyRatelimitRoot || (currentNamespaceActive && !segments.at(2)), + }, + { + icon: Layers3, + href: `/ratelimits/${namespace.id}/logs`, + label: "Logs", + active: currentNamespaceActive && segments.at(2) === "logs", + }, + { + icon: Gear, + href: `/ratelimits/${namespace.id}/settings`, + label: "Settings", + active: currentNamespaceActive && segments.at(2) === "settings", + }, + { + icon: ArrowDottedRotateAnticlockwise, + href: `/ratelimits/${namespace.id}/overrides`, + label: "Overrides", + active: currentNamespaceActive && segments.at(2) === "overrides", + }, + ]; + + // Create the main namespace nav item + const namespaceNavItem: NavItem = { + icon: null, + href: `/ratelimits/${namespace.id}`, + label: namespace.name, + active: currentNamespaceActive, + // Include sub-items + items: subItems, + }; + + return namespaceNavItem; + }) + }, [data, segments]); const enhancedNavItems = useMemo(() => { const items = [...baseNavItems]; @@ -86,31 +81,15 @@ export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { const ratelimitsItem = { ...items[ratelimitsItemIndex] }; ratelimitsItem.items = [...(ratelimitsItem.items || []), ...ratelimitNavItems]; - if (hasNextPage) { - ratelimitsItem.items?.push({ - icon: () => null, - href: "#load-more-ratelimits", - label:
More
, - active: false, - loadMoreAction: true, - }); - } items[ratelimitsItemIndex] = ratelimitsItem; } return items; - }, [baseNavItems, ratelimitNavItems, hasNextPage]); + }, [baseNavItems, ratelimitNavItems]); - const loadMore = () => { - if (!isFetchingNextPage && hasNextPage) { - fetchNextPage(); - } - }; return { enhancedNavItems, - isLoading, - loadMore, }; }; diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx index 82bd61ae2b..b1b1deb4f7 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx @@ -84,7 +84,7 @@ export function AppSidebar({ const { enhancedNavItems: apiAddedNavItems, loadMore: loadMoreApis } = useApiNavigation(baseNavItems); - const { enhancedNavItems: ratelimitAddedNavItems, loadMore: loadMoreRatelimits } = + const { enhancedNavItems: ratelimitAddedNavItems } = useRatelimitNavigation(apiAddedNavItems); const { enhancedNavItems: projectAddedNavItems, loadMore: loadMoreProjects } = @@ -105,7 +105,6 @@ export function AppSidebar({ (item: NavItem & { loadMoreAction?: boolean }) => { const loadMoreMap = { "#load-more-projects": loadMoreProjects, - "#load-more-ratelimits": loadMoreRatelimits, "#load-more-apis": loadMoreApis, }; @@ -117,7 +116,7 @@ export function AppSidebar({ console.error(`Unknown load more action for href: ${item.href}`); } }, - [loadMoreApis, loadMoreRatelimits, loadMoreProjects], + [loadMoreApis, loadMoreProjects], ); const toggleNavItem: NavItem = useMemo( () => ({ diff --git a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx index 39ea5d90da..b4a41e75a9 100644 --- a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx +++ b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx @@ -67,7 +67,6 @@ export const WorkspaceSwitcher: React.FC = (props): JSX.Element => { // refresh the check mark by invalidating the current user's org data utils.user.getCurrentUser.invalidate(); utils.api.overview.query.invalidate(); - utils.ratelimit.namespace.query.invalidate(); // reload data router.replace("/"); diff --git a/apps/dashboard/lib/collections/index.ts b/apps/dashboard/lib/collections/index.ts new file mode 100644 index 0000000000..c45cbb0c4e --- /dev/null +++ b/apps/dashboard/lib/collections/index.ts @@ -0,0 +1,78 @@ +import type { Router } from "@/lib/trpc/routers"; +import { QueryClient } from "@tanstack/query-core"; +import { queryCollectionOptions } from "@tanstack/query-db-collection"; +import { createCollection, createOptimisticAction } from "@tanstack/react-db"; +import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; +import superjson from "superjson"; + +const queryClient = new QueryClient(); + + + + +// Create vanilla TRPC client for one-time calls +const trpcClient = createTRPCProxyClient({ + transformer: superjson, + links: [ + httpBatchLink({ + url: "/api/trpc", + fetch(url, options) { + return fetch(url, { + ...options, + credentials: "include", + }); + }, + }), + ], +}); + + +const ratelimitNamespaces = createCollection( + queryCollectionOptions({ + queryClient, + queryKey: ["ratelimitNamespaces"], + queryFn: async () => { + console.info("DB fetching ratelimitNamespaces") + return await trpcClient.ratelimit.namespace.list.query(); + }, + getKey: (item) => item.id, + onInsert: async ({ transaction }) => { + const { changes: newNamespace } = transaction.mutations[0] + await trpcClient.ratelimit.namespace.create.mutate({ name: newNamespace.name! }); + }, + onUpdate: async ({ transaction }) => { + const { original, modified } = transaction.mutations[0]; + await trpcClient.ratelimit.namespace.update.name.mutate({ + namespaceId: original.id, + name: modified.name! + }) + }, + onDelete: async ({ transaction }) => { + + const { original } = transaction.mutations[0]; + await trpcClient.ratelimit.namespace.delete.mutate({ namespaceId: original.id }); + return { refetch: true } + + }, + + }), +); + +export const collection = { + ratelimitNamespaces, +}; + + +export const createRatelimitNamespace = createOptimisticAction<{ name: string }>({ + onMutate: (args) => { + ratelimitNamespaces.insert({ + id: Date.now().toString(), + name: args.name, + + }) + }, + mutationFn: async (args) => { + + await trpcClient.ratelimit.namespace.create.mutate({ name: args.name }); + } +}) diff --git a/apps/dashboard/lib/trpc/routers/index.ts b/apps/dashboard/lib/trpc/routers/index.ts index 6d6cb7c8b1..bbd241cd15 100644 --- a/apps/dashboard/lib/trpc/routers/index.ts +++ b/apps/dashboard/lib/trpc/routers/index.ts @@ -92,7 +92,7 @@ import { queryRatelimitLastUsed } from "./ratelimit/query-last-used-times"; import { queryRatelimitLatencyTimeseries } from "./ratelimit/query-latency-timeseries"; import { queryRatelimitLogs } from "./ratelimit/query-logs"; import { queryRatelimitWorkspaceDetails } from "./ratelimit/query-namespace-details"; -import { queryRatelimitNamespaces } from "./ratelimit/query-namespaces"; +import { listRatelimitNamespaces } from "./ratelimit/namespaces_list"; import { queryRatelimitOverviewLogs } from "./ratelimit/query-overview-logs"; import { queryRatelimitTimeseries } from "./ratelimit/query-timeseries"; import { updateNamespaceName } from "./ratelimit/updateNamespaceName"; @@ -261,8 +261,8 @@ export const router = t.router({ }), }), namespace: t.router({ + list: listRatelimitNamespaces, queryRatelimitLastUsed, - query: queryRatelimitNamespaces, queryDetails: queryRatelimitWorkspaceDetails, search: searchNamespace, create: createNamespace, diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts b/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts new file mode 100644 index 0000000000..a02c39174d --- /dev/null +++ b/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts @@ -0,0 +1,29 @@ +import { db } from "@/lib/db"; +import { ratelimit, requireUser, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; + +import { TRPCError } from "@trpc/server"; + +export const listRatelimitNamespaces = t.procedure + .use(requireUser) + .use(requireWorkspace) + .use(withRatelimit(ratelimit.read)) + .query(async ({ ctx }) => { + try { + return await db.query.ratelimitNamespaces.findMany({ + where: (table, { eq, and, isNull }) => and(eq(table.workspaceId, ctx.workspace.id), isNull(table.deletedAtM)), + columns: { + id: true, + name: true, + } + }) + } catch (error) { + console.error( + "Something went wrong when fetching ratelimit namespaces", + JSON.stringify(error), + ); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to fetch ratelimit namespaces", + }); + } + }); diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/query-namespaces/index.ts b/apps/dashboard/lib/trpc/routers/ratelimit/query-namespaces/index.ts deleted file mode 100644 index 121b50e4c1..0000000000 --- a/apps/dashboard/lib/trpc/routers/ratelimit/query-namespaces/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - type CursorType, - type NamespaceListInputSchema, - type NamespaceListOutputSchema, - namespaceListInputSchema, - namespaceListOutputSchema, -} from "@/app/(app)/ratelimits/_components/list/namespace-list.schema"; -import { and, db, desc, eq, isNull, like, lt, schema, sql } from "@/lib/db"; -import { ratelimit, requireUser, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; -import { TRPCError } from "@trpc/server"; - -const LIMIT = 9; -export const queryRatelimitNamespaces = t.procedure - .use(requireUser) - .use(requireWorkspace) - .use(withRatelimit(ratelimit.read)) - .input(namespaceListInputSchema) - .output(namespaceListOutputSchema) - .query(async ({ ctx, input }) => { - try { - const result = await fetchRatelimitNamespaces({ - workspaceId: ctx.workspace.id, - limit: LIMIT, - cursor: input.cursor, - nameQuery: input.query, - }); - return result; - } catch (error) { - console.error( - "Something went wrong when fetching ratelimit namespaces", - JSON.stringify(error), - ); - throw new TRPCError({ - code: "INTERNAL_SERVER_ERROR", - message: "Failed to fetch ratelimit namespaces", - }); - } - }); - -export type RatelimitNamespaceOptions = { - workspaceId: string; - limit: number; - cursor?: CursorType; - nameQuery?: NamespaceListInputSchema["query"]; -}; - -export async function fetchRatelimitNamespaces({ - workspaceId, - limit, - cursor, - nameQuery, -}: RatelimitNamespaceOptions): Promise { - // Build base conditions - const baseConditions = [ - eq(schema.ratelimitNamespaces.workspaceId, workspaceId), - isNull(schema.ratelimitNamespaces.deletedAtM), - ]; - - // Add name query conditions - if (nameQuery?.length) { - const filter = nameQuery[0]; - if (filter.operator === "contains") { - baseConditions.push(like(schema.ratelimitNamespaces.name, `%${filter.value}%`)); - } - } - - const whereClause = and(...baseConditions); - - // Get total count - const totalResult = await db - .select({ count: sql`count(*)` }) - .from(schema.ratelimitNamespaces) - .where(whereClause); - - const total = Number(totalResult[0]?.count || 0); - - // Build query conditions (includes cursor) - const queryConditions = [...baseConditions]; - - if (cursor) { - queryConditions.push(lt(schema.ratelimitNamespaces.id, cursor.id)); - } - - const namespaces = await db - .select({ - id: schema.ratelimitNamespaces.id, - name: schema.ratelimitNamespaces.name, - }) - .from(schema.ratelimitNamespaces) - .where(and(...queryConditions)) - .orderBy(desc(schema.ratelimitNamespaces.id)) - .limit(limit + 1); - - const hasMore = namespaces.length > limit; - const namespaceItems = hasMore ? namespaces.slice(0, limit) : namespaces; - - const nextCursor: CursorType | undefined = - hasMore && namespaceItems.length > 0 - ? { id: namespaceItems[namespaceItems.length - 1].id } - : undefined; - - return { - namespaceList: namespaceItems, - hasMore, - nextCursor, - total, - }; -} diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 6bf89a0e7d..6d5f53df47 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -35,6 +35,9 @@ "@radix-ui/react-use-controllable-state": "^1.2.2", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/typography": "^0.5.12", + "@tanstack/query-core": "^5.87.1", + "@tanstack/query-db-collection": "^0.2.11", + "@tanstack/react-db": "^0.1.12", "@tanstack/react-query": "^4.36.1", "@tanstack/react-table": "^8.16.0", "@tanstack/react-virtual": "^3.10.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20e9011b57..ea8fff975e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -144,7 +144,7 @@ importers: version: 1.2.5(react-dom@18.3.1)(react@18.3.1) '@hookform/resolvers': specifier: ^3.3.4 - version: 3.3.4(react-hook-form@7.51.3) + version: 3.4.2(react-hook-form@7.51.3) '@planetscale/database': specifier: ^1.16.0 version: 1.19.0 @@ -211,6 +211,15 @@ importers: '@tailwindcss/typography': specifier: ^0.5.12 version: 0.5.12(tailwindcss@3.4.15) + '@tanstack/query-core': + specifier: ^5.87.1 + version: 5.87.1 + '@tanstack/query-db-collection': + specifier: ^0.2.11 + version: 0.2.11(@tanstack/query-core@5.87.1)(typescript@5.7.3) + '@tanstack/react-db': + specifier: ^0.1.12 + version: 0.1.12(react@18.3.1)(typescript@5.7.3) '@tanstack/react-query': specifier: ^4.36.1 version: 4.36.1(react-dom@18.3.1)(react@18.3.1) @@ -581,13 +590,13 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: ^4.20241022.0 - version: 4.20241022.0 + version: 4.20250909.0 typescript: specifier: ^5.0.4 version: 5.7.3 wrangler: specifier: ^4.10.0 - version: 4.10.0(@cloudflare/workers-types@4.20241022.0) + version: 4.10.0(@cloudflare/workers-types@4.20250909.0) internal/billing: dependencies: @@ -599,7 +608,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8) + version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8) zod: specifier: 3.23.8 version: 3.23.8 @@ -867,7 +876,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(eslint@9.34.0) + version: 2.1.1(eslint@9.35.0) resend: specifier: ^4.4.0 version: 4.4.0(react-dom@18.3.1)(react@18.3.1) @@ -916,7 +925,7 @@ importers: version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.0.3 version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -925,7 +934,7 @@ importers: version: 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@unkey/icons': specifier: workspace:^ version: link:../icons @@ -1264,7 +1273,7 @@ packages: resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} engines: {node: '>=14.13.1'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 dev: true @@ -1573,18 +1582,22 @@ packages: '@babel/types': 7.28.2 dev: false - /@babel/parser@7.28.3: - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + /@babel/parser@7.28.4: + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 dev: false /@babel/runtime@7.28.3: resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} engines: {node: '>=6.9.0'} + /@babel/runtime@7.28.4: + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + /@babel/types@7.28.2: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} @@ -1593,6 +1606,14 @@ packages: '@babel/helper-validator-identifier': 7.27.1 dev: false + /@babel/types@7.28.4: + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + dev: false + /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} dev: true @@ -2046,8 +2067,8 @@ packages: resolution: {integrity: sha512-KmsjZcd/dPWM51FoT08cvUGCq9l3nFEriloQ12mcdJPoW911Gi5S/9Cq4xeFvTrtk9TJ2krvxP23IeobecRmOQ==} dev: true - /@cloudflare/workers-types@4.20241022.0: - resolution: {integrity: sha512-1zOAw5QIDKItzGatzCrEpfLOB1AuMTwVqKmbw9B9eBfCUGRFNfJYMrJxIwcse9EmKahsQt2GruqU00pY/GyXgg==} + /@cloudflare/workers-types@4.20250909.0: + resolution: {integrity: sha512-3WvDDOvFGOAlBUZpWe2N+9BxB1kRt9eHo3AhIKg1fihNdqrGxyh9cJe1MpYs5BI8gXSRxjkDvzPVebRED8iwOQ==} dev: true /@commitlint/config-validator@19.8.1: @@ -2104,7 +2125,7 @@ packages: engines: {node: '>=v18'} dependencies: '@types/conventional-commits-parser': 5.0.1 - chalk: 5.6.0 + chalk: 5.6.2 dev: true optional: true @@ -2179,7 +2200,7 @@ packages: node-fetch: 3.3.2 reflect-metadata: 0.2.2 tar: 7.4.3 - typescript: 5.7.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color dev: true @@ -2188,8 +2209,8 @@ packages: resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} dev: true - /@emnapi/runtime@1.4.5: - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + /@emnapi/runtime@1.5.0: + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} requiresBuild: true dependencies: tslib: 2.8.1 @@ -3671,13 +3692,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.7.0(eslint@9.34.0): - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + /@eslint-community/eslint-utils@4.9.0(eslint@9.35.0): + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.34.0 + eslint: 9.35.0 eslint-visitor-keys: 3.4.3 dev: false @@ -3726,8 +3747,8 @@ packages: - supports-color dev: false - /@eslint/js@9.34.0: - resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} + /@eslint/js@9.35.0: + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -3840,8 +3861,8 @@ packages: zod: 3.23.8 dev: false - /@hookform/resolvers@3.3.4(react-hook-form@7.51.3): - resolution: {integrity: sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==} + /@hookform/resolvers@3.4.2(react-hook-form@7.51.3): + resolution: {integrity: sha512-1m9uAVIO8wVf7VCDAGsuGA0t6Z3m6jVGAN50HkV9vYLl0yixKK/Z1lr01vaRvYCkIKGoy1noVRxMzQYb4y/j1Q==} peerDependencies: react-hook-form: ^7.0.0 dependencies: @@ -3853,12 +3874,12 @@ packages: engines: {node: '>=18.18.0'} dev: false - /@humanfs/node@0.16.6: - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + /@humanfs/node@0.16.7: + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 dev: false /@humanwhocodes/module-importer@1.0.1: @@ -3866,11 +3887,6 @@ packages: engines: {node: '>=12.22'} dev: false - /@humanwhocodes/retry@0.3.1: - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - dev: false - /@humanwhocodes/retry@0.4.3: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -4205,7 +4221,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 dev: true optional: true @@ -4215,7 +4231,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 dev: false optional: true @@ -4727,7 +4743,7 @@ packages: dependencies: string-width: 5.1.2 string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 @@ -4944,7 +4960,7 @@ packages: /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 @@ -5176,7 +5192,7 @@ packages: '@mintlify/openapi-parser': 0.0.7 '@mintlify/scraping': 4.0.314(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 - chalk: 5.6.0 + chalk: 5.6.2 favicons: 7.2.0 fs-extra: 11.3.1 gray-matter: 4.0.3 @@ -5205,7 +5221,7 @@ packages: '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 better-opn: 3.0.2 - chalk: 5.6.0 + chalk: 5.6.2 chokidar: 3.6.0 express: 4.21.2 fs-extra: 11.3.1 @@ -5666,8 +5682,8 @@ packages: fastq: 1.19.1 dev: true - /@oclif/core@4.5.2: - resolution: {integrity: sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==} + /@oclif/core@4.5.3: + resolution: {integrity: sha512-ISoFlfmsuxJvNKXhabCO4/KqNXDQdLHchZdTPfZbtqAsQbqTw5IKitLVZq9Sz1LWizN37HILp4u0350B8scBjg==} engines: {node: '>=18.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -5684,7 +5700,7 @@ packages: semver: 7.7.2 string-width: 4.2.3 supports-color: 8.1.1 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -5694,7 +5710,7 @@ packages: resolution: {integrity: sha512-LrmMdo9EMJciOvF8UurdoTcTMymv5npKtxMAyonZvhSvGR8YwCKnuHIh00+SO2mNtGOYam7f4xHnUmj2qmanyA==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 dev: true /@oclif/plugin-not-found@3.2.67(@types/node@20.14.9): @@ -5702,7 +5718,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@inquirer/prompts': 7.8.4(@types/node@20.14.9) - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -5713,7 +5729,7 @@ packages: resolution: {integrity: sha512-VSk+SwKDkGShuRGC5f5WNF/U6Y8JvLfzIaWjLxMe4GlBmln0mKhHqvcfJc2gZOiyJp1QYK638H1w/peSkoZHag==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 ansis: 3.17.0 debug: 4.4.1(supports-color@8.1.1) npm: 10.9.3 @@ -5732,7 +5748,7 @@ packages: resolution: {integrity: sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 ansis: 3.17.0 debug: 4.4.1(supports-color@8.1.1) http-call: 5.3.0 @@ -6329,8 +6345,8 @@ packages: engines: {node: '>= 20.0.0'} dev: false - /@peculiar/asn1-schema@2.4.0: - resolution: {integrity: sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ==} + /@peculiar/asn1-schema@2.5.0: + resolution: {integrity: sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==} dependencies: asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -6348,7 +6364,7 @@ packages: resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} engines: {node: '>=10.12.0'} dependencies: - '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -6586,7 +6602,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -7097,7 +7113,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7627,7 +7643,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7674,6 +7690,35 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-popper@1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.3.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} peerDependencies: @@ -7774,7 +7819,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8087,7 +8132,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8257,6 +8302,46 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false + /@radix-ui/react-select@2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.3 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.11 + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) + dev: false + /@radix-ui/react-select@2.2.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} peerDependencies: @@ -8483,7 +8568,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8510,7 +8595,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8533,7 +8618,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8584,6 +8669,37 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-tooltip@1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.3 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -8691,7 +8807,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@types/react': 18.3.11 react: 18.3.1 @@ -8801,7 +8917,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/rect': 1.0.1 '@types/react': 18.3.11 react: 18.3.1 @@ -8922,7 +9038,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 dev: false /@radix-ui/rect@1.1.0: @@ -9522,6 +9638,10 @@ packages: resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} dev: false + /@standard-schema/spec@1.0.0: + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + dev: false + /@stoplight/better-ajv-errors@1.0.3(ajv@8.17.1): resolution: {integrity: sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA==} engines: {node: ^12.20 || >= 14.13} @@ -9900,10 +10020,59 @@ packages: tailwindcss: 3.4.15 dev: false + /@tanstack/db-ivm@0.1.2(typescript@5.7.3): + resolution: {integrity: sha512-byXz+tsaVT2Wi/9F6dbZIiTG/L/Kq6tAN+lpQsp5g6URk2Tw/tZ9zB3503UkZpTyHLdKDk23+qiPKiHZCb5efw==} + peerDependencies: + typescript: '>=4.7' + dependencies: + fractional-indexing: 3.2.0 + murmurhash-js: 1.0.0 + sorted-btree: 1.8.1 + typescript: 5.7.3 + dev: false + + /@tanstack/db@0.1.12(typescript@5.7.3): + resolution: {integrity: sha512-yYg+fLjEZaGh7wXoVA/Mh0JfrjIoaO+hEqqIjj0e7TGH3m0Og89Mv9AGgRWERXwaQ2qeRiAi0YUgGZcMr8UOyw==} + peerDependencies: + typescript: '>=4.7' + dependencies: + '@standard-schema/spec': 1.0.0 + '@tanstack/db-ivm': 0.1.2(typescript@5.7.3) + typescript: 5.7.3 + dev: false + /@tanstack/query-core@4.36.1: resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} dev: false + /@tanstack/query-core@5.87.1: + resolution: {integrity: sha512-HOFHVvhOCprrWvtccSzc7+RNqpnLlZ5R6lTmngb8aq7b4rc2/jDT0w+vLdQ4lD9bNtQ+/A4GsFXy030Gk4ollA==} + dev: false + + /@tanstack/query-db-collection@0.2.11(@tanstack/query-core@5.87.1)(typescript@5.7.3): + resolution: {integrity: sha512-p8b7Wa/eRcOUnfsmTQIp3l4L4ryeRAgGIT7e42WRldTSinbjwN9Llku7mzVadGp0CKeGxfRQOusd3UZu5+IxOg==} + peerDependencies: + '@tanstack/query-core': ^5.0.0 + typescript: '>=4.7' + dependencies: + '@standard-schema/spec': 1.0.0 + '@tanstack/db': 0.1.12(typescript@5.7.3) + '@tanstack/query-core': 5.87.1 + typescript: 5.7.3 + dev: false + + /@tanstack/react-db@0.1.12(react@18.3.1)(typescript@5.7.3): + resolution: {integrity: sha512-yo/F3hcrt+S6rxhuiaKKZ9+C5TUABJsWrrIpCjO4zvELBHuBeBH6C4xr24QbwUpQXEscneQcxQauhQkJVuzggw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + '@tanstack/db': 0.1.12(typescript@5.7.3) + react: 18.3.1 + use-sync-external-store: 1.5.0(react@18.3.1) + transitivePeerDependencies: + - typescript + dev: false + /@tanstack/react-query@4.36.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} peerDependencies: @@ -9967,7 +10136,7 @@ packages: engines: {node: '>=18'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -10352,6 +10521,13 @@ packages: resolution: {integrity: sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==} dependencies: undici-types: 5.26.5 + dev: false + + /@types/node@18.19.124: + resolution: {integrity: sha512-hY4YWZFLs3ku6D2Gqo3RchTd9VRCcrjqp/I0mmohYeUVA5Y8eCXKJEasHxLAJVZRJuQogfd1GiJ9lgogBgKeuQ==} + dependencies: + undici-types: 5.26.5 + dev: true /@types/node@20.14.9: resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} @@ -10442,7 +10618,7 @@ packages: /@types/ssh2@1.15.5: resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} dependencies: - '@types/node': 18.19.123 + '@types/node': 18.19.124 dev: true /@types/unist@2.0.11: @@ -10482,22 +10658,22 @@ packages: dev: true optional: true - /@typescript-eslint/project-service@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} + /@typescript-eslint/project-service@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) - '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) + '@typescript-eslint/types': 8.43.0 debug: 4.4.1(supports-color@8.1.1) typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} + /@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10505,21 +10681,21 @@ packages: typescript: 5.5.3 dev: true - /@typescript-eslint/types@8.42.0: - resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} + /@typescript-eslint/types@8.43.0: + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} + /@typescript-eslint/typescript-estree@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.42.0(typescript@5.5.3) - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/visitor-keys': 8.42.0 + '@typescript-eslint/project-service': 8.43.0(typescript@5.5.3) + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.1(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 @@ -10531,11 +10707,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@8.42.0: - resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} + /@typescript-eslint/visitor-keys@8.43.0: + resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 dev: true @@ -10669,7 +10845,7 @@ packages: resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} dependencies: '@vitest/pretty-format': 3.0.9 - magic-string: 0.30.18 + magic-string: 0.30.19 pathe: 2.0.3 dev: true @@ -10757,78 +10933,78 @@ packages: tinyrainbow: 2.0.0 dev: true - /@vue/compiler-core@3.5.20: - resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} + /@vue/compiler-core@3.5.21: + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} dependencies: - '@babel/parser': 7.28.3 - '@vue/shared': 3.5.20 + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 dev: false - /@vue/compiler-dom@3.5.20: - resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} + /@vue/compiler-dom@3.5.21: + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} dependencies: - '@vue/compiler-core': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/compiler-sfc@3.5.20: - resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} + /@vue/compiler-sfc@3.5.21: + resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} dependencies: - '@babel/parser': 7.28.3 - '@vue/compiler-core': 3.5.20 - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.21 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 estree-walker: 2.0.2 - magic-string: 0.30.18 + magic-string: 0.30.19 postcss: 8.5.6 source-map-js: 1.2.1 dev: false - /@vue/compiler-ssr@3.5.20: - resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} + /@vue/compiler-ssr@3.5.21: + resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/compiler-dom': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/reactivity@3.5.20: - resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} + /@vue/reactivity@3.5.21: + resolution: {integrity: sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==} dependencies: - '@vue/shared': 3.5.20 + '@vue/shared': 3.5.21 dev: false - /@vue/runtime-core@3.5.20: - resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} + /@vue/runtime-core@3.5.21: + resolution: {integrity: sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==} dependencies: - '@vue/reactivity': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/reactivity': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/runtime-dom@3.5.20: - resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} + /@vue/runtime-dom@3.5.21: + resolution: {integrity: sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==} dependencies: - '@vue/reactivity': 3.5.20 - '@vue/runtime-core': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/reactivity': 3.5.21 + '@vue/runtime-core': 3.5.21 + '@vue/shared': 3.5.21 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.5.20(vue@3.5.20): - resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} + /@vue/server-renderer@3.5.21(vue@3.5.21): + resolution: {integrity: sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==} peerDependencies: - vue: 3.5.20 + vue: 3.5.21 dependencies: - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 - vue: 3.5.20(typescript@5.7.3) + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 + vue: 3.5.21(typescript@5.7.3) dev: false - /@vue/shared@3.5.20: - resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} + /@vue/shared@3.5.21: + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} dev: false /@webassemblyjs/ast@1.14.1: @@ -11062,7 +11238,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8): + /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8): resolution: {integrity: sha512-VL8Fx9euEtffzIu0BpLDZkACB+oU6zj4vHXSsSoT5VfwAzE009FJedOMPK1M4u60RpYw/DgwlD7OLN7XQfvSHw==} engines: {node: '>=18'} peerDependencies: @@ -11097,8 +11273,8 @@ packages: svelte: 4.2.20 swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.5.20) - vue: 3.5.20(typescript@5.7.3) + swrv: 1.0.4(vue@3.5.21) + vue: 3.5.21(typescript@5.7.3) zod: 3.23.8 zod-to-json-schema: 3.22.5(zod@3.23.8) dev: false @@ -11211,8 +11387,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex@6.2.0: - resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} + /ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} /ansi-sequence-parser@1.1.3: @@ -11242,8 +11418,8 @@ packages: engines: {node: '>=10'} dev: true - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + /ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} /ansis@3.17.0: @@ -11529,8 +11705,8 @@ packages: dev: true optional: true - /bare-fs@4.2.1: - resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} + /bare-fs@4.2.3: + resolution: {integrity: sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==} engines: {bare: '>=1.16.0'} requiresBuild: true peerDependencies: @@ -11687,7 +11863,7 @@ packages: /broker-factory@3.1.9: resolution: {integrity: sha512-MzvndyD6EcbkBtX4NXm/HfdO1+cOR5ONNdMCXEKfHpxGdMtuDz7+o+nJf7HMtyPH1sUVf/lEIP+DMluC5PgaBQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 fast-unique-numbers: 9.0.23 tslib: 2.8.1 worker-factory: 7.0.45 @@ -11841,6 +12017,10 @@ packages: /caniuse-lite@1.0.30001737: resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} + /caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + dev: false + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -11907,6 +12087,10 @@ packages: resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + /chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -11948,13 +12132,13 @@ packages: jiti: optional: true dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 '@oclif/plugin-help': 6.2.32 '@oclif/plugin-not-found': 3.2.67(@types/node@20.14.9) '@oclif/plugin-plugins': 5.4.46 '@oclif/plugin-warn-if-update-available': 3.1.46 '@types/archiver': 6.0.3 - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.5.3) acorn: 8.15.0 acorn-walk: 8.3.4 archiver: 7.0.1 @@ -13054,7 +13238,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 csstype: 3.1.3 dev: false @@ -13283,6 +13467,11 @@ packages: /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + dev: false + + /emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13807,31 +13996,31 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@9.34.0): + /eslint-config-prettier@9.0.0(eslint@9.35.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.34.0 + eslint: 9.35.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.34.0): + /eslint-config-turbo@1.10.12(eslint@9.35.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.34.0 - eslint-plugin-turbo: 1.10.12(eslint@9.34.0) + eslint: 9.35.0 + eslint-plugin-turbo: 1.10.12(eslint@9.35.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.34.0): + /eslint-plugin-turbo@1.10.12(eslint@9.35.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.34.0 + eslint: 9.35.0 dev: false /eslint-scope@5.1.1: @@ -13859,8 +14048,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /eslint@9.34.0: - resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} + /eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -13869,15 +14058,15 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.34.0 + '@eslint/js': 9.35.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -14233,7 +14422,7 @@ packages: resolution: {integrity: sha512-jcRIaHo46nfvyvKRMaFSKXmez4jALQ3Qw49gxM5F4siz8HqkyKPPEexpCOYwBSJI1HovrDr4fEedM8QAJ7oX3w==} engines: {node: '>=18.2.0'} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 dev: true @@ -14501,6 +14690,11 @@ packages: /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + /fractional-indexing@3.2.0: + resolution: {integrity: sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false + /framer-motion@10.17.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-CYBSs6cWfzcasAX8aofgKFZootmkQtR4qxbfTOksBLny/lbUfkGbQAFOS3qnl6Uau1N9y8tUpI7mVIrHgkFjLQ==} peerDependencies: @@ -14930,6 +15124,11 @@ packages: engines: {node: '>=18'} dev: true + /get-east-asian-width@1.3.1: + resolution: {integrity: sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==} + engines: {node: '>=18'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -15728,9 +15927,9 @@ packages: '@alcalzone/ansi-tokenize': 0.1.3 '@types/react': 18.3.11 ansi-escapes: 7.0.0 - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 auto-bind: 5.0.1 - chalk: 5.6.0 + chalk: 5.6.2 cli-boxes: 3.0.0 cli-cursor: 4.0.0 cli-truncate: 4.0.0 @@ -15748,7 +15947,7 @@ packages: string-width: 7.2.0 type-fest: 4.41.0 widest-line: 5.0.0 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 ws: 8.18.3 yoga-layout: 3.2.1 transitivePeerDependencies: @@ -15994,11 +16193,11 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + /is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.3.1 dev: true /is-generator-function@1.1.0: @@ -16441,7 +16640,7 @@ packages: hasBin: true dependencies: '@types/diff-match-patch': 1.0.36 - chalk: 5.6.0 + chalk: 5.6.2 diff-match-patch: 1.0.5 dev: false @@ -16803,6 +17002,12 @@ packages: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + dev: true + + /magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -17676,6 +17881,10 @@ packages: /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + dev: false + /mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -17947,7 +18156,7 @@ packages: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001737 + caniuse-lite: 1.0.30001741 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19236,7 +19445,7 @@ packages: react-is: 18.1.0 dev: false - /react-email@2.1.1(eslint@9.34.0): + /react-email@2.1.1(eslint@9.35.0): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -19262,8 +19471,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.34.0) - eslint-config-turbo: 1.10.12(eslint@9.34.0) + eslint-config-prettier: 9.0.0(eslint@9.35.0) + eslint-config-turbo: 1.10.12(eslint@9.35.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -19478,7 +19687,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -20204,8 +20413,8 @@ packages: randombytes: 2.1.0 dev: false - /seroval-plugins@1.3.2(seroval@1.3.2): - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + /seroval-plugins@1.3.3(seroval@1.3.2): + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -20489,15 +20698,15 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 /slice-ansi@7.1.0: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 dev: true /slugify@1.6.6: @@ -20606,7 +20815,7 @@ packages: dependencies: csstype: 3.1.3 seroval: 1.3.2 - seroval-plugins: 1.3.2(seroval@1.3.2) + seroval-plugins: 1.3.3(seroval@1.3.2) dev: false /solid-swr-store@0.10.7(solid-js@1.9.9)(swr-store@0.10.6): @@ -20640,6 +20849,10 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /sorted-btree@1.8.1: + resolution: {integrity: sha512-395+XIP+wqNn3USkFSrNz7G3Ss/MXlZEqesxvzCRFwL14h6e8LukDHdLBePn5pwbm5OQ9vGu8mDyz2lLDIqamQ==} + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -20817,15 +21030,15 @@ packages: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 /string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} dependencies: - emoji-regex: 10.4.0 + emoji-regex: 10.5.0 get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 dev: true /string.prototype.codepointat@0.2.1: @@ -20895,7 +21108,14 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} dependencies: - ansi-regex: 6.2.0 + ansi-regex: 6.2.2 + dev: false + + /strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.2.2 /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} @@ -21053,7 +21273,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.18 + magic-string: 0.30.19 periscopic: 3.1.0 dev: false @@ -21098,12 +21318,12 @@ packages: resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} dev: false - /swrv@1.0.4(vue@3.5.20): + /swrv@1.0.4(vue@3.5.21): resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.5.20(typescript@5.7.3) + vue: 3.5.21(typescript@5.7.3) dev: false /symbol-tree@3.2.4: @@ -21113,7 +21333,7 @@ packages: /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 dev: false /tailwind-merge@2.5.4: @@ -21229,7 +21449,7 @@ packages: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.1 + bare-fs: 4.2.3 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer @@ -21386,6 +21606,14 @@ packages: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + /tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + dev: true + /tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -21865,6 +22093,12 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} dev: true @@ -22839,19 +23073,19 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue@3.5.20(typescript@5.7.3): - resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} + /vue@3.5.21(typescript@5.7.3): + resolution: {integrity: sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-sfc': 3.5.20 - '@vue/runtime-dom': 3.5.20 - '@vue/server-renderer': 3.5.20(vue@3.5.20) - '@vue/shared': 3.5.20 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-sfc': 3.5.21 + '@vue/runtime-dom': 3.5.21 + '@vue/server-renderer': 3.5.21(vue@3.5.21) + '@vue/shared': 3.5.21 typescript: 5.7.3 dev: false @@ -22896,7 +23130,7 @@ packages: /webcrypto-core@1.8.1: resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} dependencies: - '@peculiar/asn1-schema': 2.4.0 + '@peculiar/asn1-schema': 2.5.0 '@peculiar/json-schema': 1.1.12 asn1js: 3.0.6 pvtsutils: 1.3.6 @@ -23114,7 +23348,7 @@ packages: /worker-factory@7.0.45: resolution: {integrity: sha512-FFPCiSv7MD6ZDEfiik/ErM8IrIAWajaXhezLyCo3v0FjhUWud6GXnG2BiTE91jLywXGAVCT8IF48Hhr+D/omMw==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 fast-unique-numbers: 9.0.23 tslib: 2.8.1 dev: true @@ -23122,7 +23356,7 @@ packages: /worker-timers-broker@8.0.10: resolution: {integrity: sha512-xvo/9GiuduENbJNdWnvZtkriIkjBKKVbMyw7GXvrBu3n1JHemzZgxqaCcCBNlpfXnRXXF4ekqvXWLh1gb65b8w==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 broker-factory: 3.1.9 fast-unique-numbers: 9.0.23 tslib: 2.8.1 @@ -23132,7 +23366,7 @@ packages: /worker-timers-worker@9.0.10: resolution: {integrity: sha512-cfCmAkuoN+nGGJShta/g7CQVP3h7rvQA642EQg72fOHCWP5S2P83rLxDiaGv811Hd+19Cgdqt/tpRBIZ5kj/dw==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 worker-factory: 7.0.45 dev: true @@ -23140,7 +23374,7 @@ packages: /worker-timers@8.0.24: resolution: {integrity: sha512-Ydu/7TRHlxIRjYSGDge1F92L7y9kzInpwR4CkocRVObPE0eRqC6d+0GFh52Hm+m520RHVKiytOERtCUu5sQDVQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 worker-timers-broker: 8.0.10 worker-timers-worker: 9.0.10 @@ -23199,7 +23433,7 @@ packages: - utf-8-validate dev: true - /wrangler@4.10.0(@cloudflare/workers-types@4.20241022.0): + /wrangler@4.10.0(@cloudflare/workers-types@4.20250909.0): resolution: {integrity: sha512-fTE4hZ79msEUt8+HEjl/8Q72haCyzPLu4PgrU3L81ysmjrMEdiYfUPqnvCkBUVtJvrDNdctTEimkufT1Y0ipNg==} engines: {node: '>=18.0.0'} hasBin: true @@ -23211,7 +23445,7 @@ packages: dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250409.0) - '@cloudflare/workers-types': 4.20241022.0 + '@cloudflare/workers-types': 4.20250909.0 blake3-wasm: 2.1.5 esbuild: 0.24.2 miniflare: 4.20250409.0 @@ -23274,17 +23508,17 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + /wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 dev: true /wrappy@1.0.2: diff --git a/tools/migrate/main.ts b/tools/migrate/main.ts deleted file mode 100644 index d99812377f..0000000000 --- a/tools/migrate/main.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { and, asc, eq, gt, isNull, mysqlDrizzle, schema, sql } from "@unkey/db"; -import mysql from "mysql2/promise"; - -async function main() { - const conn = await mysql.createConnection(process.env.DRIZZLE_DATABASE_URL!); - - await conn.ping(); - const db = mysqlDrizzle(conn, { schema, mode: "default" }); - - for (const table of [ - schema.apis, - schema.keyAuth, - schema.keys, - schema.permissions, - schema.ratelimitNamespaces, - schema.ratelimitOverrides, - schema.roles, - schema.vercelBindings, - schema.vercelIntegrations, - schema.workspaces, - ]) { - const count = await db - .select({ count: sql`count(*)` }) - .from(table) - .where(isNull(table.createdAtM)) - .then((res) => res.at(0)?.count ?? 0); - - let processed = 0; - let cursor = ""; - do { - const rows = await db - .select() - .from(table) - .where( - and( - isNull(table.createdAtM), - - gt(table.id, cursor), - ), - ) - .orderBy(asc(table.id)) - .limit(100); - - cursor = rows.at(-1)?.id ?? ""; - console.info({ cursor, rows: rows.length, processed, count }); - - await Promise.all( - rows.map(async (row) => { - await db - .update(table) - .set({ - createdAtM: new Date(row.createdAt ?? 0).getTime() ?? 0, - updatedAtM: "updatedAt" in row ? (row.updatedAt?.getTime() ?? null) : null, - deletedAtM: row.deletedAt?.getTime() ?? null, - }) - .where(eq(table.id, row.id)); - }), - ); - processed += rows.length; - } while (cursor); - } -} - -main().then(() => process.exit(0)); From 931f32955d08a721e18535790edade7530c23666 Mon Sep 17 00:00:00 2001 From: chronark Date: Mon, 8 Sep 2025 13:14:53 +0200 Subject: [PATCH 02/12] wip --- .../create-key/components/general-setup.tsx | 1 + .../_components/delete-dialog.tsx | 39 +- .../_components/identifier-dialog.tsx | 57 +-- .../_components/namespace-delete-dialog.tsx | 18 +- .../[namespaceId]/namespace-navbar.tsx | 10 +- .../overrides/overrides-table.tsx | 13 +- .../settings/components/settings-client.tsx | 21 +- .../_components/create-namespace-button.tsx | 22 +- .../hooks/use-namespace-list-filters.ts | 1 + .../ratelimits/_components/list/index.tsx | 21 +- .../_components/list/namespace-card.tsx | 11 +- .../hooks/use-ratelimit-navigation.tsx | 12 +- .../navigation/sidebar/app-sidebar/index.tsx | 3 +- .../navigation/sidebar/team-switcher.tsx | 3 + apps/dashboard/lib/collections/client.ts | 25 ++ apps/dashboard/lib/collections/index.ts | 80 +--- .../lib/collections/ratelimit_namespaces.ts | 69 +++ .../lib/collections/ratelimit_overrides.ts | 68 +++ apps/dashboard/lib/trpc/routers/index.ts | 8 +- .../trpc/routers/ratelimit/createNamespace.ts | 3 +- .../routers/ratelimit/namespace-search.ts | 23 - .../trpc/routers/ratelimit/namespaces_list.ts | 7 +- .../trpc/routers/ratelimit/overrides_list.ts | 33 ++ .../trpc/routers/ratelimit/updateOverride.ts | 3 +- apps/dashboard/package.json | 4 +- pnpm-lock.yaml | 396 ++++++++++-------- 26 files changed, 512 insertions(+), 439 deletions(-) create mode 100644 apps/dashboard/lib/collections/client.ts create mode 100644 apps/dashboard/lib/collections/ratelimit_namespaces.ts create mode 100644 apps/dashboard/lib/collections/ratelimit_overrides.ts delete mode 100644 apps/dashboard/lib/trpc/routers/ratelimit/namespace-search.ts create mode 100644 apps/dashboard/lib/trpc/routers/ratelimit/overrides_list.ts diff --git a/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx b/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx index f6617671dc..a7e9228d19 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx @@ -45,6 +45,7 @@ export const GeneralSetup = () => { value={field.value ?? null} onChange={(identityId: string | null, externalId: string | null) => { field.onChange(identityId); + // @ts-expect-error setValue("externalId", externalId); }} error={errors.externalId?.message} diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/delete-dialog.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/delete-dialog.tsx index 8ffdde84b5..c7d1241e2f 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/delete-dialog.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/delete-dialog.tsx @@ -1,7 +1,7 @@ "use client"; -import { trpc } from "@/lib/trpc/client"; +import { collection } from "@/lib/collections"; import { zodResolver } from "@hookform/resolvers/zod"; -import { Button, DialogContainer, Input, toast } from "@unkey/ui"; +import { Button, DialogContainer, Input } from "@unkey/ui"; import type { PropsWithChildren } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; @@ -23,14 +23,7 @@ type Props = PropsWithChildren<{ }>; export const DeleteDialog = ({ isModalOpen, onOpenChange, overrideId, identifier }: Props) => { - const { ratelimit } = trpc.useUtils(); - - const { - register, - handleSubmit, - watch, - formState: { isSubmitting }, - } = useForm({ + const { register, handleSubmit, watch } = useForm({ mode: "onChange", resolver: zodResolver(formSchema), defaultValues: { @@ -40,28 +33,9 @@ export const DeleteDialog = ({ isModalOpen, onOpenChange, overrideId, identifier const isValid = watch("identifier") === identifier; - const deleteOverride = trpc.ratelimit.override.delete.useMutation({ - onSuccess() { - toast.success("Override has been deleted", { - description: "Changes may take up to 60s to propagate globally", - }); - onOpenChange(false); - ratelimit.overview.logs.query.invalidate(); - ratelimit.logs.queryRatelimitTimeseries.invalidate(); - }, - onError(err) { - toast.error("Failed to delete override", { - description: err.message, - }); - }, - }); - const onSubmit = async () => { - try { - await deleteOverride.mutateAsync({ id: overrideId }); - } catch (error) { - console.error("Delete error:", error); - } + collection.ratelimitOverrides.delete(overrideId); + onOpenChange(false); }; return ( @@ -77,8 +51,7 @@ export const DeleteDialog = ({ isModalOpen, onOpenChange, overrideId, identifier variant="primary" color="danger" size="xlg" - disabled={!isValid || deleteOverride.isLoading || isSubmitting} - loading={deleteOverride.isLoading || isSubmitting} + disabled={!isValid} className="w-full rounded-lg" > Delete Override diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx index 8b3be98912..4b0546d5f1 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx @@ -1,6 +1,6 @@ "use client"; -import { trpc } from "@/lib/trpc/client"; +import { collection } from "@/lib/collections"; import { zodResolver } from "@hookform/resolvers/zod"; import { CircleInfo } from "@unkey/icons"; import { @@ -13,8 +13,8 @@ import { SelectItem, SelectTrigger, SelectValue, - toast, } from "@unkey/ui"; +import { redirect } from "next/navigation"; import type { PropsWithChildren } from "react"; import { Controller, useForm } from "react-hook-form"; import { z } from "zod"; @@ -54,7 +54,6 @@ export const IdentifierDialog = ({ overrideDetails, isLoading = false, }: Props) => { - const { ratelimit } = trpc.useUtils(); const { register, handleSubmit, @@ -71,59 +70,25 @@ export const IdentifierDialog = ({ }, }); - const update = trpc.ratelimit.override.update.useMutation({ - onSuccess() { - toast.success("Limits have been updated", { - description: "Changes may take up to 60s to propagate globally", - }); - onOpenChange(false); - ratelimit.overview.logs.query.invalidate(); - }, - onError(err) { - toast.error("Failed to update override", { - description: err.message, - }); - }, - }); - - const create = trpc.ratelimit.override.create.useMutation({ - onSuccess() { - toast.success("Override has been created", { - description: "Changes may take up to 60s to propagate globally", - }); - onOpenChange(false); - ratelimit.overview.logs.query.invalidate(); - }, - onError(err) { - toast.error("Failed to create override", { - description: err.message, - }); - }, - }); - const onSubmitForm = async (values: FormValues) => { try { - const asyncValue = { - unset: undefined, - sync: false, - async: true, - }[values.async]; - if (overrideDetails?.overrideId) { - await update.mutateAsync({ - id: overrideDetails.overrideId, - limit: values.limit, - duration: values.duration, - async: Boolean(overrideDetails.async), + collection.ratelimitOverrides.update(overrideDetails.overrideId, (draft) => { + draft.identifier = values.identifier; + draft.limit = values.limit; + draft.duration = values.duration; }); + onOpenChange(false); } else { - await create.mutateAsync({ + collection.ratelimitOverrides.insert({ namespaceId, + id: new Date().toISOString(), identifier: values.identifier, limit: values.limit, duration: values.duration, - async: asyncValue, }); + onOpenChange(false); + redirect(`/ratelimits/${namespaceId}/overrides`); } } catch (error) { console.error("Form submission error:", error); diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx index 03d2ee3f77..aebdff490a 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/namespace-delete-dialog.tsx @@ -30,12 +30,7 @@ export const DeleteNamespaceDialog = ({ namespace, }: DeleteNamespaceProps) => { const router = useRouter(); - const { - register, - handleSubmit, - watch, - formState: { isSubmitting }, - } = useForm({ + const { register, handleSubmit, watch } = useForm({ mode: "onChange", resolver: zodResolver(formSchema), defaultValues: { @@ -44,16 +39,10 @@ export const DeleteNamespaceDialog = ({ }); const isValid = watch("name") === namespace.name; - - - - - const onSubmit = async () => { - collection.ratelimitNamespaces.delete(namespace.id) + collection.ratelimitNamespaces.delete(namespace.id); router.push("/ratelimits"); - //await deleteNamespace.mutateAsync({ namespaceId: namespace.id }); }; return ( @@ -82,7 +71,8 @@ export const DeleteNamespaceDialog = ({ >

Warning: - Deleting this namespace while it is in use may cause your current requests to fail. You will lose access to analytical data. + Deleting this namespace while it is in use may cause your current requests to fail. You will + lose access to analytical data.

diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx index b3e80a201b..26ddc26b56 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/namespace-navbar.tsx @@ -26,16 +26,10 @@ type NamespaceNavbarProps = { }; }; -export const NamespaceNavbar = ({ - namespaceId, - activePage, -}: NamespaceNavbarProps) => { +export const NamespaceNavbar = ({ namespaceId, activePage }: NamespaceNavbarProps) => { const [open, setOpen] = useState(false); - - const { data } = useLiveQuery((q) => q.from({ namespace: collection.ratelimitNamespaces })) - - + const { data } = useLiveQuery((q) => q.from({ namespace: collection.ratelimitNamespaces })); if (!data) { return ( diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx index 23ad90a028..17afc276c4 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx @@ -1,9 +1,10 @@ "use client"; import { VirtualTable } from "@/components/virtual-table"; import type { Column } from "@/components/virtual-table/types"; +import { collection } from "@/lib/collections"; import { formatNumber } from "@/lib/fmt"; -import { trpc } from "@/lib/trpc/client"; import { cn } from "@/lib/utils"; +import { eq, useLiveQuery } from "@tanstack/react-db"; import { Badge, Empty } from "@unkey/ui"; import ms from "ms"; import { LastUsedCell } from "./last-used-cell"; @@ -46,12 +47,12 @@ const getRowClassName = () => { }; export const OverridesTable = ({ namespaceId }: Props) => { - const { data, isLoading } = trpc.ratelimit.namespace.queryDetails.useQuery({ - namespaceId, - includeOverrides: true, - }); + const { data: overrides, isLoading } = useLiveQuery((q) => + q + .from({ override: collection.ratelimitOverrides }) + .where(({ override }) => eq(override.namespaceId, namespaceId)), + ); - const overrides = data?.namespace?.overrides ?? []; const columns: Column[] = [ { key: "identifier", diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx index d57de20201..ad70340bcb 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx @@ -1,11 +1,11 @@ "use client"; +import { collection } from "@/lib/collections"; +import { eq, useLiveQuery } from "@tanstack/react-db"; import { Button, CopyButton, Input, SettingCard, toast } from "@unkey/ui"; import { useEffect, useState } from "react"; import { DeleteNamespaceDialog } from "../../_components/namespace-delete-dialog"; import { SettingsClientSkeleton } from "./skeleton"; -import { useLiveQuery, eq } from "@tanstack/react-db"; -import { collection } from "@/lib/collections"; type Props = { namespaceId: string; @@ -14,19 +14,19 @@ type Props = { export const SettingsClient = ({ namespaceId }: Props) => { const [isNamespaceNameDeleteModalOpen, setIsNamespaceNameDeleteModalOpen] = useState(false); + const { data } = useLiveQuery((q) => + q + .from({ namespace: collection.ratelimitNamespaces }) + .where(({ namespace }) => eq(namespace.id, namespaceId)), + ); - - - const { data } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).where(({ namespace }) => eq(namespace.id, namespaceId))) - - const namespace = data.at(0) + const namespace = data.at(0); const [namespaceName, setNamespaceName] = useState(null); useEffect(() => { if (namespaceName === null && namespace) { setNamespaceName(namespace.name); } - }, [namespace, namespaceName]); const handleUpdateName = async () => { @@ -38,8 +38,9 @@ export const SettingsClient = ({ namespaceId }: Props) => { return toast.error("Please provide a different name before saving."); } - collection.ratelimitNamespaces.update(namespace.id, draft => { draft.name = namespaceName }) - + collection.ratelimitNamespaces.update(namespace.id, (draft) => { + draft.name = namespaceName; + }); }; if (!namespace) { diff --git a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx index fd4a3c19e5..821a47e186 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx @@ -2,8 +2,10 @@ import { revalidate } from "@/app/actions"; import { NavbarActionButton } from "@/components/navigation/action-button"; +import { collection } from "@/lib/collections"; import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; +import { DuplicateKeyError } from "@tanstack/react-db"; import { Button, DialogContainer, FormInput, toast } from "@unkey/ui"; import { Plus } from "lucide-react"; import { useRouter } from "next/navigation"; @@ -11,7 +13,6 @@ import { useState } from "react"; import type React from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; -import { collection } from "@/lib/collections"; const formSchema = z.object({ name: z @@ -32,10 +33,10 @@ export const CreateNamespaceButton = ({ }: React.ButtonHTMLAttributes) => { const [isOpen, setIsOpen] = useState(false); - const { register, handleSubmit, + setError, formState: { errors, isValid, isSubmitting }, } = useForm({ resolver: zodResolver(formSchema), @@ -58,11 +59,18 @@ export const CreateNamespaceButton = ({ }); const onSubmit = (values: FormValues) => { - collection.ratelimitNamespaces.insert({ - id: new Date().toISOString(), - name: values.name, - }) - setIsOpen(false) + //collection.ratelimitNamespaces. + try { + collection.ratelimitNamespaces.insert({ + id: new Date().toISOString(), + name: values.name, + }); + setIsOpen(false); + } catch (error) { + if (error instanceof DuplicateKeyError) { + setError("name", { type: "custom", message: "Namespace already exists" }); + } + } }; return ( diff --git a/apps/dashboard/app/(app)/ratelimits/_components/hooks/use-namespace-list-filters.ts b/apps/dashboard/app/(app)/ratelimits/_components/hooks/use-namespace-list-filters.ts index d6bdb97888..1ef4d209cc 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/hooks/use-namespace-list-filters.ts +++ b/apps/dashboard/app/(app)/ratelimits/_components/hooks/use-namespace-list-filters.ts @@ -20,6 +20,7 @@ const arrayFields = ["query"] as const; export const useNamespaceListFilters = () => { const [searchParams, setSearchParams] = useQueryStates(queryParamsPayload, { history: "push", + throttleMs: 50, }); const filters = useMemo(() => { diff --git a/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx b/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx index 62d92bda44..ea54eb3ca6 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/list/index.tsx @@ -1,9 +1,9 @@ +import { collection } from "@/lib/collections"; +import { ilike, useLiveQuery } from "@tanstack/react-db"; import { Bookmark } from "@unkey/icons"; import { Button, CopyButton, Empty } from "@unkey/ui"; +import { useNamespaceListFilters } from "../hooks/use-namespace-list-filters"; import { NamespaceCard } from "./namespace-card"; -import { useLiveQuery } from "@tanstack/react-db"; -import { collection } from "@/lib/collections"; - const EXAMPLE_SNIPPET = `curl -XPOST 'https://api.unkey.dev/v2/ratelimits.limit' \\ -H 'Content-Type: application/json' \\ @@ -16,12 +16,18 @@ const EXAMPLE_SNIPPET = `curl -XPOST 'https://api.unkey.dev/v2/ratelimits.limit' }'`; export const NamespaceList = () => { + const { filters } = useNamespaceListFilters(); - const { data: namespaces } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).orderBy(({ namespace }) => namespace.id, 'desc') - - ) - + const nameFilter = filters.find((filter) => filter.field === "query")?.value ?? ""; + const { data: namespaces } = useLiveQuery( + (q) => + q + .from({ namespace: collection.ratelimitNamespaces }) + .where(({ namespace }) => ilike(namespace.name, `%${nameFilter}%`)) + .orderBy(({ namespace }) => namespace.id, "desc"), + [nameFilter], + ); if (namespaces.length === 0) { return ( @@ -62,6 +68,5 @@ export const NamespaceList = () => { ))}
- ); }; diff --git a/apps/dashboard/app/(app)/ratelimits/_components/list/namespace-card.tsx b/apps/dashboard/app/(app)/ratelimits/_components/list/namespace-card.tsx index 369e9ac3fc..f65e88ec65 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/list/namespace-card.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/list/namespace-card.tsx @@ -3,7 +3,6 @@ import { useFetchRatelimitOverviewTimeseries } from "@/app/(app)/ratelimits/[nam import { StatsCard } from "@/components/stats-card"; import { StatsTimeseriesBarChart } from "@/components/stats-card/components/chart/stats-chart"; import { MetricStats } from "@/components/stats-card/components/metric-stats"; -import { trpc } from "@/lib/trpc/client"; import { Clock, ProgressBar } from "@unkey/icons"; import ms from "ms"; @@ -16,14 +15,6 @@ type Props = { export const NamespaceCard = ({ namespace }: Props) => { const { timeseries, isLoading, isError } = useFetchRatelimitOverviewTimeseries(namespace.id); - const utils = trpc.useUtils(); - - const handleMouseEnter = () => { - utils.ratelimit.namespace.queryDetails.prefetch({ - namespaceId: namespace.id, - includeOverrides: false, - }); - }; const passed = timeseries?.reduce((acc, crr) => acc + crr.success, 0) ?? 0; const blocked = timeseries?.reduce((acc, crr) => acc + crr.error, 0) ?? 0; @@ -34,7 +25,7 @@ export const NamespaceCard = ({ namespace }: Props) => { : null; return ( -
+
{ const segments = useSelectedLayoutSegments() ?? []; - const { data } = useLiveQuery(q => q.from({ namespace: collection.ratelimitNamespaces }).orderBy(({ namespace }) => namespace.id, 'desc') - - ) + const { data } = useLiveQuery((q) => + q + .from({ namespace: collection.ratelimitNamespaces }) + .orderBy(({ namespace }) => namespace.id, "desc"), + ); // Convert ratelimit namespaces data to navigation items with sub-items const ratelimitNavItems = useMemo(() => { @@ -70,7 +72,7 @@ export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { }; return namespaceNavItem; - }) + }); }, [data, segments]); const enhancedNavItems = useMemo(() => { @@ -81,14 +83,12 @@ export const useRatelimitNavigation = (baseNavItems: NavItem[]) => { const ratelimitsItem = { ...items[ratelimitsItemIndex] }; ratelimitsItem.items = [...(ratelimitsItem.items || []), ...ratelimitNavItems]; - items[ratelimitsItemIndex] = ratelimitsItem; } return items; }, [baseNavItems, ratelimitNavItems]); - return { enhancedNavItems, }; diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx index b1b1deb4f7..4a5a49356c 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/index.tsx @@ -84,8 +84,7 @@ export function AppSidebar({ const { enhancedNavItems: apiAddedNavItems, loadMore: loadMoreApis } = useApiNavigation(baseNavItems); - const { enhancedNavItems: ratelimitAddedNavItems } = - useRatelimitNavigation(apiAddedNavItems); + const { enhancedNavItems: ratelimitAddedNavItems } = useRatelimitNavigation(apiAddedNavItems); const { enhancedNavItems: projectAddedNavItems, loadMore: loadMoreProjects } = useProjectNavigation(ratelimitAddedNavItems); diff --git a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx index b4a41e75a9..8f1d3fb155 100644 --- a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx +++ b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx @@ -12,6 +12,7 @@ import { import { ScrollArea } from "@/components/ui/scroll-area"; import { useSidebar } from "@/components/ui/sidebar"; import { setSessionCookie } from "@/lib/auth/cookies"; +import { reset } from "@/lib/collections"; import { trpc } from "@/lib/trpc/client"; import { cn } from "@/lib/utils"; import { ChevronExpandY } from "@unkey/icons"; @@ -68,6 +69,8 @@ export const WorkspaceSwitcher: React.FC = (props): JSX.Element => { utils.user.getCurrentUser.invalidate(); utils.api.overview.query.invalidate(); + reset(); + // reload data router.replace("/"); } catch (error) { diff --git a/apps/dashboard/lib/collections/client.ts b/apps/dashboard/lib/collections/client.ts new file mode 100644 index 0000000000..f249801109 --- /dev/null +++ b/apps/dashboard/lib/collections/client.ts @@ -0,0 +1,25 @@ +"use client" + + +import type { Router } from "@/lib/trpc/routers"; +import { QueryClient } from "@tanstack/query-core"; +import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; +import superjson from "superjson"; + +export const queryClient = new QueryClient(); + +// Create vanilla TRPC client for one-time calls +export const trpcClient = createTRPCProxyClient({ + transformer: superjson, + links: [ + httpBatchLink({ + url: "/api/trpc", + fetch(url, options) { + return fetch(url, { + ...options, + credentials: "include", + }); + }, + }), + ], +}); diff --git a/apps/dashboard/lib/collections/index.ts b/apps/dashboard/lib/collections/index.ts index c45cbb0c4e..866d805d13 100644 --- a/apps/dashboard/lib/collections/index.ts +++ b/apps/dashboard/lib/collections/index.ts @@ -1,78 +1,18 @@ -import type { Router } from "@/lib/trpc/routers"; -import { QueryClient } from "@tanstack/query-core"; -import { queryCollectionOptions } from "@tanstack/query-db-collection"; -import { createCollection, createOptimisticAction } from "@tanstack/react-db"; -import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; -import superjson from "superjson"; +"use client"; -const queryClient = new QueryClient(); +import { ratelimitNamespaces } from "./ratelimit_namespaces"; +import { ratelimitOverrides } from "./ratelimit_overrides"; - - -// Create vanilla TRPC client for one-time calls -const trpcClient = createTRPCProxyClient({ - transformer: superjson, - links: [ - httpBatchLink({ - url: "/api/trpc", - fetch(url, options) { - return fetch(url, { - ...options, - credentials: "include", - }); - }, - }), - ], -}); - - -const ratelimitNamespaces = createCollection( - queryCollectionOptions({ - queryClient, - queryKey: ["ratelimitNamespaces"], - queryFn: async () => { - console.info("DB fetching ratelimitNamespaces") - return await trpcClient.ratelimit.namespace.list.query(); - }, - getKey: (item) => item.id, - onInsert: async ({ transaction }) => { - const { changes: newNamespace } = transaction.mutations[0] - await trpcClient.ratelimit.namespace.create.mutate({ name: newNamespace.name! }); - }, - onUpdate: async ({ transaction }) => { - const { original, modified } = transaction.mutations[0]; - await trpcClient.ratelimit.namespace.update.name.mutate({ - namespaceId: original.id, - name: modified.name! - }) - }, - onDelete: async ({ transaction }) => { - - const { original } = transaction.mutations[0]; - await trpcClient.ratelimit.namespace.delete.mutate({ namespaceId: original.id }); - return { refetch: true } - - }, - - }), -); - export const collection = { ratelimitNamespaces, + ratelimitOverrides, }; - -export const createRatelimitNamespace = createOptimisticAction<{ name: string }>({ - onMutate: (args) => { - ratelimitNamespaces.insert({ - id: Date.now().toString(), - name: args.name, - - }) - }, - mutationFn: async (args) => { - - await trpcClient.ratelimit.namespace.create.mutate({ name: args.name }); +// resets all collections data and preloads new +export function reset() { + for (const c of [ratelimitNamespaces, ratelimitOverrides]) { + c.cleanup(); + c.preload(); } -}) +} diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts new file mode 100644 index 0000000000..a1d4a632f1 --- /dev/null +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -0,0 +1,69 @@ +"use client" +import { queryCollectionOptions } from "@tanstack/query-db-collection"; +import { createCollection } from "@tanstack/react-db"; +import { toast } from "@unkey/ui"; +import { queryClient, trpcClient } from "./client"; +import { z } from "zod"; + +const schema = z.object({ + id: z.string(), + name: z.string(), +}); + +export const ratelimitNamespaces = createCollection( + queryCollectionOptions({ + schema, + queryClient, + queryKey: ["ratelimitNamespaces"], + retry: 3, + queryFn: async () => { + console.info("DB fetching ratelimitNamespaces"); + return await trpcClient.ratelimit.namespace.list.query(); + }, + getKey: (item) => [item.name].join("::"), + onInsert: async ({ transaction }) => { + const { changes: newNamespace } = transaction.mutations[0]; + if (!newNamespace.name) { + throw new Error("Namespace name is required"); + } + + const p = trpcClient.ratelimit.namespace.create.mutate({ name: newNamespace.name }); + toast.promise(p, { + loading: "Creating namespace...", + success: "Namespace created", + error: (res) => { + console.error("Failed to create namespace", res); + return { + message: "Failed to create namespace", + description: res.message, + }; + }, + }); + await p; + }, + onUpdate: async ({ transaction }) => { + const { original, modified } = transaction.mutations[0]; + + const p = trpcClient.ratelimit.namespace.update.name.mutate({ + namespaceId: original.id, + name: modified.name, + }); + toast.promise(p, { + loading: "Updating namespace...", + success: "Namespace updated", + error: "Failed to update namespace", + }); + await p; + }, + onDelete: async ({ transaction }) => { + const { original } = transaction.mutations[0]; + const p = trpcClient.ratelimit.namespace.delete.mutate({ namespaceId: original.id }); + toast.promise(p, { + loading: "Deleting namespace...", + success: "Namespace deleted", + error: "Failed to delete namespace", + }); + await p; + }, + }), +); diff --git a/apps/dashboard/lib/collections/ratelimit_overrides.ts b/apps/dashboard/lib/collections/ratelimit_overrides.ts new file mode 100644 index 0000000000..434197455b --- /dev/null +++ b/apps/dashboard/lib/collections/ratelimit_overrides.ts @@ -0,0 +1,68 @@ +"use client" +import { queryCollectionOptions } from "@tanstack/query-db-collection"; +import { createCollection } from "@tanstack/react-db"; +import { toast } from "@unkey/ui"; +import { queryClient, trpcClient } from "./client"; +import { z } from "zod"; + +const schema = z.object({ + namespaceId: z.string(), + identifier: z.string(), + limit: z.number(), + duration: z.number(), +}); + +export + const ratelimitOverrides = createCollection( + queryCollectionOptions({ + schema, + queryClient, + queryKey: ["ratelimitOverrides"], + queryFn: async () => { + console.info("DB fetching ratelimitOverrides"); + return await trpcClient.ratelimit.override.list.query(); + }, + getKey: (item) => [item.namespaceId, item.identifier].join("::"), + onInsert: async ({ transaction }) => { + const { changes } = transaction.mutations[0]; + + const p = trpcClient.ratelimit.override.create.mutate(schema.parse(changes)); + toast.promise(p, { + loading: "Creating override...", + success: "Override created", + error: (res) => { + console.error("Failed to create override", res); + return { + message: "Failed to create override", + description: res.message, + }; + }, + }); + await p; + }, + onUpdate: async ({ transaction }) => { + const { original, modified } = transaction.mutations[0]; + const p = trpcClient.ratelimit.override.update.mutate({ + id: original.id, + limit: modified.limit, + duration: modified.duration, + }); + toast.promise(p, { + loading: "Updating override...", + success: "Override updated", + error: "Failed to update override", + }); + await p; + }, + onDelete: async ({ transaction }) => { + const { original } = transaction.mutations[0]; + const p = trpcClient.ratelimit.override.delete.mutate({ id: original.id }); + toast.promise(p, { + loading: "Deleting override...", + success: "Override deleted", + error: "Failed to delete override", + }); + await p; + }, + }), + ); diff --git a/apps/dashboard/lib/trpc/routers/index.ts b/apps/dashboard/lib/trpc/routers/index.ts index bbd241cd15..7d4eea8633 100644 --- a/apps/dashboard/lib/trpc/routers/index.ts +++ b/apps/dashboard/lib/trpc/routers/index.ts @@ -87,12 +87,11 @@ import { createOverride } from "./ratelimit/createOverride"; import { deleteNamespace } from "./ratelimit/deleteNamespace"; import { deleteOverride } from "./ratelimit/deleteOverride"; import { ratelimitLlmSearch } from "./ratelimit/llm-search"; -import { searchNamespace } from "./ratelimit/namespace-search"; +import { listRatelimitNamespaces } from "./ratelimit/namespaces_list"; +import { listRatelimitOverrides } from "./ratelimit/overrides_list"; import { queryRatelimitLastUsed } from "./ratelimit/query-last-used-times"; import { queryRatelimitLatencyTimeseries } from "./ratelimit/query-latency-timeseries"; import { queryRatelimitLogs } from "./ratelimit/query-logs"; -import { queryRatelimitWorkspaceDetails } from "./ratelimit/query-namespace-details"; -import { listRatelimitNamespaces } from "./ratelimit/namespaces_list"; import { queryRatelimitOverviewLogs } from "./ratelimit/query-overview-logs"; import { queryRatelimitTimeseries } from "./ratelimit/query-timeseries"; import { updateNamespaceName } from "./ratelimit/updateNamespaceName"; @@ -263,8 +262,6 @@ export const router = t.router({ namespace: t.router({ list: listRatelimitNamespaces, queryRatelimitLastUsed, - queryDetails: queryRatelimitWorkspaceDetails, - search: searchNamespace, create: createNamespace, update: t.router({ name: updateNamespaceName, @@ -272,6 +269,7 @@ export const router = t.router({ delete: deleteNamespace, }), override: t.router({ + list: listRatelimitOverrides, create: createOverride, update: updateOverride, delete: deleteOverride, diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts index 341c956668..4cc9664ae9 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createNamespace.ts @@ -47,7 +47,8 @@ export const createNamespace = t.procedure }); }) .catch((e) => { - if (e instanceof DatabaseError && e.body.message.includes("desc = Duplicate entry")) { + console.error("Failed to create namespace", e); + if (e instanceof DatabaseError && e.body.message.includes("Duplicate entry")) { throw new TRPCError({ code: "CONFLICT", message: `A namespace with name "${input.name}" already exists in this workspace. Please choose a different name.`, diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/namespace-search.ts b/apps/dashboard/lib/trpc/routers/ratelimit/namespace-search.ts deleted file mode 100644 index fcaf808ccf..0000000000 --- a/apps/dashboard/lib/trpc/routers/ratelimit/namespace-search.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { db, sql } from "@/lib/db"; -import { ratelimit, requireUser, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; -import { z } from "zod"; - -export const searchNamespace = t.procedure - .use(requireUser) - .use(requireWorkspace) - .use(withRatelimit(ratelimit.read)) - .input(z.object({ query: z.string() })) - .mutation(async ({ ctx, input }) => { - return await db.query.ratelimitNamespaces.findMany({ - where: (table, { isNull, and, eq }) => - and( - eq(table.workspaceId, ctx.workspace.id), - sql`${table.name} LIKE ${`%${input.query}%`}`, - isNull(table.deletedAtM), - ), - columns: { - id: true, - name: true, - }, - }); - }); diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts b/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts index a02c39174d..7feffa0fe4 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/namespaces_list.ts @@ -10,12 +10,13 @@ export const listRatelimitNamespaces = t.procedure .query(async ({ ctx }) => { try { return await db.query.ratelimitNamespaces.findMany({ - where: (table, { eq, and, isNull }) => and(eq(table.workspaceId, ctx.workspace.id), isNull(table.deletedAtM)), + where: (table, { eq, and, isNull }) => + and(eq(table.workspaceId, ctx.workspace.id), isNull(table.deletedAtM)), columns: { id: true, name: true, - } - }) + }, + }); } catch (error) { console.error( "Something went wrong when fetching ratelimit namespaces", diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/overrides_list.ts b/apps/dashboard/lib/trpc/routers/ratelimit/overrides_list.ts new file mode 100644 index 0000000000..96e957bb1e --- /dev/null +++ b/apps/dashboard/lib/trpc/routers/ratelimit/overrides_list.ts @@ -0,0 +1,33 @@ +import { db } from "@/lib/db"; +import { ratelimit, requireUser, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; + +import { TRPCError } from "@trpc/server"; + +export const listRatelimitOverrides = t.procedure + .use(requireUser) + .use(requireWorkspace) + .use(withRatelimit(ratelimit.read)) + .query(async ({ ctx }) => { + try { + return await db.query.ratelimitOverrides.findMany({ + where: (table, { eq, and, isNull }) => + and(eq(table.workspaceId, ctx.workspace.id), isNull(table.deletedAtM)), + columns: { + id: true, + identifier: true, + limit: true, + duration: true, + namespaceId: true, + }, + }); + } catch (error) { + console.error( + "Something went wrong when fetching ratelimit overrides", + JSON.stringify(error), + ); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to fetch ratelimit overrides", + }); + } + }); diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts index a5b4a3e19b..67b82f4963 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/updateOverride.ts @@ -12,7 +12,6 @@ export const updateOverride = t.procedure id: z.string(), limit: z.number(), duration: z.number(), - async: z.boolean().nullable(), }), ) .mutation(async ({ ctx, input }) => { @@ -57,7 +56,7 @@ export const updateOverride = t.procedure limit: input.limit, duration: input.duration, updatedAtM: Date.now(), - async: input.async, + async: false, }) .where(eq(schema.ratelimitOverrides.id, override.id)) .catch((_err) => { diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 6d5f53df47..15bc528eca 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@ant-design/plots": "^1.2.5", - "@hookform/resolvers": "^3.3.4", + "@hookform/resolvers": "^3.4.2", "@planetscale/database": "^1.16.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.4", @@ -100,7 +100,7 @@ "typescript": "^5.7.3", "usehooks-ts": "^3.1.0", "vaul": "^0.9.0", - "zod": "^3.23.5" + "zod": "4.1.5" }, "devDependencies": { "@tailwindcss/aspect-ratio": "^0.4.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea8fff975e..2217015ce4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -345,7 +345,7 @@ importers: version: 1.17.6(next@14.2.25) openai: specifier: ^4.78.1 - version: 4.78.1(zod@3.23.8) + version: 4.78.1(zod@4.1.5) postcss: specifier: 8.4.38 version: 8.4.38 @@ -396,7 +396,7 @@ importers: version: 1.0.7(tailwindcss@3.4.15) trpc-tools: specifier: ^0.12.0 - version: 0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@3.23.8) + version: 0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@4.1.5) typescript: specifier: ^5.7.3 version: 5.7.3 @@ -407,8 +407,8 @@ importers: specifier: ^0.9.0 version: 0.9.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) zod: - specifier: 3.23.8 - version: 3.23.8 + specifier: 4.1.5 + version: 4.1.5 devDependencies: '@tailwindcss/aspect-ratio': specifier: ^0.4.2 @@ -446,7 +446,7 @@ importers: devDependencies: mintlify: specifier: ^4.2.31 - version: 4.2.31(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) + version: 4.2.31(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) apps/engineering: dependencies: @@ -630,10 +630,10 @@ importers: devDependencies: checkly: specifier: latest - version: 6.5.0(@types/node@20.14.9)(typescript@5.5.3) + version: 6.2.1(@types/node@24.3.1)(typescript@5.5.3) ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@20.14.9)(typescript@5.5.3) + version: 10.9.1(@types/node@24.3.1)(typescript@5.5.3) typescript: specifier: 5.5.3 version: 5.5.3 @@ -879,7 +879,7 @@ importers: version: 2.1.1(eslint@9.35.0) resend: specifier: ^4.4.0 - version: 4.4.0(react-dom@18.3.1)(react@18.3.1) + version: 4.4.0(react-dom@19.1.1)(react@18.3.1) devDependencies: '@types/node': specifier: ^20.14.9 @@ -1597,6 +1597,7 @@ packages: /@babel/runtime@7.28.4: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/types@7.28.2: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} @@ -2205,10 +2206,6 @@ packages: - supports-color dev: true - /@drizzle-team/brocli@0.10.2: - resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - dev: true - /@emnapi/runtime@1.5.0: resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} requiresBuild: true @@ -4280,7 +4277,7 @@ packages: dev: false optional: true - /@inquirer/checkbox@4.2.2(@types/node@20.14.9): + /@inquirer/checkbox@4.2.2(@types/node@22.14.0): resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} engines: {node: '>=18'} peerDependencies: @@ -4289,15 +4286,15 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/core': 10.2.0(@types/node@22.14.0) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/checkbox@4.2.2(@types/node@22.14.0): + /@inquirer/checkbox@4.2.2(@types/node@24.3.1): resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} engines: {node: '>=18'} peerDependencies: @@ -4306,15 +4303,15 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/core': 10.2.0(@types/node@24.3.1) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/confirm@5.1.16(@types/node@20.14.9): + /@inquirer/confirm@5.1.16(@types/node@22.14.0): resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} engines: {node: '>=18'} peerDependencies: @@ -4323,12 +4320,12 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 dev: true - /@inquirer/confirm@5.1.16(@types/node@22.14.0): + /@inquirer/confirm@5.1.16(@types/node@24.3.1): resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} engines: {node: '>=18'} peerDependencies: @@ -4337,12 +4334,12 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 dev: true - /@inquirer/core@10.2.0(@types/node@20.14.9): + /@inquirer/core@10.2.0(@types/node@22.14.0): resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} engines: {node: '>=18'} peerDependencies: @@ -4352,8 +4349,8 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -4362,7 +4359,7 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/core@10.2.0(@types/node@22.14.0): + /@inquirer/core@10.2.0(@types/node@24.3.1): resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} engines: {node: '>=18'} peerDependencies: @@ -4372,8 +4369,8 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -4382,21 +4379,6 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/editor@4.2.18(@types/node@20.14.9): - resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/external-editor': 1.0.1(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 - dev: true - /@inquirer/editor@4.2.18(@types/node@22.14.0): resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} engines: {node: '>=18'} @@ -4412,8 +4394,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/expand@4.0.18(@types/node@20.14.9): - resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} + /@inquirer/editor@4.2.18(@types/node@24.3.1): + resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4421,10 +4403,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 - yoctocolors-cjs: 2.1.3 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/external-editor': 1.0.1(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 dev: true /@inquirer/expand@4.0.18(@types/node@22.14.0): @@ -4442,8 +4424,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/external-editor@1.0.1(@types/node@20.14.9): - resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} + /@inquirer/expand@4.0.18(@types/node@24.3.1): + resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4451,9 +4433,10 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.14.9 - chardet: 2.1.0 - iconv-lite: 0.6.3 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 + yoctocolors-cjs: 2.1.3 dev: true /@inquirer/external-editor@1.0.1(@types/node@22.14.0): @@ -4470,13 +4453,8 @@ packages: iconv-lite: 0.6.3 dev: true - /@inquirer/figures@1.0.13: - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} - engines: {node: '>=18'} - dev: true - - /@inquirer/input@4.2.2(@types/node@20.14.9): - resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} + /@inquirer/external-editor@1.0.1(@types/node@24.3.1): + resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4484,9 +4462,14 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@types/node': 24.3.1 + chardet: 2.1.0 + iconv-lite: 0.6.3 + dev: true + + /@inquirer/figures@1.0.13: + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} dev: true /@inquirer/input@4.2.2(@types/node@22.14.0): @@ -4503,8 +4486,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/number@3.0.18(@types/node@20.14.9): - resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} + /@inquirer/input@4.2.2(@types/node@24.3.1): + resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4512,9 +4495,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 dev: true /@inquirer/number@3.0.18(@types/node@22.14.0): @@ -4531,8 +4514,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/password@4.0.18(@types/node@20.14.9): - resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} + /@inquirer/number@3.0.18(@types/node@24.3.1): + resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4540,10 +4523,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 - ansi-escapes: 4.3.2 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 dev: true /@inquirer/password@4.0.18(@types/node@22.14.0): @@ -4561,8 +4543,8 @@ packages: ansi-escapes: 4.3.2 dev: true - /@inquirer/prompts@7.8.4(@types/node@20.14.9): - resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} + /@inquirer/password@4.0.18(@types/node@24.3.1): + resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4570,17 +4552,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/checkbox': 4.2.2(@types/node@20.14.9) - '@inquirer/confirm': 5.1.16(@types/node@20.14.9) - '@inquirer/editor': 4.2.18(@types/node@20.14.9) - '@inquirer/expand': 4.0.18(@types/node@20.14.9) - '@inquirer/input': 4.2.2(@types/node@20.14.9) - '@inquirer/number': 3.0.18(@types/node@20.14.9) - '@inquirer/password': 4.0.18(@types/node@20.14.9) - '@inquirer/rawlist': 4.1.6(@types/node@20.14.9) - '@inquirer/search': 3.1.1(@types/node@20.14.9) - '@inquirer/select': 4.3.2(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 + ansi-escapes: 4.3.2 dev: true /@inquirer/prompts@7.8.4(@types/node@22.14.0): @@ -4605,8 +4580,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/rawlist@4.1.6(@types/node@20.14.9): - resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} + /@inquirer/prompts@7.8.4(@types/node@24.3.1): + resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4614,10 +4589,17 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 - yoctocolors-cjs: 2.1.3 + '@inquirer/checkbox': 4.2.2(@types/node@24.3.1) + '@inquirer/confirm': 5.1.16(@types/node@24.3.1) + '@inquirer/editor': 4.2.18(@types/node@24.3.1) + '@inquirer/expand': 4.0.18(@types/node@24.3.1) + '@inquirer/input': 4.2.2(@types/node@24.3.1) + '@inquirer/number': 3.0.18(@types/node@24.3.1) + '@inquirer/password': 4.0.18(@types/node@24.3.1) + '@inquirer/rawlist': 4.1.6(@types/node@24.3.1) + '@inquirer/search': 3.1.1(@types/node@24.3.1) + '@inquirer/select': 4.3.2(@types/node@24.3.1) + '@types/node': 24.3.1 dev: true /@inquirer/rawlist@4.1.6(@types/node@22.14.0): @@ -4635,8 +4617,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/search@3.1.1(@types/node@20.14.9): - resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} + /@inquirer/rawlist@4.1.6(@types/node@24.3.1): + resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4644,10 +4626,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 yoctocolors-cjs: 2.1.3 dev: true @@ -4667,8 +4648,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/select@4.3.2(@types/node@20.14.9): - resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} + /@inquirer/search@3.1.1(@types/node@24.3.1): + resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4676,11 +4657,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/core': 10.2.0(@types/node@24.3.1) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@20.14.9) - '@types/node': 20.14.9 - ansi-escapes: 4.3.2 + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 yoctocolors-cjs: 2.1.3 dev: true @@ -4701,8 +4681,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/type@3.0.8(@types/node@20.14.9): - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + /@inquirer/select@4.3.2(@types/node@24.3.1): + resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4710,7 +4690,12 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 20.14.9 + '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.3.1) + '@types/node': 24.3.1 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 dev: true /@inquirer/type@3.0.8(@types/node@22.14.0): @@ -4725,6 +4710,18 @@ packages: '@types/node': 22.14.0 dev: true + /@inquirer/type@3.0.8(@types/node@24.3.1): + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 24.3.1 + dev: true + /@isaacs/balanced-match@4.0.1: resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -5008,14 +5005,14 @@ packages: - acorn - supports-color - /@mdx-js/react@3.1.0(@types/react@18.3.11)(react@18.3.1): + /@mdx-js/react@3.1.0(@types/react@19.1.12)(react@18.3.1): resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: '@types/mdx': 2.0.13 - '@types/react': 18.3.11 + '@types/react': 19.1.12 react: 18.3.1 dev: true @@ -5032,21 +5029,21 @@ packages: - ws dev: false - /@mintlify/cli@4.0.635(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): + /@mintlify/cli@4.0.635(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-jvTcEz3Zt31AQG9K+VBzJujssYKL6ED5NHeajsoysH2aJzLM8Xp7h+JPseVZmeDUU7jp+yCF/fNeGmmlUQXyqQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/link-rot': 3.0.583(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/link-rot': 3.0.583(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/models': 0.0.210 - '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) - '@mintlify/previewing': 4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/previewing': 4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 chalk: 5.6.0 detect-port: 1.6.1 fs-extra: 11.3.1 - ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) + ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) inquirer: 12.9.1(@types/node@22.14.0) js-yaml: 4.1.0 react: 18.3.1 @@ -5066,11 +5063,11 @@ packages: - utf-8-validate dev: true - /@mintlify/common@1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + /@mintlify/common@1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-yYwEfKJOjH+X8B13b5cjbpy3X1bSjEhxSFAVFhGFNbM5eT8f0S/Yu3i+jcJXbkl+5zifa4b4Mh4Vk7oUhXRxuQ==} dependencies: '@asyncapi/parser': 3.4.0 - '@mintlify/mdx': 2.0.5(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/mdx': 2.0.5(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1) '@mintlify/models': 0.0.210 '@mintlify/openapi-parser': 0.0.7 '@mintlify/validation': 0.1.421 @@ -5114,13 +5111,13 @@ packages: - supports-color dev: true - /@mintlify/link-rot@3.0.583(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/link-rot@3.0.583(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-rZ47hB/lUdQhYnbH4QrBl5Sph2JTJr78LhXlKTcY226fQUD3yaRNCmk23lIkoGm7sc2gQEIuPW+guPL8KJx8XA==} engines: {node: '>=18.0.0'} dependencies: - '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) - '@mintlify/previewing': 4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/previewing': 4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 fs-extra: 11.3.1 unist-util-visit: 4.1.2 @@ -5138,7 +5135,7 @@ packages: - utf-8-validate dev: true - /@mintlify/mdx@2.0.5(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1): + /@mintlify/mdx@2.0.5(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-9WpFDRFqET1ovHWooi+fvWJorvYgEf2BjG65R8tUjqjTWzWqBbNVpumpoAojNqi7i7m0NeZami2oAOxqCyoy4g==} peerDependencies: react: ^18.3.1 @@ -5147,7 +5144,7 @@ packages: '@shikijs/transformers': 3.11.0 hast-util-to-string: 3.0.1 mdast-util-mdx-jsx: 3.2.0 - next-mdx-remote-client: 1.1.2(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5) + next-mdx-remote-client: 1.1.2(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rehype-katex: 7.0.1 @@ -5185,12 +5182,12 @@ packages: yaml: 2.8.1 dev: true - /@mintlify/prebuild@1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/prebuild@1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-qEK9BXkAUWvUn0EXa2mstrJDDQO5qxeJYPMD+gfbcHaIJ6suJ6eZSC0VMDpouUra+YxZGHM+HKI0BfeHOKCftA==} dependencies: - '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) '@mintlify/openapi-parser': 0.0.7 - '@mintlify/scraping': 4.0.314(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/scraping': 4.0.314(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 chalk: 5.6.2 favicons: 7.2.0 @@ -5213,12 +5210,12 @@ packages: - utf-8-validate dev: true - /@mintlify/previewing@4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): + /@mintlify/previewing@4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-s51OZTAsRe4GDSoHf19CKBPZgSS5heqC9n+ENsAej22sd1tN8oGHl2Fw2rgSt7VgxdcINu/yXsEt9sgS2LPz7g==} engines: {node: '>=18.0.0'} dependencies: - '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 better-opn: 3.0.2 chalk: 5.6.2 @@ -5227,7 +5224,7 @@ packages: fs-extra: 11.3.1 got: 13.0.0 gray-matter: 4.0.3 - ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) + ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) ink-spinner: 5.0.0(ink@5.2.1)(react@18.3.1) is-online: 10.0.0 js-yaml: 4.1.0 @@ -5251,12 +5248,12 @@ packages: - utf-8-validate dev: true - /@mintlify/scraping@4.0.314(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/scraping@4.0.314(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-vPNUJpYSXllf5A+hiSBze3urMkNzKn8CeQ58cu7CzIco05h8hH0hnZYG8JaBCReXk3kfosSiDB4veY9EBEsB0w==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) '@mintlify/openapi-parser': 0.0.7 fs-extra: 11.3.1 hast-util-to-mdast: 10.1.2 @@ -5713,12 +5710,12 @@ packages: '@oclif/core': 4.5.3 dev: true - /@oclif/plugin-not-found@3.2.67(@types/node@20.14.9): + /@oclif/plugin-not-found@3.2.67(@types/node@24.3.1): resolution: {integrity: sha512-Q2VluSwTrh7Sk0ey88Lk5WSATn9AZ6TjYQIyt2QrQolOBErAgpDoDSMVRYuVNtjxPBTDBzz4MM54QRFa/nN4IQ==} engines: {node: '>=18.0.0'} dependencies: - '@inquirer/prompts': 7.8.4(@types/node@20.14.9) - '@oclif/core': 4.5.3 + '@inquirer/prompts': 7.8.4(@types/node@24.3.1) + '@oclif/core': 4.5.2 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -5928,7 +5925,7 @@ packages: typescript: 5.7.3 dev: false - /@onetyped/zod@1.0.1(@onetyped/core@0.1.1)(zod@3.23.8): + /@onetyped/zod@1.0.1(@onetyped/core@0.1.1)(zod@4.1.5): resolution: {integrity: sha512-yOBNubxhoI2tgZZfYoGxjIFAdHNr8kkkQWDgSXNA4ZPcCayPo32iTYUFUr+MyUIsVpL3Erki3iX7Adt5o4esAw==} peerDependencies: '@onetyped/core': '*' @@ -5938,7 +5935,7 @@ packages: optional: true dependencies: '@onetyped/core': 0.1.1 - zod: 3.23.8 + zod: 4.1.5 dev: false /@openapi-contrib/openapi-schema-to-json-schema@3.2.0: @@ -9236,7 +9233,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@react-email/render@1.0.6(react-dom@18.3.1)(react@18.3.1): + /@react-email/render@1.0.6(react-dom@19.1.1)(react@18.3.1): resolution: {integrity: sha512-zNueW5Wn/4jNC1c5LFgXzbUdv5Lhms+FWjOvWAhal7gx5YVf0q6dPJ0dnR70+ifo59gcMLwCZEaTS9EEuUhKvQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -9246,7 +9243,7 @@ packages: html-to-text: 9.0.5 prettier: 3.5.3 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react-dom: 19.1.1(react@18.3.1) react-promise-suspense: 0.3.4 dev: false @@ -10250,7 +10247,7 @@ packages: /@types/accepts@1.3.7: resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} dependencies: - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/archiver@6.0.3: @@ -10267,7 +10264,7 @@ packages: resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/chai@5.2.2: @@ -10279,7 +10276,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/content-disposition@0.5.9: @@ -10289,7 +10286,7 @@ packages: /@types/conventional-commits-parser@5.0.1: resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} dependencies: - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: true optional: true @@ -10307,7 +10304,7 @@ packages: '@types/connect': 3.4.38 '@types/express': 4.17.23 '@types/keygrip': 1.0.6 - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/cors@2.8.19: @@ -10392,7 +10389,7 @@ packages: /@types/es-aggregate-error@1.0.6: resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true /@types/eslint-scope@3.7.7: @@ -10420,7 +10417,7 @@ packages: /@types/express-serve-static-core@4.19.6: resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} dependencies: - '@types/node': 20.14.9 + '@types/node': 22.14.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -10545,6 +10542,12 @@ packages: undici-types: 6.19.8 dev: true + /@types/node@24.3.1: + resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} + dependencies: + undici-types: 7.10.0 + dev: true + /@types/prismjs@1.26.5: resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} dev: false @@ -10571,30 +10574,36 @@ packages: '@types/prop-types': 15.7.15 csstype: 3.1.3 + /@types/react@19.1.12: + resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + dependencies: + csstype: 3.1.3 + dev: true + /@types/readable-stream@4.0.21: resolution: {integrity: sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true /@types/readdir-glob@1.1.5: resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true /@types/send@0.17.5: resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/serve-static@1.15.8: resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} dependencies: '@types/http-errors': 2.0.5 - '@types/node': 20.14.9 + '@types/node': 22.14.0 '@types/send': 0.17.5 dev: false @@ -10605,13 +10614,13 @@ packages: /@types/ssh2-streams@0.1.12: resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 '@types/ssh2-streams': 0.1.12 dev: true @@ -10647,14 +10656,14 @@ packages: /@types/ws@8.18.1: resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 20.14.9 + '@types/node': 24.3.1 dev: true optional: true @@ -12122,8 +12131,8 @@ packages: engines: {node: '>= 16'} dev: true - /checkly@6.5.0(@types/node@20.14.9)(typescript@5.5.3): - resolution: {integrity: sha512-i90/P+sWL6CmTBRGOHXFAogisrDdomE928XKSaw2g4t9e2dVGcaDfQ72ZdXFCm27gVQd7siXPGrO6LNFwyEsWg==} + /checkly@6.2.1(@types/node@24.3.1)(typescript@5.5.3): + resolution: {integrity: sha512-xD6EV9A5AxH6397YJWYLvyg4WGI1Nheaw2lh4Hoyk/S4TQVoKCX01XxZfDQwc5XHQI7i7FLB0XKH8B2k6PVwBw==} engines: {node: ^18.19.0 || >=20.5.0} hasBin: true peerDependencies: @@ -12134,7 +12143,7 @@ packages: dependencies: '@oclif/core': 4.5.3 '@oclif/plugin-help': 6.2.32 - '@oclif/plugin-not-found': 3.2.67(@types/node@20.14.9) + '@oclif/plugin-not-found': 3.2.67(@types/node@24.3.1) '@oclif/plugin-plugins': 5.4.46 '@oclif/plugin-warn-if-update-available': 3.1.46 '@types/archiver': 6.0.3 @@ -13538,7 +13547,7 @@ packages: engines: {node: '>=10.2.0'} dependencies: '@types/cors': 2.8.19 - '@types/node': 20.14.9 + '@types/node': 24.3.1 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -15907,11 +15916,11 @@ packages: react: '>=18.0.0' dependencies: cli-spinners: 2.9.2 - ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) + ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) react: 18.3.1 dev: true - /ink@5.2.1(@types/react@18.3.11)(react@18.3.1): + /ink@5.2.1(@types/react@19.1.12)(react@18.3.1): resolution: {integrity: sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==} engines: {node: '>=18'} peerDependencies: @@ -15925,7 +15934,7 @@ packages: optional: true dependencies: '@alcalzone/ansi-tokenize': 0.1.3 - '@types/react': 18.3.11 + '@types/react': 19.1.12 ansi-escapes: 7.0.0 ansi-styles: 6.2.3 auto-bind: 5.0.1 @@ -17763,12 +17772,12 @@ packages: minipass: 7.1.2 dev: true - /mintlify@4.2.31(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): + /mintlify@4.2.31(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-DFDlm0KRUGcnaO2kAw3QpAIVXQ4qUy63OSOzwleKLN+sqJJJIc8cd5rfd98v5ORmPtf0YJJQGNX6SvsvIxOHCQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/cli': 4.0.635(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/cli': 4.0.635(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) transitivePeerDependencies: - '@types/node' - '@types/react' @@ -17969,7 +17978,7 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /next-mdx-remote-client@1.1.2(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5): + /next-mdx-remote-client@1.1.2(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5): resolution: {integrity: sha512-LZJxBU420dTZsbWOrNYZXkahGJu8lNKxLTrQrZl4JUsKeFtp91yA78dHMTfOcp7UAud3txhM1tayyoKFq4tw7A==} engines: {node: '>=18.18.0'} peerDependencies: @@ -17978,7 +17987,7 @@ packages: dependencies: '@babel/code-frame': 7.27.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) - '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) + '@mdx-js/react': 3.1.0(@types/react@19.1.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) remark-mdx-remove-esm: 1.2.0(unified@11.0.5) @@ -18498,7 +18507,7 @@ packages: is-wsl: 2.2.0 dev: true - /openai@4.78.1(zod@3.23.8): + /openai@4.78.1(zod@4.1.5): resolution: {integrity: sha512-drt0lHZBd2lMyORckOXFPQTmnGLWSLt8VK0W9BhOKWpMFBEoHMoz5gxMPmVq5icp+sOrsbMnsmZTVHUlKvD1Ow==} hasBin: true peerDependencies: @@ -18514,7 +18523,7 @@ packages: form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0 - zod: 3.23.8 + zod: 4.1.5 transitivePeerDependencies: - encoding dev: false @@ -19240,7 +19249,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.9 + '@types/node': 24.3.1 long: 5.3.2 dev: true @@ -19432,6 +19441,15 @@ packages: react: 18.3.1 scheduler: 0.23.2 + /react-dom@19.1.1(react@18.3.1): + resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} + peerDependencies: + react: ^19.1.1 + dependencies: + react: 18.3.1 + scheduler: 0.26.0 + dev: false + /react-element-to-jsx-string@15.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} peerDependencies: @@ -20076,11 +20094,11 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false - /resend@4.4.0(react-dom@18.3.1)(react@18.3.1): + /resend@4.4.0(react-dom@19.1.1)(react@18.3.1): resolution: {integrity: sha512-SmVI3JCpgPNt4/m3Uy403LjoSeeleUE2X+KwPYQZcw+jiBCFsqL6vdf1r/XuQ7yOjvxYmlI8GD/oIWonFF9t9w==} engines: {node: '>=18'} dependencies: - '@react-email/render': 1.0.6(react-dom@18.3.1)(react@18.3.1) + '@react-email/render': 1.0.6(react-dom@19.1.1)(react@18.3.1) transitivePeerDependencies: - react - react-dom @@ -20338,6 +20356,10 @@ packages: dependencies: loose-envify: 1.4.0 + /scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + dev: false + /schema-utils@4.3.2: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} @@ -20705,7 +20727,7 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.3 + ansi-styles: 6.2.1 is-fullwidth-code-point: 5.1.0 dev: true @@ -21716,7 +21738,7 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /trpc-tools@0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@3.23.8): + /trpc-tools@0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@4.1.5): resolution: {integrity: sha512-Zn21JotBHNM64hgvljZ3yjPEsGfFMD86Oa+oGbYVaOLAW5NVVm80UM2H5w5cPh+z8VFSvY8DMflH7maBb/iexg==} hasBin: true peerDependencies: @@ -21728,7 +21750,7 @@ packages: '@octokit/core': 5.2.2 '@onetyped/core': 0.1.1 '@onetyped/typescript': 1.0.1(@onetyped/core@0.1.1)(typescript@5.7.3) - '@onetyped/zod': 1.0.1(@onetyped/core@0.1.1)(zod@3.23.8) + '@onetyped/zod': 1.0.1(@onetyped/core@0.1.1)(zod@4.1.5) '@trpc/server': 10.45.2 bundle-require: 4.2.1(esbuild@0.18.20) chalk: 5.6.0 @@ -21767,7 +21789,7 @@ packages: code-block-writer: 13.0.3 dev: false - /ts-node@10.9.1(@types/node@20.14.9)(typescript@5.5.3): + /ts-node@10.9.1(@types/node@24.3.1)(typescript@5.5.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -21786,7 +21808,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.9 + '@types/node': 24.3.1 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -22146,6 +22168,10 @@ packages: /undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + /undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + dev: true + /undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -23724,5 +23750,9 @@ packages: /zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + /zod@4.1.5: + resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} + dev: false + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From dd7856d67d68d6ba5829a883335f2fd12fe84f36 Mon Sep 17 00:00:00 2001 From: Andreas Thomas Date: Tue, 9 Sep 2025 07:53:30 +0200 Subject: [PATCH 03/12] feat: sync drizzle to go/pkg/db/schema.sql (#3920) * feat: sync drizzle to go/pkg/db/schema.sql * fix: upgrade drizzle-kit to use required flag * fix: autogeneration notice --------- Co-authored-by: Flo <53355483+Flo4604@users.noreply.github.com> --- pnpm-lock.yaml | 202 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 176 insertions(+), 26 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2217015ce4..670e46e274 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -726,7 +726,7 @@ importers: version: 5.7.3 vitest: specifier: ^1.6.1 - version: 1.6.1(@types/node@22.14.0)(@vitest/ui@3.2.4)(jsdom@26.0.0) + version: 1.6.1 internal/events: dependencies: @@ -1597,7 +1597,6 @@ packages: /@babel/runtime@7.28.4: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/types@7.28.2: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} @@ -2206,6 +2205,10 @@ packages: - supports-color dev: true + /@drizzle-team/brocli@0.10.2: + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + dev: true + /@emnapi/runtime@1.5.0: resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} requiresBuild: true @@ -5679,8 +5682,8 @@ packages: fastq: 1.19.1 dev: true - /@oclif/core@4.5.3: - resolution: {integrity: sha512-ISoFlfmsuxJvNKXhabCO4/KqNXDQdLHchZdTPfZbtqAsQbqTw5IKitLVZq9Sz1LWizN37HILp4u0350B8scBjg==} + /@oclif/core@4.5.2: + resolution: {integrity: sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==} engines: {node: '>=18.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -5706,6 +5709,25 @@ packages: /@oclif/plugin-help@6.2.32: resolution: {integrity: sha512-LrmMdo9EMJciOvF8UurdoTcTMymv5npKtxMAyonZvhSvGR8YwCKnuHIh00+SO2mNtGOYam7f4xHnUmj2qmanyA==} engines: {node: '>=18.0.0'} + dependencies: + '@oclif/core': 4.5.2 + dev: true + + /@oclif/plugin-not-found@3.2.67(@types/node@24.3.1): + resolution: {integrity: sha512-Q2VluSwTrh7Sk0ey88Lk5WSATn9AZ6TjYQIyt2QrQolOBErAgpDoDSMVRYuVNtjxPBTDBzz4MM54QRFa/nN4IQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@inquirer/prompts': 7.8.4(@types/node@24.3.1) + '@oclif/core': 4.5.2 + ansis: 3.17.0 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@oclif/plugin-plugins@5.4.46: + resolution: {integrity: sha512-VSk+SwKDkGShuRGC5f5WNF/U6Y8JvLfzIaWjLxMe4GlBmln0mKhHqvcfJc2gZOiyJp1QYK638H1w/peSkoZHag==} + engines: {node: '>=18.0.0'} dependencies: '@oclif/core': 4.5.3 dev: true @@ -5745,7 +5767,7 @@ packages: resolution: {integrity: sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.3 + '@oclif/core': 4.5.2 ansis: 3.17.0 debug: 4.4.1(supports-color@8.1.1) http-call: 5.3.0 @@ -10476,7 +10498,7 @@ packages: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 20.14.9 + '@types/node': 22.14.0 dev: false /@types/mdast@4.0.4: @@ -10667,22 +10689,22 @@ packages: dev: true optional: true - /@typescript-eslint/project-service@8.43.0(typescript@5.5.3): - resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} + /@typescript-eslint/project-service@8.42.0(typescript@5.5.3): + resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) + '@typescript-eslint/types': 8.42.0 debug: 4.4.1(supports-color@8.1.1) typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.5.3): - resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} + /@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.5.3): + resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10690,21 +10712,21 @@ packages: typescript: 5.5.3 dev: true - /@typescript-eslint/types@8.43.0: - resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} + /@typescript-eslint/types@8.42.0: + resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.43.0(typescript@5.5.3): - resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} + /@typescript-eslint/typescript-estree@8.42.0(typescript@5.5.3): + resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.43.0(typescript@5.5.3) - '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/visitor-keys': 8.43.0 + '@typescript-eslint/project-service': 8.42.0(typescript@5.5.3) + '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) + '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/visitor-keys': 8.42.0 debug: 4.4.1(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 @@ -10716,11 +10738,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@8.43.0: - resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} + /@typescript-eslint/visitor-keys@8.42.0: + resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/types': 8.42.0 eslint-visitor-keys: 4.2.1 dev: true @@ -12141,13 +12163,13 @@ packages: jiti: optional: true dependencies: - '@oclif/core': 4.5.3 + '@oclif/core': 4.5.2 '@oclif/plugin-help': 6.2.32 '@oclif/plugin-not-found': 3.2.67(@types/node@24.3.1) '@oclif/plugin-plugins': 5.4.46 '@oclif/plugin-warn-if-update-available': 3.1.46 '@types/archiver': 6.0.3 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.5.3) acorn: 8.15.0 acorn-walk: 8.3.4 archiver: 7.0.1 @@ -12962,6 +12984,18 @@ packages: dependencies: ms: 2.1.3 + /debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /debug@4.4.1(supports-color@8.1.1): resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -13743,7 +13777,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.1 esbuild: 0.25.9 transitivePeerDependencies: - supports-color @@ -22506,6 +22540,28 @@ packages: d3-timer: 3.0.1 dev: false + /vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.4.1 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-node@1.6.1(@types/node@20.14.9): resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -22600,6 +22656,44 @@ packages: - yaml dev: true + /vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.48.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vite@5.4.19(@types/node@20.14.9): resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -22780,6 +22874,62 @@ packages: fsevents: 2.3.3 dev: true + /vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.4 + chai: 4.5.0 + debug: 4.4.1 + execa: 8.0.1 + local-pkg: 0.5.1 + magic-string: 0.30.18 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.19 + vite-node: 1.6.1 + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + dev: true + /vitest@1.6.1(@types/node@20.14.9)(@vitest/ui@3.2.4): resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} engines: {node: ^18.0.0 || >=20.0.0} From 5e933dba17adaade5994708a7402c09c08ab6a4a Mon Sep 17 00:00:00 2001 From: Andreas Thomas Date: Tue, 9 Sep 2025 08:18:09 +0200 Subject: [PATCH 04/12] feat: script to notify users to migrate to v2 (#3924) * feat: script to notify users to migrate to v2 * Apply suggestions from code review * [autofix.ci] apply automated fixes * fix: address james' feedback * merge * fix: exclude analytics --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 887 ++++++++++++++++--------------------------------- 1 file changed, 294 insertions(+), 593 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 670e46e274..c5982ba6d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -446,7 +446,7 @@ importers: devDependencies: mintlify: specifier: ^4.2.31 - version: 4.2.31(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) + version: 4.2.31(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) apps/engineering: dependencies: @@ -608,7 +608,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8) + version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8) zod: specifier: 3.23.8 version: 3.23.8 @@ -630,10 +630,10 @@ importers: devDependencies: checkly: specifier: latest - version: 6.2.1(@types/node@24.3.1)(typescript@5.5.3) + version: 6.5.0(@types/node@20.14.9)(typescript@5.5.3) ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@24.3.1)(typescript@5.5.3) + version: 10.9.1(@types/node@20.14.9)(typescript@5.5.3) typescript: specifier: 5.5.3 version: 5.5.3 @@ -726,7 +726,7 @@ importers: version: 5.7.3 vitest: specifier: ^1.6.1 - version: 1.6.1 + version: 1.6.1(@types/node@22.14.0)(@vitest/ui@3.2.4)(jsdom@26.0.0) internal/events: dependencies: @@ -876,10 +876,10 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(eslint@9.35.0) + version: 2.1.1(eslint@9.34.0) resend: specifier: ^4.4.0 - version: 4.4.0(react-dom@19.1.1)(react@18.3.1) + version: 4.4.0(react-dom@18.3.1)(react@18.3.1) devDependencies: '@types/node': specifier: ^20.14.9 @@ -925,7 +925,7 @@ importers: version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.0.3 version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -934,7 +934,7 @@ importers: version: 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@unkey/icons': specifier: workspace:^ version: link:../icons @@ -1582,22 +1582,18 @@ packages: '@babel/types': 7.28.2 dev: false - /@babel/parser@7.28.4: - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + /@babel/parser@7.28.3: + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.2 dev: false /@babel/runtime@7.28.3: resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} engines: {node: '>=6.9.0'} - /@babel/runtime@7.28.4: - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - /@babel/types@7.28.2: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} @@ -1606,14 +1602,6 @@ packages: '@babel/helper-validator-identifier': 7.27.1 dev: false - /@babel/types@7.28.4: - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - dev: false - /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} dev: true @@ -2209,8 +2197,8 @@ packages: resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} dev: true - /@emnapi/runtime@1.5.0: - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + /@emnapi/runtime@1.4.5: + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} requiresBuild: true dependencies: tslib: 2.8.1 @@ -3692,13 +3680,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.9.0(eslint@9.35.0): - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + /@eslint-community/eslint-utils@4.7.0(eslint@9.34.0): + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.35.0 + eslint: 9.34.0 eslint-visitor-keys: 3.4.3 dev: false @@ -3747,8 +3735,8 @@ packages: - supports-color dev: false - /@eslint/js@9.35.0: - resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} + /@eslint/js@9.34.0: + resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -3874,12 +3862,12 @@ packages: engines: {node: '>=18.18.0'} dev: false - /@humanfs/node@0.16.7: - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + /@humanfs/node@0.16.6: + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/retry': 0.3.1 dev: false /@humanwhocodes/module-importer@1.0.1: @@ -3887,6 +3875,11 @@ packages: engines: {node: '>=12.22'} dev: false + /@humanwhocodes/retry@0.3.1: + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + dev: false + /@humanwhocodes/retry@0.4.3: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -4221,7 +4214,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.4.5 dev: true optional: true @@ -4231,7 +4224,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.5.0 + '@emnapi/runtime': 1.4.5 dev: false optional: true @@ -4280,7 +4273,7 @@ packages: dev: false optional: true - /@inquirer/checkbox@4.2.2(@types/node@22.14.0): + /@inquirer/checkbox@4.2.2(@types/node@20.14.9): resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} engines: {node: '>=18'} peerDependencies: @@ -4289,15 +4282,15 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/core': 10.2.0(@types/node@20.14.9) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/checkbox@4.2.2(@types/node@24.3.1): + /@inquirer/checkbox@4.2.2(@types/node@22.14.0): resolution: {integrity: sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==} engines: {node: '>=18'} peerDependencies: @@ -4306,15 +4299,15 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/core': 10.2.0(@types/node@22.14.0) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/confirm@5.1.16(@types/node@22.14.0): + /@inquirer/confirm@5.1.16(@types/node@20.14.9): resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} engines: {node: '>=18'} peerDependencies: @@ -4323,12 +4316,12 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 dev: true - /@inquirer/confirm@5.1.16(@types/node@24.3.1): + /@inquirer/confirm@5.1.16(@types/node@22.14.0): resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} engines: {node: '>=18'} peerDependencies: @@ -4337,12 +4330,12 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 dev: true - /@inquirer/core@10.2.0(@types/node@22.14.0): + /@inquirer/core@10.2.0(@types/node@20.14.9): resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} engines: {node: '>=18'} peerDependencies: @@ -4352,8 +4345,8 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -4362,7 +4355,7 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/core@10.2.0(@types/node@24.3.1): + /@inquirer/core@10.2.0(@types/node@22.14.0): resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} engines: {node: '>=18'} peerDependencies: @@ -4372,8 +4365,8 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -4382,7 +4375,7 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/editor@4.2.18(@types/node@22.14.0): + /@inquirer/editor@4.2.18(@types/node@20.14.9): resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} engines: {node: '>=18'} peerDependencies: @@ -4391,13 +4384,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) - '@inquirer/external-editor': 1.0.1(@types/node@22.14.0) - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/external-editor': 1.0.1(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 dev: true - /@inquirer/editor@4.2.18(@types/node@24.3.1): + /@inquirer/editor@4.2.18(@types/node@22.14.0): resolution: {integrity: sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==} engines: {node: '>=18'} peerDependencies: @@ -4406,13 +4399,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/external-editor': 1.0.1(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/external-editor': 1.0.1(@types/node@22.14.0) + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 dev: true - /@inquirer/expand@4.0.18(@types/node@22.14.0): + /@inquirer/expand@4.0.18(@types/node@20.14.9): resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} engines: {node: '>=18'} peerDependencies: @@ -4421,13 +4414,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@22.14.0) - '@inquirer/type': 3.0.8(@types/node@22.14.0) - '@types/node': 22.14.0 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/expand@4.0.18(@types/node@24.3.1): + /@inquirer/expand@4.0.18(@types/node@22.14.0): resolution: {integrity: sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==} engines: {node: '>=18'} peerDependencies: @@ -4436,13 +4429,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@22.14.0) + '@inquirer/type': 3.0.8(@types/node@22.14.0) + '@types/node': 22.14.0 yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/external-editor@1.0.1(@types/node@22.14.0): + /@inquirer/external-editor@1.0.1(@types/node@20.14.9): resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} engines: {node: '>=18'} peerDependencies: @@ -4451,12 +4444,12 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 22.14.0 + '@types/node': 20.14.9 chardet: 2.1.0 iconv-lite: 0.6.3 dev: true - /@inquirer/external-editor@1.0.1(@types/node@24.3.1): + /@inquirer/external-editor@1.0.1(@types/node@22.14.0): resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} engines: {node: '>=18'} peerDependencies: @@ -4465,7 +4458,7 @@ packages: '@types/node': optional: true dependencies: - '@types/node': 24.3.1 + '@types/node': 22.14.0 chardet: 2.1.0 iconv-lite: 0.6.3 dev: true @@ -4475,6 +4468,20 @@ packages: engines: {node: '>=18'} dev: true + /@inquirer/input@4.2.2(@types/node@20.14.9): + resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 + dev: true + /@inquirer/input@4.2.2(@types/node@22.14.0): resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} engines: {node: '>=18'} @@ -4489,8 +4496,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/input@4.2.2(@types/node@24.3.1): - resolution: {integrity: sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==} + /@inquirer/number@3.0.18(@types/node@20.14.9): + resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4498,9 +4505,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 dev: true /@inquirer/number@3.0.18(@types/node@22.14.0): @@ -4517,8 +4524,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/number@3.0.18(@types/node@24.3.1): - resolution: {integrity: sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==} + /@inquirer/password@4.0.18(@types/node@20.14.9): + resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4526,9 +4533,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 + ansi-escapes: 4.3.2 dev: true /@inquirer/password@4.0.18(@types/node@22.14.0): @@ -4546,8 +4554,8 @@ packages: ansi-escapes: 4.3.2 dev: true - /@inquirer/password@4.0.18(@types/node@24.3.1): - resolution: {integrity: sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==} + /@inquirer/prompts@7.8.4(@types/node@20.14.9): + resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4555,10 +4563,17 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 - ansi-escapes: 4.3.2 + '@inquirer/checkbox': 4.2.2(@types/node@20.14.9) + '@inquirer/confirm': 5.1.16(@types/node@20.14.9) + '@inquirer/editor': 4.2.18(@types/node@20.14.9) + '@inquirer/expand': 4.0.18(@types/node@20.14.9) + '@inquirer/input': 4.2.2(@types/node@20.14.9) + '@inquirer/number': 3.0.18(@types/node@20.14.9) + '@inquirer/password': 4.0.18(@types/node@20.14.9) + '@inquirer/rawlist': 4.1.6(@types/node@20.14.9) + '@inquirer/search': 3.1.1(@types/node@20.14.9) + '@inquirer/select': 4.3.2(@types/node@20.14.9) + '@types/node': 20.14.9 dev: true /@inquirer/prompts@7.8.4(@types/node@22.14.0): @@ -4583,8 +4598,8 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/prompts@7.8.4(@types/node@24.3.1): - resolution: {integrity: sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==} + /@inquirer/rawlist@4.1.6(@types/node@20.14.9): + resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4592,17 +4607,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/checkbox': 4.2.2(@types/node@24.3.1) - '@inquirer/confirm': 5.1.16(@types/node@24.3.1) - '@inquirer/editor': 4.2.18(@types/node@24.3.1) - '@inquirer/expand': 4.0.18(@types/node@24.3.1) - '@inquirer/input': 4.2.2(@types/node@24.3.1) - '@inquirer/number': 3.0.18(@types/node@24.3.1) - '@inquirer/password': 4.0.18(@types/node@24.3.1) - '@inquirer/rawlist': 4.1.6(@types/node@24.3.1) - '@inquirer/search': 3.1.1(@types/node@24.3.1) - '@inquirer/select': 4.3.2(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 + yoctocolors-cjs: 2.1.3 dev: true /@inquirer/rawlist@4.1.6(@types/node@22.14.0): @@ -4620,8 +4628,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/rawlist@4.1.6(@types/node@24.3.1): - resolution: {integrity: sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==} + /@inquirer/search@3.1.1(@types/node@20.14.9): + resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4629,9 +4637,10 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/core': 10.2.0(@types/node@20.14.9) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 yoctocolors-cjs: 2.1.3 dev: true @@ -4651,8 +4660,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/search@3.1.1(@types/node@24.3.1): - resolution: {integrity: sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==} + /@inquirer/select@4.3.2(@types/node@20.14.9): + resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4660,10 +4669,11 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) + '@inquirer/core': 10.2.0(@types/node@20.14.9) '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 + '@inquirer/type': 3.0.8(@types/node@20.14.9) + '@types/node': 20.14.9 + ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.3 dev: true @@ -4684,8 +4694,8 @@ packages: yoctocolors-cjs: 2.1.3 dev: true - /@inquirer/select@4.3.2(@types/node@24.3.1): - resolution: {integrity: sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==} + /@inquirer/type@3.0.8(@types/node@20.14.9): + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -4693,12 +4703,7 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.2.0(@types/node@24.3.1) - '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@24.3.1) - '@types/node': 24.3.1 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 + '@types/node': 20.14.9 dev: true /@inquirer/type@3.0.8(@types/node@22.14.0): @@ -4713,18 +4718,6 @@ packages: '@types/node': 22.14.0 dev: true - /@inquirer/type@3.0.8(@types/node@24.3.1): - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@types/node': 24.3.1 - dev: true - /@isaacs/balanced-match@4.0.1: resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -5008,14 +5001,14 @@ packages: - acorn - supports-color - /@mdx-js/react@3.1.0(@types/react@19.1.12)(react@18.3.1): + /@mdx-js/react@3.1.0(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} peerDependencies: '@types/react': '>=16' react: '>=16' dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.12 + '@types/react': 18.3.11 react: 18.3.1 dev: true @@ -5032,21 +5025,21 @@ packages: - ws dev: false - /@mintlify/cli@4.0.635(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): + /@mintlify/cli@4.0.635(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-jvTcEz3Zt31AQG9K+VBzJujssYKL6ED5NHeajsoysH2aJzLM8Xp7h+JPseVZmeDUU7jp+yCF/fNeGmmlUQXyqQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/link-rot': 3.0.583(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/link-rot': 3.0.583(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/models': 0.0.210 - '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) - '@mintlify/previewing': 4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/previewing': 4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 chalk: 5.6.0 detect-port: 1.6.1 fs-extra: 11.3.1 - ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) + ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) inquirer: 12.9.1(@types/node@22.14.0) js-yaml: 4.1.0 react: 18.3.1 @@ -5066,11 +5059,11 @@ packages: - utf-8-validate dev: true - /@mintlify/common@1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1): + /@mintlify/common@1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-yYwEfKJOjH+X8B13b5cjbpy3X1bSjEhxSFAVFhGFNbM5eT8f0S/Yu3i+jcJXbkl+5zifa4b4Mh4Vk7oUhXRxuQ==} dependencies: '@asyncapi/parser': 3.4.0 - '@mintlify/mdx': 2.0.5(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/mdx': 2.0.5(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1) '@mintlify/models': 0.0.210 '@mintlify/openapi-parser': 0.0.7 '@mintlify/validation': 0.1.421 @@ -5114,13 +5107,13 @@ packages: - supports-color dev: true - /@mintlify/link-rot@3.0.583(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/link-rot@3.0.583(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-rZ47hB/lUdQhYnbH4QrBl5Sph2JTJr78LhXlKTcY226fQUD3yaRNCmk23lIkoGm7sc2gQEIuPW+guPL8KJx8XA==} engines: {node: '>=18.0.0'} dependencies: - '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) - '@mintlify/previewing': 4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/previewing': 4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 fs-extra: 11.3.1 unist-util-visit: 4.1.2 @@ -5138,7 +5131,7 @@ packages: - utf-8-validate dev: true - /@mintlify/mdx@2.0.5(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1): + /@mintlify/mdx@2.0.5(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-9WpFDRFqET1ovHWooi+fvWJorvYgEf2BjG65R8tUjqjTWzWqBbNVpumpoAojNqi7i7m0NeZami2oAOxqCyoy4g==} peerDependencies: react: ^18.3.1 @@ -5147,7 +5140,7 @@ packages: '@shikijs/transformers': 3.11.0 hast-util-to-string: 3.0.1 mdast-util-mdx-jsx: 3.2.0 - next-mdx-remote-client: 1.1.2(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5) + next-mdx-remote-client: 1.1.2(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rehype-katex: 7.0.1 @@ -5185,12 +5178,12 @@ packages: yaml: 2.8.1 dev: true - /@mintlify/prebuild@1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/prebuild@1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-qEK9BXkAUWvUn0EXa2mstrJDDQO5qxeJYPMD+gfbcHaIJ6suJ6eZSC0VMDpouUra+YxZGHM+HKI0BfeHOKCftA==} dependencies: - '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@mintlify/openapi-parser': 0.0.7 - '@mintlify/scraping': 4.0.314(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/scraping': 4.0.314(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 chalk: 5.6.2 favicons: 7.2.0 @@ -5213,12 +5206,12 @@ packages: - utf-8-validate dev: true - /@mintlify/previewing@4.0.620(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): + /@mintlify/previewing@4.0.620(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-s51OZTAsRe4GDSoHf19CKBPZgSS5heqC9n+ENsAej22sd1tN8oGHl2Fw2rgSt7VgxdcINu/yXsEt9sgS2LPz7g==} engines: {node: '>=18.0.0'} dependencies: - '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) - '@mintlify/prebuild': 1.0.576(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) + '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/prebuild': 1.0.576(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3) '@mintlify/validation': 0.1.421 better-opn: 3.0.2 chalk: 5.6.2 @@ -5227,7 +5220,7 @@ packages: fs-extra: 11.3.1 got: 13.0.0 gray-matter: 4.0.3 - ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) + ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) ink-spinner: 5.0.0(ink@5.2.1)(react@18.3.1) is-online: 10.0.0 js-yaml: 4.1.0 @@ -5251,12 +5244,12 @@ packages: - utf-8-validate dev: true - /@mintlify/scraping@4.0.314(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): + /@mintlify/scraping@4.0.314(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-vPNUJpYSXllf5A+hiSBze3urMkNzKn8CeQ58cu7CzIco05h8hH0hnZYG8JaBCReXk3kfosSiDB4veY9EBEsB0w==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/common': 1.0.458(@types/react@19.1.12)(react-dom@18.3.1)(react@18.3.1) + '@mintlify/common': 1.0.458(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@mintlify/openapi-parser': 0.0.7 fs-extra: 11.3.1 hast-util-to-mdast: 10.1.2 @@ -5700,7 +5693,7 @@ packages: semver: 7.7.2 string-width: 4.2.3 supports-color: 8.1.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.14 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -5713,11 +5706,11 @@ packages: '@oclif/core': 4.5.2 dev: true - /@oclif/plugin-not-found@3.2.67(@types/node@24.3.1): + /@oclif/plugin-not-found@3.2.67(@types/node@20.14.9): resolution: {integrity: sha512-Q2VluSwTrh7Sk0ey88Lk5WSATn9AZ6TjYQIyt2QrQolOBErAgpDoDSMVRYuVNtjxPBTDBzz4MM54QRFa/nN4IQ==} engines: {node: '>=18.0.0'} dependencies: - '@inquirer/prompts': 7.8.4(@types/node@24.3.1) + '@inquirer/prompts': 7.8.4(@types/node@20.14.9) '@oclif/core': 4.5.2 ansis: 3.17.0 fast-levenshtein: 3.0.0 @@ -7132,7 +7125,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7662,7 +7655,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7709,35 +7702,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-popper@1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.28.4 - '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/rect': 1.0.1 - '@types/react': 18.3.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} peerDependencies: @@ -7838,7 +7802,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8151,7 +8115,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8321,46 +8285,6 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false - /@radix-ui/react-select@2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.28.3 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.11 - aria-hidden: 1.2.6 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) - dev: false - /@radix-ui/react-select@2.2.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} peerDependencies: @@ -8587,7 +8511,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8614,7 +8538,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8637,7 +8561,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8688,37 +8612,6 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@radix-ui/react-tooltip@1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.28.3 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@types/react': 18.3.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -9255,7 +9148,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@react-email/render@1.0.6(react-dom@19.1.1)(react@18.3.1): + /@react-email/render@1.0.6(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-zNueW5Wn/4jNC1c5LFgXzbUdv5Lhms+FWjOvWAhal7gx5YVf0q6dPJ0dnR70+ifo59gcMLwCZEaTS9EEuUhKvQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -9265,7 +9158,7 @@ packages: html-to-text: 9.0.5 prettier: 3.5.3 react: 18.3.1 - react-dom: 19.1.1(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) react-promise-suspense: 0.3.4 dev: false @@ -10155,7 +10048,7 @@ packages: engines: {node: '>=18'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -10269,7 +10162,7 @@ packages: /@types/accepts@1.3.7: resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} dependencies: - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/archiver@6.0.3: @@ -10286,7 +10179,7 @@ packages: resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} dependencies: '@types/connect': 3.4.38 - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/chai@5.2.2: @@ -10298,7 +10191,7 @@ packages: /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/content-disposition@0.5.9: @@ -10308,7 +10201,7 @@ packages: /@types/conventional-commits-parser@5.0.1: resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} dependencies: - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: true optional: true @@ -10326,7 +10219,7 @@ packages: '@types/connect': 3.4.38 '@types/express': 4.17.23 '@types/keygrip': 1.0.6 - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/cors@2.8.19: @@ -10411,7 +10304,7 @@ packages: /@types/es-aggregate-error@1.0.6: resolution: {integrity: sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true /@types/eslint-scope@3.7.7: @@ -10439,7 +10332,7 @@ packages: /@types/express-serve-static-core@4.19.6: resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} dependencies: - '@types/node': 22.14.0 + '@types/node': 20.14.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -10498,7 +10391,7 @@ packages: '@types/http-errors': 2.0.5 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/mdast@4.0.4: @@ -10540,13 +10433,6 @@ packages: resolution: {integrity: sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==} dependencies: undici-types: 5.26.5 - dev: false - - /@types/node@18.19.124: - resolution: {integrity: sha512-hY4YWZFLs3ku6D2Gqo3RchTd9VRCcrjqp/I0mmohYeUVA5Y8eCXKJEasHxLAJVZRJuQogfd1GiJ9lgogBgKeuQ==} - dependencies: - undici-types: 5.26.5 - dev: true /@types/node@20.14.9: resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} @@ -10564,12 +10450,6 @@ packages: undici-types: 6.19.8 dev: true - /@types/node@24.3.1: - resolution: {integrity: sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==} - dependencies: - undici-types: 7.10.0 - dev: true - /@types/prismjs@1.26.5: resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} dev: false @@ -10596,36 +10476,30 @@ packages: '@types/prop-types': 15.7.15 csstype: 3.1.3 - /@types/react@19.1.12: - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} - dependencies: - csstype: 3.1.3 - dev: true - /@types/readable-stream@4.0.21: resolution: {integrity: sha512-19eKVv9tugr03IgfXlA9UVUVRbW6IuqRO5B92Dl4a6pT7K8uaGrNS0GkxiZD0BOk6PLuXl5FhWl//eX/pzYdTQ==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true /@types/readdir-glob@1.1.5: resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true /@types/send@0.17.5: resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} dependencies: '@types/mime': 1.3.5 - '@types/node': 22.14.0 + '@types/node': 20.14.9 dev: false /@types/serve-static@1.15.8: resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.14.0 + '@types/node': 20.14.9 '@types/send': 0.17.5 dev: false @@ -10636,20 +10510,20 @@ packages: /@types/ssh2-streams@0.1.12: resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true /@types/ssh2@0.5.52: resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 '@types/ssh2-streams': 0.1.12 dev: true /@types/ssh2@1.15.5: resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} dependencies: - '@types/node': 18.19.124 + '@types/node': 18.19.123 dev: true /@types/unist@2.0.11: @@ -10678,14 +10552,14 @@ packages: /@types/ws@8.18.1: resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 24.3.1 + '@types/node': 20.14.9 dev: true optional: true @@ -10876,7 +10750,7 @@ packages: resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} dependencies: '@vitest/pretty-format': 3.0.9 - magic-string: 0.30.19 + magic-string: 0.30.18 pathe: 2.0.3 dev: true @@ -10964,78 +10838,78 @@ packages: tinyrainbow: 2.0.0 dev: true - /@vue/compiler-core@3.5.21: - resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} + /@vue/compiler-core@3.5.20: + resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} dependencies: - '@babel/parser': 7.28.4 - '@vue/shared': 3.5.21 + '@babel/parser': 7.28.3 + '@vue/shared': 3.5.20 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 dev: false - /@vue/compiler-dom@3.5.21: - resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} + /@vue/compiler-dom@3.5.20: + resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} dependencies: - '@vue/compiler-core': 3.5.21 - '@vue/shared': 3.5.21 + '@vue/compiler-core': 3.5.20 + '@vue/shared': 3.5.20 dev: false - /@vue/compiler-sfc@3.5.21: - resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} + /@vue/compiler-sfc@3.5.20: + resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} dependencies: - '@babel/parser': 7.28.4 - '@vue/compiler-core': 3.5.21 - '@vue/compiler-dom': 3.5.21 - '@vue/compiler-ssr': 3.5.21 - '@vue/shared': 3.5.21 + '@babel/parser': 7.28.3 + '@vue/compiler-core': 3.5.20 + '@vue/compiler-dom': 3.5.20 + '@vue/compiler-ssr': 3.5.20 + '@vue/shared': 3.5.20 estree-walker: 2.0.2 - magic-string: 0.30.19 + magic-string: 0.30.18 postcss: 8.5.6 source-map-js: 1.2.1 dev: false - /@vue/compiler-ssr@3.5.21: - resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} + /@vue/compiler-ssr@3.5.20: + resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} dependencies: - '@vue/compiler-dom': 3.5.21 - '@vue/shared': 3.5.21 + '@vue/compiler-dom': 3.5.20 + '@vue/shared': 3.5.20 dev: false - /@vue/reactivity@3.5.21: - resolution: {integrity: sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==} + /@vue/reactivity@3.5.20: + resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} dependencies: - '@vue/shared': 3.5.21 + '@vue/shared': 3.5.20 dev: false - /@vue/runtime-core@3.5.21: - resolution: {integrity: sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==} + /@vue/runtime-core@3.5.20: + resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} dependencies: - '@vue/reactivity': 3.5.21 - '@vue/shared': 3.5.21 + '@vue/reactivity': 3.5.20 + '@vue/shared': 3.5.20 dev: false - /@vue/runtime-dom@3.5.21: - resolution: {integrity: sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==} + /@vue/runtime-dom@3.5.20: + resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} dependencies: - '@vue/reactivity': 3.5.21 - '@vue/runtime-core': 3.5.21 - '@vue/shared': 3.5.21 + '@vue/reactivity': 3.5.20 + '@vue/runtime-core': 3.5.20 + '@vue/shared': 3.5.20 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.5.21(vue@3.5.21): - resolution: {integrity: sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==} + /@vue/server-renderer@3.5.20(vue@3.5.20): + resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} peerDependencies: - vue: 3.5.21 + vue: 3.5.20 dependencies: - '@vue/compiler-ssr': 3.5.21 - '@vue/shared': 3.5.21 - vue: 3.5.21(typescript@5.7.3) + '@vue/compiler-ssr': 3.5.20 + '@vue/shared': 3.5.20 + vue: 3.5.20(typescript@5.7.3) dev: false - /@vue/shared@3.5.21: - resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + /@vue/shared@3.5.20: + resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} dev: false /@webassemblyjs/ast@1.14.1: @@ -11269,7 +11143,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8): + /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8): resolution: {integrity: sha512-VL8Fx9euEtffzIu0BpLDZkACB+oU6zj4vHXSsSoT5VfwAzE009FJedOMPK1M4u60RpYw/DgwlD7OLN7XQfvSHw==} engines: {node: '>=18'} peerDependencies: @@ -11304,8 +11178,8 @@ packages: svelte: 4.2.20 swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.5.21) - vue: 3.5.21(typescript@5.7.3) + swrv: 1.0.4(vue@3.5.20) + vue: 3.5.20(typescript@5.7.3) zod: 3.23.8 zod-to-json-schema: 3.22.5(zod@3.23.8) dev: false @@ -11736,8 +11610,8 @@ packages: dev: true optional: true - /bare-fs@4.2.3: - resolution: {integrity: sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==} + /bare-fs@4.2.1: + resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} engines: {bare: '>=1.16.0'} requiresBuild: true peerDependencies: @@ -11894,7 +11768,7 @@ packages: /broker-factory@3.1.9: resolution: {integrity: sha512-MzvndyD6EcbkBtX4NXm/HfdO1+cOR5ONNdMCXEKfHpxGdMtuDz7+o+nJf7HMtyPH1sUVf/lEIP+DMluC5PgaBQ==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 fast-unique-numbers: 9.0.23 tslib: 2.8.1 worker-factory: 7.0.45 @@ -12048,10 +11922,6 @@ packages: /caniuse-lite@1.0.30001737: resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} - /caniuse-lite@1.0.30001741: - resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} - dev: false - /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -12153,8 +12023,8 @@ packages: engines: {node: '>= 16'} dev: true - /checkly@6.2.1(@types/node@24.3.1)(typescript@5.5.3): - resolution: {integrity: sha512-xD6EV9A5AxH6397YJWYLvyg4WGI1Nheaw2lh4Hoyk/S4TQVoKCX01XxZfDQwc5XHQI7i7FLB0XKH8B2k6PVwBw==} + /checkly@6.5.0(@types/node@20.14.9)(typescript@5.5.3): + resolution: {integrity: sha512-i90/P+sWL6CmTBRGOHXFAogisrDdomE928XKSaw2g4t9e2dVGcaDfQ72ZdXFCm27gVQd7siXPGrO6LNFwyEsWg==} engines: {node: ^18.19.0 || >=20.5.0} hasBin: true peerDependencies: @@ -12165,7 +12035,7 @@ packages: dependencies: '@oclif/core': 4.5.2 '@oclif/plugin-help': 6.2.32 - '@oclif/plugin-not-found': 3.2.67(@types/node@24.3.1) + '@oclif/plugin-not-found': 3.2.67(@types/node@20.14.9) '@oclif/plugin-plugins': 5.4.46 '@oclif/plugin-warn-if-update-available': 3.1.46 '@types/archiver': 6.0.3 @@ -12984,18 +12854,6 @@ packages: dependencies: ms: 2.1.3 - /debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - /debug@4.4.1(supports-color@8.1.1): resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -13281,7 +13139,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 csstype: 3.1.3 dev: false @@ -13510,11 +13368,6 @@ packages: /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - dev: false - - /emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} - dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13581,7 +13434,7 @@ packages: engines: {node: '>=10.2.0'} dependencies: '@types/cors': 2.8.19 - '@types/node': 24.3.1 + '@types/node': 20.14.9 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -13777,7 +13630,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.1 + debug: 4.4.1(supports-color@8.1.1) esbuild: 0.25.9 transitivePeerDependencies: - supports-color @@ -14039,31 +13892,31 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@9.35.0): + /eslint-config-prettier@9.0.0(eslint@9.34.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.35.0 + eslint: 9.34.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.35.0): + /eslint-config-turbo@1.10.12(eslint@9.34.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.35.0 - eslint-plugin-turbo: 1.10.12(eslint@9.35.0) + eslint: 9.34.0 + eslint-plugin-turbo: 1.10.12(eslint@9.34.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.35.0): + /eslint-plugin-turbo@1.10.12(eslint@9.34.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.35.0 + eslint: 9.34.0 dev: false /eslint-scope@5.1.1: @@ -14091,8 +13944,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /eslint@9.35.0: - resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} + /eslint@9.34.0: + resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -14101,15 +13954,15 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 + '@eslint/js': 9.34.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -14465,7 +14318,7 @@ packages: resolution: {integrity: sha512-jcRIaHo46nfvyvKRMaFSKXmez4jALQ3Qw49gxM5F4siz8HqkyKPPEexpCOYwBSJI1HovrDr4fEedM8QAJ7oX3w==} engines: {node: '>=18.2.0'} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 tslib: 2.8.1 dev: true @@ -15167,11 +15020,6 @@ packages: engines: {node: '>=18'} dev: true - /get-east-asian-width@1.3.1: - resolution: {integrity: sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==} - engines: {node: '>=18'} - dev: true - /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -15950,11 +15798,11 @@ packages: react: '>=18.0.0' dependencies: cli-spinners: 2.9.2 - ink: 5.2.1(@types/react@19.1.12)(react@18.3.1) + ink: 5.2.1(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 dev: true - /ink@5.2.1(@types/react@19.1.12)(react@18.3.1): + /ink@5.2.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-BqcUyWrG9zq5HIwW6JcfFHsIYebJkWWb4fczNah1goUO0vv5vneIlfwuS85twyJ5hYR/y18FlAYUxrO9ChIWVg==} engines: {node: '>=18'} peerDependencies: @@ -15968,7 +15816,7 @@ packages: optional: true dependencies: '@alcalzone/ansi-tokenize': 0.1.3 - '@types/react': 19.1.12 + '@types/react': 18.3.11 ansi-escapes: 7.0.0 ansi-styles: 6.2.3 auto-bind: 5.0.1 @@ -16236,11 +16084,11 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - /is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} engines: {node: '>=18'} dependencies: - get-east-asian-width: 1.3.1 + get-east-asian-width: 1.3.0 dev: true /is-generator-function@1.1.0: @@ -17045,12 +16893,6 @@ packages: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - dev: true - - /magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -17806,12 +17648,12 @@ packages: minipass: 7.1.2 dev: true - /mintlify@4.2.31(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3): + /mintlify@4.2.31(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3): resolution: {integrity: sha512-DFDlm0KRUGcnaO2kAw3QpAIVXQ4qUy63OSOzwleKLN+sqJJJIc8cd5rfd98v5ORmPtf0YJJQGNX6SvsvIxOHCQ==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@mintlify/cli': 4.0.635(@types/node@22.14.0)(@types/react@19.1.12)(react-dom@18.3.1)(typescript@5.7.3) + '@mintlify/cli': 4.0.635(@types/node@22.14.0)(@types/react@18.3.11)(react-dom@18.3.1)(typescript@5.7.3) transitivePeerDependencies: - '@types/node' - '@types/react' @@ -18012,7 +17854,7 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /next-mdx-remote-client@1.1.2(@types/react@19.1.12)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5): + /next-mdx-remote-client@1.1.2(@types/react@18.3.11)(acorn@8.15.0)(react-dom@18.3.1)(react@18.3.1)(unified@11.0.5): resolution: {integrity: sha512-LZJxBU420dTZsbWOrNYZXkahGJu8lNKxLTrQrZl4JUsKeFtp91yA78dHMTfOcp7UAud3txhM1tayyoKFq4tw7A==} engines: {node: '>=18.18.0'} peerDependencies: @@ -18021,7 +17863,7 @@ packages: dependencies: '@babel/code-frame': 7.27.1 '@mdx-js/mdx': 3.1.0(acorn@8.15.0) - '@mdx-js/react': 3.1.0(@types/react@19.1.12)(react@18.3.1) + '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) remark-mdx-remove-esm: 1.2.0(unified@11.0.5) @@ -18199,7 +18041,7 @@ packages: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001741 + caniuse-lite: 1.0.30001737 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -19283,7 +19125,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.3.1 + '@types/node': 20.14.9 long: 5.3.2 dev: true @@ -19475,15 +19317,6 @@ packages: react: 18.3.1 scheduler: 0.23.2 - /react-dom@19.1.1(react@18.3.1): - resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==} - peerDependencies: - react: ^19.1.1 - dependencies: - react: 18.3.1 - scheduler: 0.26.0 - dev: false - /react-element-to-jsx-string@15.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} peerDependencies: @@ -19497,7 +19330,7 @@ packages: react-is: 18.1.0 dev: false - /react-email@2.1.1(eslint@9.35.0): + /react-email@2.1.1(eslint@9.34.0): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -19523,8 +19356,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.35.0) - eslint-config-turbo: 1.10.12(eslint@9.35.0) + eslint-config-prettier: 9.0.0(eslint@9.34.0) + eslint-config-turbo: 1.10.12(eslint@9.34.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -19739,7 +19572,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -20128,11 +19961,11 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false - /resend@4.4.0(react-dom@19.1.1)(react@18.3.1): + /resend@4.4.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-SmVI3JCpgPNt4/m3Uy403LjoSeeleUE2X+KwPYQZcw+jiBCFsqL6vdf1r/XuQ7yOjvxYmlI8GD/oIWonFF9t9w==} engines: {node: '>=18'} dependencies: - '@react-email/render': 1.0.6(react-dom@19.1.1)(react@18.3.1) + '@react-email/render': 1.0.6(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - react - react-dom @@ -20390,10 +20223,6 @@ packages: dependencies: loose-envify: 1.4.0 - /scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - dev: false - /schema-utils@4.3.2: resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} engines: {node: '>= 10.13.0'} @@ -20469,8 +20298,8 @@ packages: randombytes: 2.1.0 dev: false - /seroval-plugins@1.3.3(seroval@1.3.2): - resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + /seroval-plugins@1.3.2(seroval@1.3.2): + resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -20762,7 +20591,7 @@ packages: engines: {node: '>=18'} dependencies: ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.1.0 + is-fullwidth-code-point: 5.0.0 dev: true /slugify@1.6.6: @@ -20871,7 +20700,7 @@ packages: dependencies: csstype: 3.1.3 seroval: 1.3.2 - seroval-plugins: 1.3.3(seroval@1.3.2) + seroval-plugins: 1.3.2(seroval@1.3.2) dev: false /solid-swr-store@0.10.7(solid-js@1.9.9)(swr-store@0.10.6): @@ -21092,7 +20921,7 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.4.0 get-east-asian-width: 1.3.0 strip-ansi: 7.1.2 dev: true @@ -21329,7 +21158,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.19 + magic-string: 0.30.18 periscopic: 3.1.0 dev: false @@ -21374,12 +21203,12 @@ packages: resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} dev: false - /swrv@1.0.4(vue@3.5.21): + /swrv@1.0.4(vue@3.5.20): resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.5.21(typescript@5.7.3) + vue: 3.5.20(typescript@5.7.3) dev: false /symbol-tree@3.2.4: @@ -21389,7 +21218,7 @@ packages: /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 dev: false /tailwind-merge@2.5.4: @@ -21505,7 +21334,7 @@ packages: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.3 + bare-fs: 4.2.1 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer @@ -21662,14 +21491,6 @@ packages: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - /tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - dev: true - /tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -21823,7 +21644,7 @@ packages: code-block-writer: 13.0.3 dev: false - /ts-node@10.9.1(@types/node@24.3.1)(typescript@5.5.3): + /ts-node@10.9.1(@types/node@20.14.9)(typescript@5.5.3): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -21842,7 +21663,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.1 + '@types/node': 20.14.9 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -22202,10 +22023,6 @@ packages: /undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - /undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - dev: true - /undici@5.29.0: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} @@ -22540,28 +22357,6 @@ packages: d3-timer: 3.0.1 dev: false - /vite-node@1.6.1: - resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.4.1 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 5.4.19 - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - dev: true - /vite-node@1.6.1(@types/node@20.14.9): resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -22656,44 +22451,6 @@ packages: - yaml dev: true - /vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.48.1 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /vite@5.4.19(@types/node@20.14.9): resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -22874,62 +22631,6 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.6.1: - resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.1 - '@vitest/ui': 1.6.1 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@vitest/expect': 1.6.1 - '@vitest/runner': 1.6.1 - '@vitest/snapshot': 1.6.1 - '@vitest/spy': 1.6.1 - '@vitest/utils': 1.6.1 - acorn-walk: 8.3.4 - chai: 4.5.0 - debug: 4.4.1 - execa: 8.0.1 - local-pkg: 0.5.1 - magic-string: 0.30.18 - pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.9.0 - strip-literal: 2.1.1 - tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.19 - vite-node: 1.6.1 - why-is-node-running: 2.3.0 - transitivePeerDependencies: - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - dev: true - /vitest@1.6.1(@types/node@20.14.9)(@vitest/ui@3.2.4): resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} engines: {node: ^18.0.0 || >=20.0.0} @@ -23249,19 +22950,19 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue@3.5.21(typescript@5.7.3): - resolution: {integrity: sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==} + /vue@3.5.20(typescript@5.7.3): + resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.5.21 - '@vue/compiler-sfc': 3.5.21 - '@vue/runtime-dom': 3.5.21 - '@vue/server-renderer': 3.5.21(vue@3.5.21) - '@vue/shared': 3.5.21 + '@vue/compiler-dom': 3.5.20 + '@vue/compiler-sfc': 3.5.20 + '@vue/runtime-dom': 3.5.20 + '@vue/server-renderer': 3.5.20(vue@3.5.20) + '@vue/shared': 3.5.20 typescript: 5.7.3 dev: false @@ -23524,7 +23225,7 @@ packages: /worker-factory@7.0.45: resolution: {integrity: sha512-FFPCiSv7MD6ZDEfiik/ErM8IrIAWajaXhezLyCo3v0FjhUWud6GXnG2BiTE91jLywXGAVCT8IF48Hhr+D/omMw==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 fast-unique-numbers: 9.0.23 tslib: 2.8.1 dev: true @@ -23532,7 +23233,7 @@ packages: /worker-timers-broker@8.0.10: resolution: {integrity: sha512-xvo/9GiuduENbJNdWnvZtkriIkjBKKVbMyw7GXvrBu3n1JHemzZgxqaCcCBNlpfXnRXXF4ekqvXWLh1gb65b8w==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 broker-factory: 3.1.9 fast-unique-numbers: 9.0.23 tslib: 2.8.1 @@ -23542,7 +23243,7 @@ packages: /worker-timers-worker@9.0.10: resolution: {integrity: sha512-cfCmAkuoN+nGGJShta/g7CQVP3h7rvQA642EQg72fOHCWP5S2P83rLxDiaGv811Hd+19Cgdqt/tpRBIZ5kj/dw==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 tslib: 2.8.1 worker-factory: 7.0.45 dev: true @@ -23550,7 +23251,7 @@ packages: /worker-timers@8.0.24: resolution: {integrity: sha512-Ydu/7TRHlxIRjYSGDge1F92L7y9kzInpwR4CkocRVObPE0eRqC6d+0GFh52Hm+m520RHVKiytOERtCUu5sQDVQ==} dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.3 tslib: 2.8.1 worker-timers-broker: 8.0.10 worker-timers-worker: 9.0.10 From 55ac9f7534226590dd22359e79d2509279c90d90 Mon Sep 17 00:00:00 2001 From: chronark Date: Tue, 9 Sep 2025 11:44:06 +0200 Subject: [PATCH 05/12] fix: prevent duplicates --- .../_components/identifier-dialog.tsx | 67 ++++------- .../overrides/overrides-table.tsx | 20 +--- .../settings/components/settings-client.tsx | 10 ++ .../_components/create-namespace-button.tsx | 28 +---- apps/dashboard/lib/collections/client.ts | 3 +- .../lib/collections/ratelimit_namespaces.ts | 9 +- .../lib/collections/ratelimit_overrides.ts | 111 +++++++++--------- .../trpc/routers/ratelimit/createOverride.ts | 4 +- 8 files changed, 105 insertions(+), 147 deletions(-) diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx index 4b0546d5f1..3e8294e7cc 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/_components/identifier-dialog.tsx @@ -2,21 +2,11 @@ import { collection } from "@/lib/collections"; import { zodResolver } from "@hookform/resolvers/zod"; -import { CircleInfo } from "@unkey/icons"; -import { - Badge, - Button, - DialogContainer, - FormInput, - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@unkey/ui"; -import { redirect } from "next/navigation"; +import { DuplicateKeyError } from "@tanstack/react-db"; +import { Badge, Button, DialogContainer, FormInput } from "@unkey/ui"; +import { useRouter } from "next/navigation"; import type { PropsWithChildren } from "react"; -import { Controller, useForm } from "react-hook-form"; +import { useForm } from "react-hook-form"; import { z } from "zod"; import type { OverrideDetails } from "../types"; @@ -32,7 +22,6 @@ const overrideValidationSchema = z.object({ .int() .min(1_000, "Duration must be at least 1 second (1000ms)") .max(24 * 60 * 60 * 1000, "Duration cannot exceed 24 hours"), - async: z.enum(["unset", "sync", "async"]), }); type FormValues = z.infer; @@ -57,41 +46,50 @@ export const IdentifierDialog = ({ const { register, handleSubmit, - control, formState: { errors, isSubmitting }, + setError, } = useForm({ resolver: zodResolver(overrideValidationSchema), defaultValues: { identifier, limit: overrideDetails?.limit ?? 10, duration: overrideDetails?.duration ?? 60_000, - async: - overrideDetails?.async === undefined ? "unset" : overrideDetails.async ? "async" : "sync", }, }); + const router = useRouter(); + const onSubmitForm = async (values: FormValues) => { try { if (overrideDetails?.overrideId) { collection.ratelimitOverrides.update(overrideDetails.overrideId, (draft) => { - draft.identifier = values.identifier; draft.limit = values.limit; draft.duration = values.duration; }); onOpenChange(false); } else { + // workaround until tanstack db throws on index violation + collection.ratelimitOverrides.forEach((override) => { + if (override.namespaceId === namespaceId && override.identifier === values.identifier) { + throw new DuplicateKeyError(override.id); + } + }); collection.ratelimitOverrides.insert({ namespaceId, - id: new Date().toISOString(), + id: new Date().toISOString(), // gets replaced by backend identifier: values.identifier, limit: values.limit, duration: values.duration, }); onOpenChange(false); - redirect(`/ratelimits/${namespaceId}/overrides`); + router.push(`/ratelimits/${namespaceId}/overrides`); } } catch (error) { - console.error("Form submission error:", error); + if (error instanceof DuplicateKeyError) { + setError("identifier", { type: "custom", message: "Identifier already exists" }); + } else { + throw error; + } } }; @@ -155,31 +153,6 @@ export const IdentifierDialog = ({ } /> - - ( -
-
Override Type
- - - - -
- )} - /> ); diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx index 17afc276c4..7a2ffe3518 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/overrides/overrides-table.tsx @@ -58,7 +58,7 @@ export const OverridesTable = ({ namespaceId }: Props) => { key: "identifier", header: "Identifier", headerClassName: "pl-2", - width: "25%", + width: "40%", render: (override) => (
@@ -98,24 +98,6 @@ export const OverridesTable = ({ namespaceId }: Props) => {
), }, - { - key: "async", - header: "Async", - width: "15%", - render: (override) => - override.async === null ? ( -
─
- ) : ( - - {override.async ? "async" : "sync"} - - ), - }, { key: "lastUsed", header: "Last used", diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx index ad70340bcb..abaf636022 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx @@ -37,6 +37,16 @@ export const SettingsClient = ({ namespaceId }: Props) => { if (namespaceName === namespace.name || !namespaceName) { return toast.error("Please provide a different name before saving."); } + let error = ""; + collection.ratelimitNamespaces.forEach((ns) => { + if (ns.id !== namespaceId && namespaceName === ns.name) { + error = "Another namespace already has this name"; + return; + } + }); + if (error) { + return toast.error(error); + } collection.ratelimitNamespaces.update(namespace.id, (draft) => { draft.name = namespaceName; diff --git a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx index 821a47e186..909a4557c6 100644 --- a/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx +++ b/apps/dashboard/app/(app)/ratelimits/_components/create-namespace-button.tsx @@ -1,14 +1,11 @@ "use client"; -import { revalidate } from "@/app/actions"; import { NavbarActionButton } from "@/components/navigation/action-button"; import { collection } from "@/lib/collections"; -import { trpc } from "@/lib/trpc/client"; import { zodResolver } from "@hookform/resolvers/zod"; import { DuplicateKeyError } from "@tanstack/react-db"; -import { Button, DialogContainer, FormInput, toast } from "@unkey/ui"; +import { Button, DialogContainer, FormInput } from "@unkey/ui"; import { Plus } from "lucide-react"; -import { useRouter } from "next/navigation"; import { useState } from "react"; import type React from "react"; import { useForm } from "react-hook-form"; @@ -37,34 +34,20 @@ export const CreateNamespaceButton = ({ register, handleSubmit, setError, - formState: { errors, isValid, isSubmitting }, + formState: { errors, isValid }, + reset, } = useForm({ resolver: zodResolver(formSchema), mode: "onChange", }); - const router = useRouter(); - - const create = trpc.ratelimit.namespace.create.useMutation({ - async onSuccess(res) { - router.refresh(); - await revalidate("/ratelimits"); - router.push(`/ratelimits/${res.id}`); - toast.success("Your Namespace has been created"); - setIsOpen(false); - }, - onError(err) { - toast.error(err.message); - }, - }); - const onSubmit = (values: FormValues) => { - //collection.ratelimitNamespaces. try { collection.ratelimitNamespaces.insert({ id: new Date().toISOString(), name: values.name, }); + reset(); setIsOpen(false); } catch (error) { if (error instanceof DuplicateKeyError) { @@ -96,8 +79,7 @@ export const CreateNamespaceButton = ({ form="create-namespace-form" variant="primary" size="xlg" - disabled={create.isLoading || !isValid || isSubmitting} - loading={create.isLoading || isSubmitting} + disabled={!isValid} className="w-full rounded-lg" > Create Namespace diff --git a/apps/dashboard/lib/collections/client.ts b/apps/dashboard/lib/collections/client.ts index f249801109..e8dd781ef7 100644 --- a/apps/dashboard/lib/collections/client.ts +++ b/apps/dashboard/lib/collections/client.ts @@ -5,6 +5,7 @@ import type { Router } from "@/lib/trpc/routers"; import { QueryClient } from "@tanstack/query-core"; import { createTRPCProxyClient, httpBatchLink } from "@trpc/client"; import superjson from "superjson"; +import { getBaseUrl } from "../utils"; export const queryClient = new QueryClient(); @@ -13,7 +14,7 @@ export const trpcClient = createTRPCProxyClient({ transformer: superjson, links: [ httpBatchLink({ - url: "/api/trpc", + url: `${getBaseUrl()}/api/trpc`, fetch(url, options) { return fetch(url, { ...options, diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts index a1d4a632f1..87401b8951 100644 --- a/apps/dashboard/lib/collections/ratelimit_namespaces.ts +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -20,7 +20,7 @@ export const ratelimitNamespaces = createCollection( console.info("DB fetching ratelimitNamespaces"); return await trpcClient.ratelimit.namespace.list.query(); }, - getKey: (item) => [item.name].join("::"), + getKey: (item) => item.id, onInsert: async ({ transaction }) => { const { changes: newNamespace } = transaction.mutations[0]; if (!newNamespace.name) { @@ -67,3 +67,10 @@ export const ratelimitNamespaces = createCollection( }, }), ); + +ratelimitNamespaces.createIndex((row) => row.name, { + name: "name", + options: { + unique: true, + }, +}); diff --git a/apps/dashboard/lib/collections/ratelimit_overrides.ts b/apps/dashboard/lib/collections/ratelimit_overrides.ts index 434197455b..4654ddb4bf 100644 --- a/apps/dashboard/lib/collections/ratelimit_overrides.ts +++ b/apps/dashboard/lib/collections/ratelimit_overrides.ts @@ -12,57 +12,62 @@ const schema = z.object({ duration: z.number(), }); -export - const ratelimitOverrides = createCollection( - queryCollectionOptions({ - schema, - queryClient, - queryKey: ["ratelimitOverrides"], - queryFn: async () => { - console.info("DB fetching ratelimitOverrides"); - return await trpcClient.ratelimit.override.list.query(); - }, - getKey: (item) => [item.namespaceId, item.identifier].join("::"), - onInsert: async ({ transaction }) => { - const { changes } = transaction.mutations[0]; +export const ratelimitOverrides = createCollection( + queryCollectionOptions({ + queryClient, + queryKey: ["ratelimitOverrides"], + queryFn: async () => { + console.info("DB fetching ratelimitOverrides"); + return await trpcClient.ratelimit.override.list.query(); + }, + getKey: (item) => item.id, + onInsert: async ({ transaction }) => { + const { changes } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.create.mutate(schema.parse(changes)); - toast.promise(p, { - loading: "Creating override...", - success: "Override created", - error: (res) => { - console.error("Failed to create override", res); - return { - message: "Failed to create override", - description: res.message, - }; - }, - }); - await p; - }, - onUpdate: async ({ transaction }) => { - const { original, modified } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.update.mutate({ - id: original.id, - limit: modified.limit, - duration: modified.duration, - }); - toast.promise(p, { - loading: "Updating override...", - success: "Override updated", - error: "Failed to update override", - }); - await p; - }, - onDelete: async ({ transaction }) => { - const { original } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.delete.mutate({ id: original.id }); - toast.promise(p, { - loading: "Deleting override...", - success: "Override deleted", - error: "Failed to delete override", - }); - await p; - }, - }), - ); + const p = trpcClient.ratelimit.override.create.mutate(schema.parse(changes)); + toast.promise(p, { + loading: "Creating override...", + success: "Override created", + error: (res) => { + console.error("Failed to create override", res); + return { + message: "Failed to create override", + description: res.message, + }; + }, + }); + await p; + }, + onUpdate: async ({ transaction }) => { + const { original, modified } = transaction.mutations[0]; + const p = trpcClient.ratelimit.override.update.mutate({ + id: original.id, + limit: modified.limit, + duration: modified.duration, + }); + toast.promise(p, { + loading: "Updating override...", + success: "Override updated", + error: "Failed to update override", + }); + await p; + }, + onDelete: async ({ transaction }) => { + const { original } = transaction.mutations[0]; + const p = trpcClient.ratelimit.override.delete.mutate({ id: original.id }); + toast.promise(p, { + loading: "Deleting override...", + success: "Override deleted", + error: "Failed to delete override", + }); + await p; + }, + }), +); + +ratelimitOverrides.createIndex((row) => [row.namespaceId, row.identifier], { + name: "unique_identifier_per_namespace", + options: { + unique: true, + }, +}); diff --git a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts index 66f4db82d9..8c22e9d07f 100644 --- a/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts +++ b/apps/dashboard/lib/trpc/routers/ratelimit/createOverride.ts @@ -14,7 +14,6 @@ export const createOverride = t.procedure identifier: z.string(), limit: z.number(), duration: z.number(), - async: z.boolean().optional(), }), ) .mutation(async ({ input, ctx }) => { @@ -56,7 +55,6 @@ export const createOverride = t.procedure .set({ limit: input.limit, duration: input.duration, - async: input.async ?? false, updatedAtM: Date.now(), deletedAtM: null, }) @@ -69,7 +67,7 @@ export const createOverride = t.procedure identifier: input.identifier, limit: input.limit, duration: input.duration, - async: input.async ?? false, + async: false, createdAtM: Date.now(), }); } From 78808dcd9a0428bdaeab9b22f0080d8d12fc2550 Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 08:25:54 +0200 Subject: [PATCH 06/12] fix: make reset async --- .../components/navigation/sidebar/team-switcher.tsx | 2 +- apps/dashboard/lib/collections/index.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx index 8f1d3fb155..2a3e6c72b2 100644 --- a/apps/dashboard/components/navigation/sidebar/team-switcher.tsx +++ b/apps/dashboard/components/navigation/sidebar/team-switcher.tsx @@ -69,7 +69,7 @@ export const WorkspaceSwitcher: React.FC = (props): JSX.Element => { utils.user.getCurrentUser.invalidate(); utils.api.overview.query.invalidate(); - reset(); + await reset(); // reload data router.replace("/"); diff --git a/apps/dashboard/lib/collections/index.ts b/apps/dashboard/lib/collections/index.ts index 866d805d13..3dcee4a6a2 100644 --- a/apps/dashboard/lib/collections/index.ts +++ b/apps/dashboard/lib/collections/index.ts @@ -10,9 +10,9 @@ export const collection = { }; // resets all collections data and preloads new -export function reset() { +export async function reset() { for (const c of [ratelimitNamespaces, ratelimitOverrides]) { - c.cleanup(); - c.preload(); + await c.cleanup(); + await c.preload(); } } From 99a610154ae8233c37d6a987c74b3d9a4402c625 Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 08:42:21 +0200 Subject: [PATCH 07/12] fix: 404 --- .../settings/components/settings-client.tsx | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx index abaf636022..4a7485dac3 100644 --- a/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx +++ b/apps/dashboard/app/(app)/ratelimits/[namespaceId]/settings/components/settings-client.tsx @@ -2,8 +2,9 @@ import { collection } from "@/lib/collections"; import { eq, useLiveQuery } from "@tanstack/react-db"; -import { Button, CopyButton, Input, SettingCard, toast } from "@unkey/ui"; +import { Button, CopyButton, Empty, Input, SettingCard, toast } from "@unkey/ui"; import { useEffect, useState } from "react"; +import { CreateNamespaceButton } from "../../../_components/create-namespace-button"; import { DeleteNamespaceDialog } from "../../_components/namespace-delete-dialog"; import { SettingsClientSkeleton } from "./skeleton"; @@ -14,7 +15,7 @@ type Props = { export const SettingsClient = ({ namespaceId }: Props) => { const [isNamespaceNameDeleteModalOpen, setIsNamespaceNameDeleteModalOpen] = useState(false); - const { data } = useLiveQuery((q) => + const { data, isLoading } = useLiveQuery((q) => q .from({ namespace: collection.ratelimitNamespaces }) .where(({ namespace }) => eq(namespace.id, namespaceId)), @@ -29,6 +30,23 @@ export const SettingsClient = ({ namespaceId }: Props) => { } }, [namespace, namespaceName]); + if (isLoading) { + return ; + } + + if (!namespace) { + return ( + + + 404 + This namespace does not exist + + + + + ); + } + const handleUpdateName = async () => { if (!namespace) { return; @@ -53,10 +71,6 @@ export const SettingsClient = ({ namespaceId }: Props) => { }); }; - if (!namespace) { - return ; - } - return ( <>
From 584b81f85915e4e2f322239da3cc9226443350df Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 08:45:46 +0200 Subject: [PATCH 08/12] fix: rename variable for clarity --- .../lib/collections/ratelimit_namespaces.ts | 18 +++++++++--------- .../lib/collections/ratelimit_overrides.ts | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts index 87401b8951..6c3c2736bb 100644 --- a/apps/dashboard/lib/collections/ratelimit_namespaces.ts +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -27,8 +27,8 @@ export const ratelimitNamespaces = createCollection( throw new Error("Namespace name is required"); } - const p = trpcClient.ratelimit.namespace.create.mutate({ name: newNamespace.name }); - toast.promise(p, { + const mutation = trpcClient.ratelimit.namespace.create.mutate({ name: newNamespace.name }); + toast.promise(mutation, { loading: "Creating namespace...", success: "Namespace created", error: (res) => { @@ -39,31 +39,31 @@ export const ratelimitNamespaces = createCollection( }; }, }); - await p; + await mutation; }, onUpdate: async ({ transaction }) => { const { original, modified } = transaction.mutations[0]; - const p = trpcClient.ratelimit.namespace.update.name.mutate({ + const mutation = trpcClient.ratelimit.namespace.update.name.mutate({ namespaceId: original.id, name: modified.name, }); - toast.promise(p, { + toast.promise(mutation, { loading: "Updating namespace...", success: "Namespace updated", error: "Failed to update namespace", }); - await p; + await mutation; }, onDelete: async ({ transaction }) => { const { original } = transaction.mutations[0]; - const p = trpcClient.ratelimit.namespace.delete.mutate({ namespaceId: original.id }); - toast.promise(p, { + const mutation = trpcClient.ratelimit.namespace.delete.mutate({ namespaceId: original.id }); + toast.promise(mutation, { loading: "Deleting namespace...", success: "Namespace deleted", error: "Failed to delete namespace", }); - await p; + await mutation; }, }), ); diff --git a/apps/dashboard/lib/collections/ratelimit_overrides.ts b/apps/dashboard/lib/collections/ratelimit_overrides.ts index 4654ddb4bf..0a6f56236a 100644 --- a/apps/dashboard/lib/collections/ratelimit_overrides.ts +++ b/apps/dashboard/lib/collections/ratelimit_overrides.ts @@ -24,8 +24,8 @@ export const ratelimitOverrides = createCollection( onInsert: async ({ transaction }) => { const { changes } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.create.mutate(schema.parse(changes)); - toast.promise(p, { + const mutation = trpcClient.ratelimit.override.create.mutate(schema.parse(changes)); + toast.promise(mutation, { loading: "Creating override...", success: "Override created", error: (res) => { @@ -36,31 +36,31 @@ export const ratelimitOverrides = createCollection( }; }, }); - await p; + await mutation; }, onUpdate: async ({ transaction }) => { const { original, modified } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.update.mutate({ + const mutation = trpcClient.ratelimit.override.update.mutate({ id: original.id, limit: modified.limit, duration: modified.duration, }); - toast.promise(p, { + toast.promise(mutation, { loading: "Updating override...", success: "Override updated", error: "Failed to update override", }); - await p; + await mutation; }, onDelete: async ({ transaction }) => { const { original } = transaction.mutations[0]; - const p = trpcClient.ratelimit.override.delete.mutate({ id: original.id }); - toast.promise(p, { + const mutation = trpcClient.ratelimit.override.delete.mutate({ id: original.id }); + toast.promise(mutation, { loading: "Deleting override...", success: "Override deleted", error: "Failed to delete override", }); - await p; + await mutation; }, }), ); From 3f6297b277ef05cd4a3ed58556ea088a26ef0dbe Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 08:51:05 +0200 Subject: [PATCH 09/12] fix: reset in parallel --- apps/dashboard/lib/collections/index.ts | 10 ++++++---- apps/dashboard/lib/collections/ratelimit_namespaces.ts | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/dashboard/lib/collections/index.ts b/apps/dashboard/lib/collections/index.ts index 3dcee4a6a2..f1ae654e45 100644 --- a/apps/dashboard/lib/collections/index.ts +++ b/apps/dashboard/lib/collections/index.ts @@ -11,8 +11,10 @@ export const collection = { // resets all collections data and preloads new export async function reset() { - for (const c of [ratelimitNamespaces, ratelimitOverrides]) { - await c.cleanup(); - await c.preload(); - } + await Promise.all( + Object.values(collection).map(async (c) => { + await c.cleanup(); + await c.preload(); + }), + ); } diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts index 6c3c2736bb..6d6f6b696e 100644 --- a/apps/dashboard/lib/collections/ratelimit_namespaces.ts +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -17,7 +17,6 @@ export const ratelimitNamespaces = createCollection( queryKey: ["ratelimitNamespaces"], retry: 3, queryFn: async () => { - console.info("DB fetching ratelimitNamespaces"); return await trpcClient.ratelimit.namespace.list.query(); }, getKey: (item) => item.id, From 7962ee9626af34cb17f4b1920bd20ab02e4a4f4c Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 08:54:38 +0200 Subject: [PATCH 10/12] chore: revert zod version --- apps/dashboard/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 15bc528eca..9a1df21c65 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -100,7 +100,7 @@ "typescript": "^5.7.3", "usehooks-ts": "^3.1.0", "vaul": "^0.9.0", - "zod": "4.1.5" + "zod": "^3.23.5" }, "devDependencies": { "@tailwindcss/aspect-ratio": "^0.4.2", From dd64bebac3b73b31220ab327edbc24822ce8d384 Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 09:26:49 +0200 Subject: [PATCH 11/12] fix: I don't even know, this restacking is fucking with my breain --- .../create-key/components/general-setup.tsx | 1 - apps/dashboard/lib/collections/client.ts | 3 +- apps/dashboard/lib/collections/index.ts | 1 - .../lib/collections/ratelimit_namespaces.ts | 9 +- .../lib/collections/ratelimit_overrides.ts | 6 +- internal/resend/emails/welcome_email.tsx | 5 +- pnpm-lock.yaml | 483 +++++++++++------- 7 files changed, 315 insertions(+), 193 deletions(-) diff --git a/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx b/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx index a7e9228d19..f6617671dc 100644 --- a/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx +++ b/apps/dashboard/app/(app)/apis/[apiId]/_components/create-key/components/general-setup.tsx @@ -45,7 +45,6 @@ export const GeneralSetup = () => { value={field.value ?? null} onChange={(identityId: string | null, externalId: string | null) => { field.onChange(identityId); - // @ts-expect-error setValue("externalId", externalId); }} error={errors.externalId?.message} diff --git a/apps/dashboard/lib/collections/client.ts b/apps/dashboard/lib/collections/client.ts index e8dd781ef7..cd980b0e18 100644 --- a/apps/dashboard/lib/collections/client.ts +++ b/apps/dashboard/lib/collections/client.ts @@ -1,5 +1,4 @@ -"use client" - +"use client"; import type { Router } from "@/lib/trpc/routers"; import { QueryClient } from "@tanstack/query-core"; diff --git a/apps/dashboard/lib/collections/index.ts b/apps/dashboard/lib/collections/index.ts index f1ae654e45..59cd922622 100644 --- a/apps/dashboard/lib/collections/index.ts +++ b/apps/dashboard/lib/collections/index.ts @@ -3,7 +3,6 @@ import { ratelimitNamespaces } from "./ratelimit_namespaces"; import { ratelimitOverrides } from "./ratelimit_overrides"; - export const collection = { ratelimitNamespaces, ratelimitOverrides, diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts index 6d6f6b696e..ca6c23cdcb 100644 --- a/apps/dashboard/lib/collections/ratelimit_namespaces.ts +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -1,18 +1,19 @@ -"use client" +"use client"; import { queryCollectionOptions } from "@tanstack/query-db-collection"; import { createCollection } from "@tanstack/react-db"; import { toast } from "@unkey/ui"; -import { queryClient, trpcClient } from "./client"; import { z } from "zod"; +import { queryClient, trpcClient } from "./client"; const schema = z.object({ id: z.string(), name: z.string(), }); -export const ratelimitNamespaces = createCollection( +type Schema = z.infer; + +export const ratelimitNamespaces = createCollection( queryCollectionOptions({ - schema, queryClient, queryKey: ["ratelimitNamespaces"], retry: 3, diff --git a/apps/dashboard/lib/collections/ratelimit_overrides.ts b/apps/dashboard/lib/collections/ratelimit_overrides.ts index 0a6f56236a..d67d9d35a9 100644 --- a/apps/dashboard/lib/collections/ratelimit_overrides.ts +++ b/apps/dashboard/lib/collections/ratelimit_overrides.ts @@ -1,16 +1,18 @@ -"use client" +"use client"; import { queryCollectionOptions } from "@tanstack/query-db-collection"; import { createCollection } from "@tanstack/react-db"; import { toast } from "@unkey/ui"; -import { queryClient, trpcClient } from "./client"; import { z } from "zod"; +import { queryClient, trpcClient } from "./client"; const schema = z.object({ + id: z.string(), namespaceId: z.string(), identifier: z.string(), limit: z.number(), duration: z.number(), }); +type Schema = z.infer; export const ratelimitOverrides = createCollection( queryCollectionOptions({ diff --git a/internal/resend/emails/welcome_email.tsx b/internal/resend/emails/welcome_email.tsx index d38f2f60ad..546fd0f232 100644 --- a/internal/resend/emails/welcome_email.tsx +++ b/internal/resend/emails/welcome_email.tsx @@ -35,7 +35,10 @@ export function WelcomeEmail() { series of guides will help you integrate Unkey step by step.
  • - API Documentation{" "} + + {" "} + API Documentation + {" "} - Our API reference documentation will help you understand and use our API features to their fullest potential.
  • diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5982ba6d1..b30b74a9f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -143,7 +143,7 @@ importers: specifier: ^1.2.5 version: 1.2.5(react-dom@18.3.1)(react@18.3.1) '@hookform/resolvers': - specifier: ^3.3.4 + specifier: ^3.4.2 version: 3.4.2(react-hook-form@7.51.3) '@planetscale/database': specifier: ^1.16.0 @@ -345,7 +345,7 @@ importers: version: 1.17.6(next@14.2.25) openai: specifier: ^4.78.1 - version: 4.78.1(zod@4.1.5) + version: 4.78.1(zod@3.23.8) postcss: specifier: 8.4.38 version: 8.4.38 @@ -396,7 +396,7 @@ importers: version: 1.0.7(tailwindcss@3.4.15) trpc-tools: specifier: ^0.12.0 - version: 0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@4.1.5) + version: 0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@3.23.8) typescript: specifier: ^5.7.3 version: 5.7.3 @@ -407,8 +407,8 @@ importers: specifier: ^0.9.0 version: 0.9.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) zod: - specifier: 4.1.5 - version: 4.1.5 + specifier: 3.23.8 + version: 3.23.8 devDependencies: '@tailwindcss/aspect-ratio': specifier: ^0.4.2 @@ -608,7 +608,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8) + version: 3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8) zod: specifier: 3.23.8 version: 3.23.8 @@ -876,7 +876,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(eslint@9.34.0) + version: 2.1.1(eslint@9.35.0) resend: specifier: ^4.4.0 version: 4.4.0(react-dom@18.3.1)(react@18.3.1) @@ -925,7 +925,7 @@ importers: version: 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-separator': specifier: ^1.0.3 version: 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -934,7 +934,7 @@ importers: version: 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + version: 1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@unkey/icons': specifier: workspace:^ version: link:../icons @@ -1582,18 +1582,22 @@ packages: '@babel/types': 7.28.2 dev: false - /@babel/parser@7.28.3: - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} + /@babel/parser@7.28.4: + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.4 dev: false /@babel/runtime@7.28.3: resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} engines: {node: '>=6.9.0'} + /@babel/runtime@7.28.4: + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + /@babel/types@7.28.2: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} @@ -1602,6 +1606,14 @@ packages: '@babel/helper-validator-identifier': 7.27.1 dev: false + /@babel/types@7.28.4: + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + dev: false + /@balena/dockerignore@1.0.2: resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} dev: true @@ -2197,8 +2209,8 @@ packages: resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} dev: true - /@emnapi/runtime@1.4.5: - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + /@emnapi/runtime@1.5.0: + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} requiresBuild: true dependencies: tslib: 2.8.1 @@ -3680,13 +3692,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.7.0(eslint@9.34.0): - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + /@eslint-community/eslint-utils@4.9.0(eslint@9.35.0): + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.34.0 + eslint: 9.35.0 eslint-visitor-keys: 3.4.3 dev: false @@ -3735,8 +3747,8 @@ packages: - supports-color dev: false - /@eslint/js@9.34.0: - resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} + /@eslint/js@9.35.0: + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -3862,12 +3874,12 @@ packages: engines: {node: '>=18.18.0'} dev: false - /@humanfs/node@0.16.6: - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + /@humanfs/node@0.16.7: + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 dev: false /@humanwhocodes/module-importer@1.0.1: @@ -3875,11 +3887,6 @@ packages: engines: {node: '>=12.22'} dev: false - /@humanwhocodes/retry@0.3.1: - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - dev: false - /@humanwhocodes/retry@0.4.3: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -4214,7 +4221,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 dev: true optional: true @@ -4224,7 +4231,7 @@ packages: cpu: [wasm32] requiresBuild: true dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.5.0 dev: false optional: true @@ -5675,8 +5682,8 @@ packages: fastq: 1.19.1 dev: true - /@oclif/core@4.5.2: - resolution: {integrity: sha512-eQcKyrEcDYeZJKu4vUWiu0ii/1Gfev6GF4FsLSgNez5/+aQyAUCjg3ZWlurf491WiYZTXCWyKAxyPWk8DKv2MA==} + /@oclif/core@4.5.3: + resolution: {integrity: sha512-ISoFlfmsuxJvNKXhabCO4/KqNXDQdLHchZdTPfZbtqAsQbqTw5IKitLVZq9Sz1LWizN37HILp4u0350B8scBjg==} engines: {node: '>=18.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -5693,7 +5700,7 @@ packages: semver: 7.7.2 string-width: 4.2.3 supports-color: 8.1.1 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -5703,7 +5710,7 @@ packages: resolution: {integrity: sha512-LrmMdo9EMJciOvF8UurdoTcTMymv5npKtxMAyonZvhSvGR8YwCKnuHIh00+SO2mNtGOYam7f4xHnUmj2qmanyA==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 dev: true /@oclif/plugin-not-found@3.2.67(@types/node@20.14.9): @@ -5711,26 +5718,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@inquirer/prompts': 7.8.4(@types/node@20.14.9) - '@oclif/core': 4.5.2 - ansis: 3.17.0 - fast-levenshtein: 3.0.0 - transitivePeerDependencies: - - '@types/node' - dev: true - - /@oclif/plugin-plugins@5.4.46: - resolution: {integrity: sha512-VSk+SwKDkGShuRGC5f5WNF/U6Y8JvLfzIaWjLxMe4GlBmln0mKhHqvcfJc2gZOiyJp1QYK638H1w/peSkoZHag==} - engines: {node: '>=18.0.0'} - dependencies: '@oclif/core': 4.5.3 - dev: true - - /@oclif/plugin-not-found@3.2.67(@types/node@24.3.1): - resolution: {integrity: sha512-Q2VluSwTrh7Sk0ey88Lk5WSATn9AZ6TjYQIyt2QrQolOBErAgpDoDSMVRYuVNtjxPBTDBzz4MM54QRFa/nN4IQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@inquirer/prompts': 7.8.4(@types/node@24.3.1) - '@oclif/core': 4.5.2 ansis: 3.17.0 fast-levenshtein: 3.0.0 transitivePeerDependencies: @@ -5760,7 +5748,7 @@ packages: resolution: {integrity: sha512-YDlr//SHmC80eZrt+0wNFWSo1cOSU60RoWdhSkAoPB3pUGPSNHZDquXDpo7KniinzYPsj1rfetCYk7UVXwYu7A==} engines: {node: '>=18.0.0'} dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 ansis: 3.17.0 debug: 4.4.1(supports-color@8.1.1) http-call: 5.3.0 @@ -5940,7 +5928,7 @@ packages: typescript: 5.7.3 dev: false - /@onetyped/zod@1.0.1(@onetyped/core@0.1.1)(zod@4.1.5): + /@onetyped/zod@1.0.1(@onetyped/core@0.1.1)(zod@3.23.8): resolution: {integrity: sha512-yOBNubxhoI2tgZZfYoGxjIFAdHNr8kkkQWDgSXNA4ZPcCayPo32iTYUFUr+MyUIsVpL3Erki3iX7Adt5o4esAw==} peerDependencies: '@onetyped/core': '*' @@ -5950,7 +5938,7 @@ packages: optional: true dependencies: '@onetyped/core': 0.1.1 - zod: 4.1.5 + zod: 3.23.8 dev: false /@openapi-contrib/openapi-schema-to-json-schema@3.2.0: @@ -7125,7 +7113,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) @@ -7655,7 +7643,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -7702,6 +7690,35 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-popper@1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.4 + '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.3.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} peerDependencies: @@ -7802,7 +7819,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@types/react': 18.3.11 '@types/react-dom': 18.3.0 @@ -8115,7 +8132,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8285,6 +8302,46 @@ packages: react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) dev: false + /@radix-ui/react-select@2.0.0(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.3 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.11 + aria-hidden: 1.2.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.5(@types/react@18.3.11)(react@18.3.1) + dev: false + /@radix-ui/react-select@2.2.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} peerDependencies: @@ -8511,7 +8568,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-direction': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8538,7 +8595,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8561,7 +8618,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) @@ -8612,6 +8669,37 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@radix-ui/react-tooltip@1.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.28.3 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-context': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-id': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-popper': 1.1.3(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) + '@types/react': 18.3.11 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.11)(react@18.3.1): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: @@ -10048,7 +10136,7 @@ packages: engines: {node: '>=18'} dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -10433,6 +10521,13 @@ packages: resolution: {integrity: sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==} dependencies: undici-types: 5.26.5 + dev: false + + /@types/node@18.19.124: + resolution: {integrity: sha512-hY4YWZFLs3ku6D2Gqo3RchTd9VRCcrjqp/I0mmohYeUVA5Y8eCXKJEasHxLAJVZRJuQogfd1GiJ9lgogBgKeuQ==} + dependencies: + undici-types: 5.26.5 + dev: true /@types/node@20.14.9: resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} @@ -10523,7 +10618,7 @@ packages: /@types/ssh2@1.15.5: resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} dependencies: - '@types/node': 18.19.123 + '@types/node': 18.19.124 dev: true /@types/unist@2.0.11: @@ -10563,22 +10658,22 @@ packages: dev: true optional: true - /@typescript-eslint/project-service@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==} + /@typescript-eslint/project-service@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) - '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) + '@typescript-eslint/types': 8.43.0 debug: 4.4.1(supports-color@8.1.1) typescript: 5.5.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/tsconfig-utils@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==} + /@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -10586,21 +10681,21 @@ packages: typescript: 5.5.3 dev: true - /@typescript-eslint/types@8.42.0: - resolution: {integrity: sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==} + /@typescript-eslint/types@8.43.0: + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@8.42.0(typescript@5.5.3): - resolution: {integrity: sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==} + /@typescript-eslint/typescript-estree@8.43.0(typescript@5.5.3): + resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' dependencies: - '@typescript-eslint/project-service': 8.42.0(typescript@5.5.3) - '@typescript-eslint/tsconfig-utils': 8.42.0(typescript@5.5.3) - '@typescript-eslint/types': 8.42.0 - '@typescript-eslint/visitor-keys': 8.42.0 + '@typescript-eslint/project-service': 8.43.0(typescript@5.5.3) + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.5.3) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.1(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 @@ -10612,11 +10707,11 @@ packages: - supports-color dev: true - /@typescript-eslint/visitor-keys@8.42.0: - resolution: {integrity: sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==} + /@typescript-eslint/visitor-keys@8.43.0: + resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 8.42.0 + '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 dev: true @@ -10750,7 +10845,7 @@ packages: resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} dependencies: '@vitest/pretty-format': 3.0.9 - magic-string: 0.30.18 + magic-string: 0.30.19 pathe: 2.0.3 dev: true @@ -10838,78 +10933,78 @@ packages: tinyrainbow: 2.0.0 dev: true - /@vue/compiler-core@3.5.20: - resolution: {integrity: sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==} + /@vue/compiler-core@3.5.21: + resolution: {integrity: sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==} dependencies: - '@babel/parser': 7.28.3 - '@vue/shared': 3.5.20 + '@babel/parser': 7.28.4 + '@vue/shared': 3.5.21 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 dev: false - /@vue/compiler-dom@3.5.20: - resolution: {integrity: sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==} + /@vue/compiler-dom@3.5.21: + resolution: {integrity: sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==} dependencies: - '@vue/compiler-core': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/compiler-core': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/compiler-sfc@3.5.20: - resolution: {integrity: sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==} + /@vue/compiler-sfc@3.5.21: + resolution: {integrity: sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==} dependencies: - '@babel/parser': 7.28.3 - '@vue/compiler-core': 3.5.20 - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 + '@babel/parser': 7.28.4 + '@vue/compiler-core': 3.5.21 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 estree-walker: 2.0.2 - magic-string: 0.30.18 + magic-string: 0.30.19 postcss: 8.5.6 source-map-js: 1.2.1 dev: false - /@vue/compiler-ssr@3.5.20: - resolution: {integrity: sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==} + /@vue/compiler-ssr@3.5.21: + resolution: {integrity: sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==} dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/compiler-dom': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/reactivity@3.5.20: - resolution: {integrity: sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==} + /@vue/reactivity@3.5.21: + resolution: {integrity: sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==} dependencies: - '@vue/shared': 3.5.20 + '@vue/shared': 3.5.21 dev: false - /@vue/runtime-core@3.5.20: - resolution: {integrity: sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==} + /@vue/runtime-core@3.5.21: + resolution: {integrity: sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==} dependencies: - '@vue/reactivity': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/reactivity': 3.5.21 + '@vue/shared': 3.5.21 dev: false - /@vue/runtime-dom@3.5.20: - resolution: {integrity: sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==} + /@vue/runtime-dom@3.5.21: + resolution: {integrity: sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==} dependencies: - '@vue/reactivity': 3.5.20 - '@vue/runtime-core': 3.5.20 - '@vue/shared': 3.5.20 + '@vue/reactivity': 3.5.21 + '@vue/runtime-core': 3.5.21 + '@vue/shared': 3.5.21 csstype: 3.1.3 dev: false - /@vue/server-renderer@3.5.20(vue@3.5.20): - resolution: {integrity: sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==} + /@vue/server-renderer@3.5.21(vue@3.5.21): + resolution: {integrity: sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==} peerDependencies: - vue: 3.5.20 + vue: 3.5.21 dependencies: - '@vue/compiler-ssr': 3.5.20 - '@vue/shared': 3.5.20 - vue: 3.5.20(typescript@5.7.3) + '@vue/compiler-ssr': 3.5.21 + '@vue/shared': 3.5.21 + vue: 3.5.21(typescript@5.7.3) dev: false - /@vue/shared@3.5.20: - resolution: {integrity: sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==} + /@vue/shared@3.5.21: + resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} dev: false /@webassemblyjs/ast@1.14.1: @@ -11143,7 +11238,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.20)(zod@3.23.8): + /ai@3.0.23(react@18.3.1)(solid-js@1.9.9)(svelte@4.2.20)(vue@3.5.21)(zod@3.23.8): resolution: {integrity: sha512-VL8Fx9euEtffzIu0BpLDZkACB+oU6zj4vHXSsSoT5VfwAzE009FJedOMPK1M4u60RpYw/DgwlD7OLN7XQfvSHw==} engines: {node: '>=18'} peerDependencies: @@ -11178,8 +11273,8 @@ packages: svelte: 4.2.20 swr: 2.2.0(react@18.3.1) swr-store: 0.10.6 - swrv: 1.0.4(vue@3.5.20) - vue: 3.5.20(typescript@5.7.3) + swrv: 1.0.4(vue@3.5.21) + vue: 3.5.21(typescript@5.7.3) zod: 3.23.8 zod-to-json-schema: 3.22.5(zod@3.23.8) dev: false @@ -11610,8 +11705,8 @@ packages: dev: true optional: true - /bare-fs@4.2.1: - resolution: {integrity: sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==} + /bare-fs@4.2.3: + resolution: {integrity: sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==} engines: {bare: '>=1.16.0'} requiresBuild: true peerDependencies: @@ -11768,7 +11863,7 @@ packages: /broker-factory@3.1.9: resolution: {integrity: sha512-MzvndyD6EcbkBtX4NXm/HfdO1+cOR5ONNdMCXEKfHpxGdMtuDz7+o+nJf7HMtyPH1sUVf/lEIP+DMluC5PgaBQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 fast-unique-numbers: 9.0.23 tslib: 2.8.1 worker-factory: 7.0.45 @@ -11922,6 +12017,10 @@ packages: /caniuse-lite@1.0.30001737: resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} + /caniuse-lite@1.0.30001741: + resolution: {integrity: sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==} + dev: false + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -12033,13 +12132,13 @@ packages: jiti: optional: true dependencies: - '@oclif/core': 4.5.2 + '@oclif/core': 4.5.3 '@oclif/plugin-help': 6.2.32 '@oclif/plugin-not-found': 3.2.67(@types/node@20.14.9) '@oclif/plugin-plugins': 5.4.46 '@oclif/plugin-warn-if-update-available': 3.1.46 '@types/archiver': 6.0.3 - '@typescript-eslint/typescript-estree': 8.42.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.5.3) acorn: 8.15.0 acorn-walk: 8.3.4 archiver: 7.0.1 @@ -13139,7 +13238,7 @@ packages: /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 csstype: 3.1.3 dev: false @@ -13368,6 +13467,11 @@ packages: /emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + dev: false + + /emoji-regex@10.5.0: + resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13892,31 +13996,31 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@9.34.0): + /eslint-config-prettier@9.0.0(eslint@9.35.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.34.0 + eslint: 9.35.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.34.0): + /eslint-config-turbo@1.10.12(eslint@9.35.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.34.0 - eslint-plugin-turbo: 1.10.12(eslint@9.34.0) + eslint: 9.35.0 + eslint-plugin-turbo: 1.10.12(eslint@9.35.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.34.0): + /eslint-plugin-turbo@1.10.12(eslint@9.35.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.34.0 + eslint: 9.35.0 dev: false /eslint-scope@5.1.1: @@ -13944,8 +14048,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /eslint@9.34.0: - resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} + /eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -13954,15 +14058,15 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.34.0 + '@eslint/js': 9.35.0 '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 @@ -14318,7 +14422,7 @@ packages: resolution: {integrity: sha512-jcRIaHo46nfvyvKRMaFSKXmez4jALQ3Qw49gxM5F4siz8HqkyKPPEexpCOYwBSJI1HovrDr4fEedM8QAJ7oX3w==} engines: {node: '>=18.2.0'} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 dev: true @@ -15020,6 +15124,11 @@ packages: engines: {node: '>=18'} dev: true + /get-east-asian-width@1.3.1: + resolution: {integrity: sha512-R1QfovbPsKmosqTnPoRFiJ7CF9MLRgb53ChvMZm+r4p76/+8yKDy17qLL2PKInORy2RkZZekuK0efYgmzTkXyQ==} + engines: {node: '>=18'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -16084,11 +16193,11 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + /is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} dependencies: - get-east-asian-width: 1.3.0 + get-east-asian-width: 1.3.1 dev: true /is-generator-function@1.1.0: @@ -16893,6 +17002,12 @@ packages: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + dev: true + + /magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -18041,7 +18156,7 @@ packages: '@next/env': 14.2.32 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001737 + caniuse-lite: 1.0.30001741 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -18383,7 +18498,7 @@ packages: is-wsl: 2.2.0 dev: true - /openai@4.78.1(zod@4.1.5): + /openai@4.78.1(zod@3.23.8): resolution: {integrity: sha512-drt0lHZBd2lMyORckOXFPQTmnGLWSLt8VK0W9BhOKWpMFBEoHMoz5gxMPmVq5icp+sOrsbMnsmZTVHUlKvD1Ow==} hasBin: true peerDependencies: @@ -18399,7 +18514,7 @@ packages: form-data-encoder: 1.7.2 formdata-node: 4.4.1 node-fetch: 2.7.0 - zod: 4.1.5 + zod: 3.23.8 transitivePeerDependencies: - encoding dev: false @@ -19330,7 +19445,7 @@ packages: react-is: 18.1.0 dev: false - /react-email@2.1.1(eslint@9.34.0): + /react-email@2.1.1(eslint@9.35.0): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -19356,8 +19471,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.34.0) - eslint-config-turbo: 1.10.12(eslint@9.34.0) + eslint-config-prettier: 9.0.0(eslint@9.35.0) + eslint-config-turbo: 1.10.12(eslint@9.35.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -19572,7 +19687,7 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -20298,8 +20413,8 @@ packages: randombytes: 2.1.0 dev: false - /seroval-plugins@1.3.2(seroval@1.3.2): - resolution: {integrity: sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==} + /seroval-plugins@1.3.3(seroval@1.3.2): + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 @@ -20590,8 +20705,8 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 dev: true /slugify@1.6.6: @@ -20700,7 +20815,7 @@ packages: dependencies: csstype: 3.1.3 seroval: 1.3.2 - seroval-plugins: 1.3.2(seroval@1.3.2) + seroval-plugins: 1.3.3(seroval@1.3.2) dev: false /solid-swr-store@0.10.7(solid-js@1.9.9)(swr-store@0.10.6): @@ -20921,7 +21036,7 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} dependencies: - emoji-regex: 10.4.0 + emoji-regex: 10.5.0 get-east-asian-width: 1.3.0 strip-ansi: 7.1.2 dev: true @@ -21158,7 +21273,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.18 + magic-string: 0.30.19 periscopic: 3.1.0 dev: false @@ -21203,12 +21318,12 @@ packages: resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} dev: false - /swrv@1.0.4(vue@3.5.20): + /swrv@1.0.4(vue@3.5.21): resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} peerDependencies: vue: '>=3.2.26 < 4' dependencies: - vue: 3.5.20(typescript@5.7.3) + vue: 3.5.21(typescript@5.7.3) dev: false /symbol-tree@3.2.4: @@ -21218,7 +21333,7 @@ packages: /tailwind-merge@2.2.0: resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 dev: false /tailwind-merge@2.5.4: @@ -21334,7 +21449,7 @@ packages: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.2.1 + bare-fs: 4.2.3 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer @@ -21491,6 +21606,14 @@ packages: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + /tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + dev: true + /tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -21593,7 +21716,7 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - /trpc-tools@0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@4.1.5): + /trpc-tools@0.12.0(@trpc/server@10.45.2)(typanion@3.14.0)(typescript@5.7.3)(zod@3.23.8): resolution: {integrity: sha512-Zn21JotBHNM64hgvljZ3yjPEsGfFMD86Oa+oGbYVaOLAW5NVVm80UM2H5w5cPh+z8VFSvY8DMflH7maBb/iexg==} hasBin: true peerDependencies: @@ -21605,7 +21728,7 @@ packages: '@octokit/core': 5.2.2 '@onetyped/core': 0.1.1 '@onetyped/typescript': 1.0.1(@onetyped/core@0.1.1)(typescript@5.7.3) - '@onetyped/zod': 1.0.1(@onetyped/core@0.1.1)(zod@4.1.5) + '@onetyped/zod': 1.0.1(@onetyped/core@0.1.1)(zod@3.23.8) '@trpc/server': 10.45.2 bundle-require: 4.2.1(esbuild@0.18.20) chalk: 5.6.0 @@ -22950,19 +23073,19 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue@3.5.20(typescript@5.7.3): - resolution: {integrity: sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==} + /vue@3.5.21(typescript@5.7.3): + resolution: {integrity: sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@vue/compiler-dom': 3.5.20 - '@vue/compiler-sfc': 3.5.20 - '@vue/runtime-dom': 3.5.20 - '@vue/server-renderer': 3.5.20(vue@3.5.20) - '@vue/shared': 3.5.20 + '@vue/compiler-dom': 3.5.21 + '@vue/compiler-sfc': 3.5.21 + '@vue/runtime-dom': 3.5.21 + '@vue/server-renderer': 3.5.21(vue@3.5.21) + '@vue/shared': 3.5.21 typescript: 5.7.3 dev: false @@ -23225,7 +23348,7 @@ packages: /worker-factory@7.0.45: resolution: {integrity: sha512-FFPCiSv7MD6ZDEfiik/ErM8IrIAWajaXhezLyCo3v0FjhUWud6GXnG2BiTE91jLywXGAVCT8IF48Hhr+D/omMw==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 fast-unique-numbers: 9.0.23 tslib: 2.8.1 dev: true @@ -23233,7 +23356,7 @@ packages: /worker-timers-broker@8.0.10: resolution: {integrity: sha512-xvo/9GiuduENbJNdWnvZtkriIkjBKKVbMyw7GXvrBu3n1JHemzZgxqaCcCBNlpfXnRXXF4ekqvXWLh1gb65b8w==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 broker-factory: 3.1.9 fast-unique-numbers: 9.0.23 tslib: 2.8.1 @@ -23243,7 +23366,7 @@ packages: /worker-timers-worker@9.0.10: resolution: {integrity: sha512-cfCmAkuoN+nGGJShta/g7CQVP3h7rvQA642EQg72fOHCWP5S2P83rLxDiaGv811Hd+19Cgdqt/tpRBIZ5kj/dw==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 worker-factory: 7.0.45 dev: true @@ -23251,7 +23374,7 @@ packages: /worker-timers@8.0.24: resolution: {integrity: sha512-Ydu/7TRHlxIRjYSGDge1F92L7y9kzInpwR4CkocRVObPE0eRqC6d+0GFh52Hm+m520RHVKiytOERtCUu5sQDVQ==} dependencies: - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 tslib: 2.8.1 worker-timers-broker: 8.0.10 worker-timers-worker: 9.0.10 @@ -23601,9 +23724,5 @@ packages: /zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - /zod@4.1.5: - resolution: {integrity: sha512-rcUUZqlLJgBC33IT3PNMgsCq6TzLQEG/Ei/KTCU0PedSWRMAXoOUN+4t/0H+Q8bdnLPdqUYnvboJT0bn/229qg==} - dev: false - /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} From 1119eb1ff30ac35c1db0d6a85a07e01dd220563c Mon Sep 17 00:00:00 2001 From: chronark Date: Wed, 10 Sep 2025 09:29:41 +0200 Subject: [PATCH 12/12] chore: match zod schema --- apps/dashboard/lib/collections/ratelimit_namespaces.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/dashboard/lib/collections/ratelimit_namespaces.ts b/apps/dashboard/lib/collections/ratelimit_namespaces.ts index ca6c23cdcb..00bd5f6c7e 100644 --- a/apps/dashboard/lib/collections/ratelimit_namespaces.ts +++ b/apps/dashboard/lib/collections/ratelimit_namespaces.ts @@ -7,7 +7,7 @@ import { queryClient, trpcClient } from "./client"; const schema = z.object({ id: z.string(), - name: z.string(), + name: z.string().min(1).max(50), }); type Schema = z.infer;