diff --git a/apps/dashboard/app/(app)/layout.tsx b/apps/dashboard/app/(app)/layout.tsx index 045e6d787d..b5b3a82f61 100644 --- a/apps/dashboard/app/(app)/layout.tsx +++ b/apps/dashboard/app/(app)/layout.tsx @@ -20,6 +20,7 @@ export default async function Layout({ children }: LayoutProps) { apis: { where: (table, { isNull }) => isNull(table.deletedAtM), }, + quotas: true, }, }); @@ -32,7 +33,10 @@ export default async function Layout({ children }: LayoutProps) {
{/* Desktop Sidebar */} - + {/* Main content area */}
diff --git a/apps/dashboard/app/(app)/settings/billing/client.tsx b/apps/dashboard/app/(app)/settings/billing/client.tsx index 2e62f99442..59284e5cfc 100644 --- a/apps/dashboard/app/(app)/settings/billing/client.tsx +++ b/apps/dashboard/app/(app)/settings/billing/client.tsx @@ -33,7 +33,7 @@ type Props = { name: string; priceId: string; dollar: number; - quota: { + quotas: { requestsPerMonth: number; }; }>; @@ -116,7 +116,7 @@ export const Client: React.FC = (props) => { >
{p.name}
- {formatNumber(p.quota.requestsPerMonth)} + {formatNumber(p.quotas.requestsPerMonth)} requests
@@ -131,7 +131,7 @@ export const Client: React.FC = (props) => { description={`Changing to ${ p.name } updates your request quota to ${formatNumber( - p.quota.requestsPerMonth, + p.quotas.requestsPerMonth, )} per month immediately.`} onConfirm={async () => updateSubscription.mutateAsync({ @@ -151,7 +151,7 @@ export const Client: React.FC = (props) => { description={`Changing to ${ p.name } updates your request quota to ${formatNumber( - p.quota.requestsPerMonth, + p.quotas.requestsPerMonth, )} per month immediately.`} onConfirm={() => createSubscription.mutateAsync({ productId: p.id })} fineprint={ diff --git a/apps/dashboard/app/(app)/settings/billing/components/usage.tsx b/apps/dashboard/app/(app)/settings/billing/components/usage.tsx index a915f39ee1..140aa9c348 100644 --- a/apps/dashboard/app/(app)/settings/billing/components/usage.tsx +++ b/apps/dashboard/app/(app)/settings/billing/components/usage.tsx @@ -22,7 +22,11 @@ function clamp(min: number, value: number, max: number): number { return Math.min(max, Math.max(value, min)); } -const ProgressCircle: React.FC<{ value: number; max: number }> = ({ value, max }) => { +export const ProgressCircle: React.FC<{ + value: number; + max: number; + color?: string; +}> = ({ value, max, color }) => { const safeValue = clamp(0, value, max); const radius = 12; const strokeWidth = 3; @@ -65,6 +69,7 @@ const ProgressCircle: React.FC<{ value: number; max: number }> = ({ value, max } stroke="" strokeLinecap="round" className="stroke-accent-12 transform-gpu transition-all duration-300 ease-in-out" + style={{ stroke: color }} /> ) : null} diff --git a/apps/dashboard/app/(app)/settings/billing/page.tsx b/apps/dashboard/app/(app)/settings/billing/page.tsx index 96547d1b30..24c6faf1a8 100644 --- a/apps/dashboard/app/(app)/settings/billing/page.tsx +++ b/apps/dashboard/app/(app)/settings/billing/page.tsx @@ -20,7 +20,7 @@ export default async function BillingPage() { const workspace = await db.query.workspaces.findFirst({ where: (table, { and, eq, isNull }) => and(eq(table.orgId, orgId), isNull(table.deletedAtM)), with: { - quota: true, + quotas: true, }, }); @@ -137,7 +137,7 @@ export default async function BillingPage() { name: p.name, priceId: price.id, dollar: price.unit_amount! / 100, - quota: { + quotas: { requestsPerMonth: Number.parseInt(p.metadata.quota_requests_per_month), }, }; @@ -165,7 +165,7 @@ export default async function BillingPage() { products={products} usage={{ current: usedVerifications + usedRatelimits, - max: workspace.quota?.requestsPerMonth ?? 150_000, + max: workspace.quotas?.requestsPerMonth ?? 150_000, }} subscription={ subscription diff --git a/apps/dashboard/app/(app)/settings/team/page.tsx b/apps/dashboard/app/(app)/settings/team/page.tsx index e91b8fa082..0a4298e90a 100644 --- a/apps/dashboard/app/(app)/settings/team/page.tsx +++ b/apps/dashboard/app/(app)/settings/team/page.tsx @@ -13,10 +13,10 @@ export default async function SettingTeamPage() { const orgId = await getOrgId(); const ws = await db.query.workspaces.findFirst({ where: (table, { and, eq, isNull }) => and(eq(table.orgId, orgId), isNull(table.deletedAtM)), - with: { quota: true }, + with: { quotas: true }, }); - const team = ws?.quota?.team ?? false; + const team = ws?.quotas?.team ?? false; return (
diff --git a/apps/dashboard/components/app-sidebar.tsx b/apps/dashboard/components/app-sidebar.tsx deleted file mode 100644 index 80092cb237..0000000000 --- a/apps/dashboard/components/app-sidebar.tsx +++ /dev/null @@ -1,381 +0,0 @@ -"use client"; -import { WorkspaceSwitcher } from "@/components/navigation/sidebar/team-switcher"; -import { UserButton } from "@/components/navigation/sidebar/user-button"; -import { - type NavItem, - createWorkspaceNavigation, - resourcesNavigation, -} from "@/components/navigation/sidebar/workspace-navigations"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import { - Sidebar, - SidebarContent, - SidebarFooter, - SidebarGroup, - SidebarHeader, - SidebarMenu, - SidebarMenuButton, - SidebarMenuItem, - SidebarMenuSub, - SidebarMenuSubButton, - SidebarMenuSubItem, - useSidebar, -} from "@/components/ui/sidebar"; -import { useDelayLoader } from "@/hooks/use-delay-loader"; -import type { Workspace } from "@/lib/db"; -import { cn } from "@/lib/utils"; -import { SidebarLeftHide, SidebarLeftShow } from "@unkey/icons"; -import { ChevronRight } from "lucide-react"; -import Link from "next/link"; -import { useRouter, useSelectedLayoutSegments } from "next/navigation"; -import { memo, useEffect, useMemo, useState, useTransition } from "react"; - -export function AppSidebar({ - ...props -}: React.ComponentProps & { workspace: Workspace }) { - const segments = useSelectedLayoutSegments() ?? []; - const navItems = useMemo( - () => createNestedNavigation(props.workspace, segments), - [props.workspace, segments], - ); - - // Create a toggle sidebar nav item - const toggleNavItem: NavItem = useMemo( - () => ({ - label: "Toggle Sidebar", - href: "#", - icon: SidebarLeftShow, - active: false, - tooltip: "Toggle Sidebar", - }), - [], - ); - - const { state, isMobile, toggleSidebar } = useSidebar(); - const isCollapsed = state === "collapsed"; - - const headerContent = useMemo( - () => ( -
- - {state !== "collapsed" && !isMobile && ( - - )} -
- ), - [isCollapsed, props.workspace, state, isMobile, toggleSidebar], - ); - - const resourceNavItems = useMemo(() => resourcesNavigation, []); - - return ( - - {headerContent} - - - - {/* Toggle button as NavItem */} - {state === "collapsed" && ( - - )} - - {navItems.map((item) => ( - - ))} - {resourceNavItems.map((item) => ( - - ))} - - - - - - - - ); -} - -const getButtonStyles = (isActive?: boolean, showLoader?: boolean) => { - return cn( - "flex items-center group text-[13px] font-medium text-accent-12 hover:bg-grayA-3 hover:text-accent-12 justify-start active:border focus:ring-2 w-full text-left", - "rounded-lg transition-colors focus-visible:ring-1 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 disabled:cursor-not-allowed outline-none", - "focus:border-grayA-12 focus:ring-gray-6 focus-visible:outline-none focus:ring-offset-0 drop-shadow-button", - isActive ? "bg-grayA-3 text-accent-12" : "[&_svg]:text-gray-9", - showLoader ? "bg-grayA-3 [&_svg]:text-accent-12" : "", - ); -}; - -const createNestedNavigation = ( - workspace: Pick, - segments: string[], -): (NavItem & { items?: NavItem[] })[] => { - const baseNav = createWorkspaceNavigation(workspace, segments); - return baseNav; -}; - -const NavLink = memo( - ({ - href, - external, - onClick, - children, - }: { - href: string; - external?: boolean; - onClick?: () => void; - children: React.ReactNode; - }) => { - return ( - - {children} - - ); - }, -); - -const SEGMENTS = [ - "segment-1", // Right top - "segment-2", // Right - "segment-3", // Right bottom - "segment-4", // Bottom - "segment-5", // Left bottom - "segment-6", // Left - "segment-7", // Left top - "segment-8", // Top -]; - -const AnimatedLoadingSpinner = memo(() => { - const [segmentIndex, setSegmentIndex] = useState(0); - - useEffect(() => { - // Animate the segments in sequence - const timer = setInterval(() => { - setSegmentIndex((prevIndex) => (prevIndex + 1) % SEGMENTS.length); - }, 125); // 125ms per segment = 1s for full rotation - return () => clearInterval(timer); - }, []); - - return ( - - - {SEGMENTS.map((id, index) => { - const distance = (SEGMENTS.length + index - segmentIndex) % SEGMENTS.length; - const opacity = distance <= 4 ? 1 - distance * 0.2 : 0.1; - return ( - - ); - })} - - - - ); -}); - -function getPathForSegment(index: number) { - const paths = [ - "M13.162,3.82c-.148,0-.299-.044-.431-.136-.784-.552-1.662-.915-2.61-1.08-.407-.071-.681-.459-.61-.867,.071-.408,.459-.684,.868-.61,1.167,.203,2.248,.65,3.216,1.33,.339,.238,.42,.706,.182,1.045-.146,.208-.378,.319-.614,.319Z", - "M16.136,8.5c-.357,0-.675-.257-.738-.622-.163-.942-.527-1.82-1.082-2.608-.238-.339-.157-.807,.182-1.045,.34-.239,.809-.156,1.045,.182,.683,.97,1.132,2.052,1.334,3.214,.07,.408-.203,.796-.611,.867-.043,.008-.086,.011-.129,.011Z", - "M14.93,13.913c-.148,0-.299-.044-.431-.137-.339-.238-.42-.706-.182-1.045,.551-.784,.914-1.662,1.078-2.609,.071-.408,.466-.684,.867-.611,.408,.071,.682,.459,.611,.867-.203,1.167-.65,2.25-1.33,3.216-.146,.208-.378,.318-.614,.318Z", - "M10.249,16.887c-.357,0-.675-.257-.738-.621-.07-.408,.202-.797,.61-.868,.945-.165,1.822-.529,2.608-1.082,.34-.238,.807-.156,1.045,.182,.238,.338,.157,.807-.182,1.045-.968,.682-2.05,1.13-3.214,1.333-.044,.008-.087,.011-.13,.011Z", - "M7.751,16.885c-.043,0-.086-.003-.13-.011-1.167-.203-2.249-.651-3.216-1.33-.339-.238-.42-.706-.182-1.045,.236-.339,.702-.421,1.045-.183,.784,.551,1.662,.915,2.61,1.08,.408,.071,.681,.459,.61,.868-.063,.364-.381,.621-.738,.621Z", - "M3.072,13.911c-.236,0-.469-.111-.614-.318-.683-.97-1.132-2.052-1.334-3.214-.07-.408,.203-.796,.611-.867,.403-.073,.796,.202,.867,.61,.163,.942,.527,1.82,1.082,2.608,.238,.339,.157,.807-.182,1.045-.131,.092-.282,.137-.431,.137Z", - "M1.866,8.5c-.043,0-.086-.003-.129-.011-.408-.071-.682-.459-.611-.867,.203-1.167,.65-2.25,1.33-3.216,.236-.339,.703-.422,1.045-.182,.339,.238,.42,.706,.182,1.045-.551,.784-.914,1.662-1.078,2.609-.063,.365-.381,.622-.738,.622Z", - "M4.84,3.821c-.236,0-.468-.111-.614-.318-.238-.338-.157-.807,.182-1.045,.968-.682,2.05-1.13,3.214-1.333,.41-.072,.797,.202,.868,.61,.07,.408-.202,.797-.61,.868-.945,.165-1.822,.529-2.608,1.082-.131,.092-.282,.137-.431,.137Z", - ]; - return paths[index]; -} - -const FlatNavItem = memo(({ item }: { item: NavItem }) => { - const [isPending, startTransition] = useTransition(); - const showLoader = useDelayLoader(isPending); - const router = useRouter(); - const Icon = item.icon; - - const handleClick = () => { - if (!item.external) { - startTransition(() => { - router.push(item.href); - }); - } - }; - - return ( - - - - {showLoader ? : Icon ? : null} - {item.label} - - - - ); -}); - -const NestedNavItem = memo(({ item }: { item: NavItem & { items?: NavItem[] } }) => { - const [isPending, startTransition] = useTransition(); - const showLoader = useDelayLoader(isPending); - const router = useRouter(); - const Icon = item.icon; - - // For loading indicators in sub-items - const [subPending, setSubPending] = useState>({}); - - return ( - - - - - {showLoader ? : Icon ? : null} - {item.label} - - - - - - {item.items?.map((subItem) => { - const SubIcon = subItem.icon; - - const handleSubItemClick = () => { - if (!subItem.external) { - // Track loading state for this specific sub-item - const updatedPending = { ...subPending }; - updatedPending[subItem.label] = true; - setSubPending(updatedPending); - startTransition(() => { - router.push(subItem.href); - // Reset loading state after transition - setTimeout(() => { - const resetPending = { ...subPending }; - resetPending[subItem.label] = false; - setSubPending(resetPending); - }, 300); - }); - } - }; - - return ( - - - - {subPending[subItem.label] ? ( - - ) : SubIcon ? ( - - ) : null} - {subItem.label} - - - - ); - })} - - - - - ); -}); - -const NavItems = memo(({ item }: { item: NavItem & { items?: NavItem[] } }) => { - if (!item.items || item.items.length === 0) { - return ; - } - return ; -}); - -const ToggleSidebarButton = memo( - ({ - toggleNavItem, - toggleSidebar, - }: { - toggleNavItem: NavItem; - toggleSidebar: () => void; - }) => { - const Icon = toggleNavItem.icon; - - return ( - - - {Icon && } - {toggleNavItem.label} - - - ); - }, -); - -if (typeof document !== "undefined") { - const style = document.createElement("style"); - style.textContent = ` - @media (prefers-reduced-motion: reduce) { - [data-prefers-reduced-motion="respect-motion-preference"] { - animation: none !important; - transition: none !important; - } - } - - @keyframes spin-slow { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } - } - - .animate-spin-slow { - animation: spin-slow 1.5s linear infinite; - } - `; - document.head.appendChild(style); -} diff --git a/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/flat-nav-item.tsx b/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/flat-nav-item.tsx index 556737b4b0..1c7466102e 100644 --- a/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/flat-nav-item.tsx +++ b/apps/dashboard/components/navigation/sidebar/app-sidebar/components/nav-items/flat-nav-item.tsx @@ -35,7 +35,7 @@ export const FlatNavItem = ({ }; return ( - + & { workspace: Workspace }) { +}: React.ComponentProps & { workspace: Workspace & { quotas?: Quotas } }) { const segments = useSelectedLayoutSegments() ?? []; // Create base navigation items @@ -93,7 +94,7 @@ export function AppSidebar({ return ( {headerContent} - + {/* Toggle button as NavItem */} @@ -112,6 +113,10 @@ export function AppSidebar({ ))} + + + + diff --git a/apps/dashboard/components/navigation/sidebar/usage-banner.tsx b/apps/dashboard/components/navigation/sidebar/usage-banner.tsx new file mode 100644 index 0000000000..851340d674 --- /dev/null +++ b/apps/dashboard/components/navigation/sidebar/usage-banner.tsx @@ -0,0 +1,52 @@ +"use client"; +import { ProgressCircle } from "@/app/(app)/settings/billing/components/usage"; +import { trpc } from "@/lib/trpc/client"; +import type { Quotas } from "@unkey/db"; +import { Button } from "@unkey/ui"; +import Link from "next/link"; +import type React from "react"; +import { FlatNavItem } from "./app-sidebar/components/nav-items/flat-nav-item"; + +type Props = { + quotas: Quotas; +}; + +export const UsageBanner: React.FC = ({ quotas }) => { + const usage = trpc.billing.queryUsage.useQuery(undefined, { + refetchOnMount: true, + refetchInterval: 60 * 1000, + }); + + const current = usage.data?.billableTotal ?? 0; + const max = quotas.requestsPerMonth; + + const shouldUpgrade = current / max > 0.9; + + return ( + ( + + ), + href: "/settings/billing", + label: `Usage ${Math.round((current / max) * 100).toLocaleString()}%`, + tag: shouldUpgrade ? ( + + + + ) : null, + }} + /> + ); +}; diff --git a/apps/dashboard/components/navigation/sidebar/user-button.tsx b/apps/dashboard/components/navigation/sidebar/user-button.tsx index b494de1614..28f987991d 100644 --- a/apps/dashboard/components/navigation/sidebar/user-button.tsx +++ b/apps/dashboard/components/navigation/sidebar/user-button.tsx @@ -21,7 +21,7 @@ export const UserButton: React.FC = () => { const { isMobile, state, openMobile } = useSidebar(); const { data: user, error } = trpc.user.getCurrentUser.useQuery(); if (!user || error) { - return null; + return
; } // When mobile sidebar is open, we want to show the full component diff --git a/apps/dashboard/lib/trpc/routers/billing/query-usage/index.ts b/apps/dashboard/lib/trpc/routers/billing/query-usage/index.ts new file mode 100644 index 0000000000..e0cd9711e2 --- /dev/null +++ b/apps/dashboard/lib/trpc/routers/billing/query-usage/index.ts @@ -0,0 +1,40 @@ +import { clickhouse } from "@/lib/clickhouse"; +import { ratelimit, requireWorkspace, t, withRatelimit } from "@/lib/trpc/trpc"; +import { TRPCError } from "@trpc/server"; +import { queryUsageResponse } from "./schemas"; + +export const queryUsage = t.procedure + .use(requireWorkspace) + .use(withRatelimit(ratelimit.read)) + .output(queryUsageResponse) + .query(async ({ ctx }) => { + const dateNow = new Date(); + const year = dateNow.getUTCFullYear(); + const month = dateNow.getUTCMonth() + 1; + + const [billableRatelimits, billableVerifications] = await Promise.all([ + clickhouse.billing.billableRatelimits({ + workspaceId: ctx.workspace.id, + year, + month, + }), + clickhouse.billing.billableVerifications({ + workspaceId: ctx.workspace.id, + year, + month, + }), + ]); + + if (billableRatelimits === null || billableVerifications === null) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Failed to fetch billing usage data. Please try again later.", + }); + } + + return { + billableRatelimits, + billableVerifications, + billableTotal: billableRatelimits + billableVerifications, + }; + }); diff --git a/apps/dashboard/lib/trpc/routers/billing/query-usage/schemas.ts b/apps/dashboard/lib/trpc/routers/billing/query-usage/schemas.ts new file mode 100644 index 0000000000..e707cede3b --- /dev/null +++ b/apps/dashboard/lib/trpc/routers/billing/query-usage/schemas.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +export const queryUsageResponse = z.object({ + billableRatelimits: z.number(), + billableVerifications: z.number(), + billableTotal: z.number(), +}); + +export type UsageResponse = z.infer; diff --git a/apps/dashboard/lib/trpc/routers/index.ts b/apps/dashboard/lib/trpc/routers/index.ts index 712f428a8d..bc3abf4263 100644 --- a/apps/dashboard/lib/trpc/routers/index.ts +++ b/apps/dashboard/lib/trpc/routers/index.ts @@ -15,6 +15,7 @@ import { updateApiIpWhitelist } from "./api/updateIpWhitelist"; import { updateApiName } from "./api/updateName"; import { fetchAuditLog } from "./audit/fetch"; import { auditLogsSearch } from "./audit/llm-search"; +import { queryUsage } from "./billing/query-usage"; import { createKey } from "./key/create"; import { createRootKey } from "./key/createRootKey"; import { deleteKeys } from "./key/delete"; @@ -177,6 +178,9 @@ export const router = t.router({ queryTimeseries, llmSearch, }), + billing: t.router({ + queryUsage, + }), audit: t.router({ logs: fetchAuditLog, llmSearch: auditLogsSearch, diff --git a/apps/dashboard/lib/trpc/routers/workspace/create.ts b/apps/dashboard/lib/trpc/routers/workspace/create.ts index ffa9a3fe94..5c361f29cb 100644 --- a/apps/dashboard/lib/trpc/routers/workspace/create.ts +++ b/apps/dashboard/lib/trpc/routers/workspace/create.ts @@ -34,7 +34,7 @@ export const createWorkspace = t.procedure // dumb hack to keep the unique property but also clearly mark it as a workos identifier clerkTenantId: `workos_${orgId}`, name: input.name, - plan: "pro", + plan: "free", tier: "Free", stripeCustomerId: null, stripeSubscriptionId: null, diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index fc88e02664..6eeb0bf5dc 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -22,6 +22,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-primitive": "^2.0.2", "@radix-ui/react-progress": "^1.0.3", "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", diff --git a/apps/engineering/content/design/icons.mdx b/apps/engineering/content/design/icons.mdx index 1f7e6a9fe3..43fe4d0990 100644 --- a/apps/engineering/content/design/icons.mdx +++ b/apps/engineering/content/design/icons.mdx @@ -21,6 +21,7 @@ import { CalendarEvent, CaretDown, CaretExpandY, + ChartUsage, CaretRight, CaretRightOutline, CaretUp, @@ -126,7 +127,7 @@ import { IconName } from "@unkey/icons"; - + @@ -164,6 +165,9 @@ import { IconName } from "@unkey/icons"; + + + @@ -182,7 +186,7 @@ import { IconName } from "@unkey/icons"; - + diff --git a/apps/engineering/content/infrastructure/stripe/subscriptions.mdx b/apps/engineering/content/infrastructure/stripe/subscriptions.mdx index 5c59bc9a9c..ce493109a8 100644 --- a/apps/engineering/content/infrastructure/stripe/subscriptions.mdx +++ b/apps/engineering/content/infrastructure/stripe/subscriptions.mdx @@ -97,7 +97,7 @@ workspaces { stripeSubscriptionId: string | null tier: string subscriptions: object | null // Legacy - quota: { + quotas: { requestsPerMonth: number logsRetentionDays: number auditLogsRetentionDays: number diff --git a/internal/db/src/schema/workspaces.ts b/internal/db/src/schema/workspaces.ts index 152b847b70..3842e6cf17 100644 --- a/internal/db/src/schema/workspaces.ts +++ b/internal/db/src/schema/workspaces.ts @@ -130,5 +130,5 @@ export const workspacesRelations = relations(workspaces, ({ many, one }) => ({ ratelimitNamespaces: many(ratelimitNamespaces), keySpaces: many(keyAuth), identities: many(identities), - quota: one(quotas), + quotas: one(quotas), })); diff --git a/internal/icons/src/icons/Readme.txt b/internal/icons/src/icons/Readme.txt new file mode 100644 index 0000000000..bf4311da37 --- /dev/null +++ b/internal/icons/src/icons/Readme.txt @@ -0,0 +1,7 @@ +Here's the list of props you should pass to your icon instance: +- width: icon width (available if 'Use props for height/width values' was checked while exporting); +- height: icon height (available if 'Use props for height/width values' was checked while exporting); +- fill: icon color (available if 'Use props for inline colors' was checked while exporting); +- secondaryfill: icon secondary color (available if 'Use props for inline colors' was checked while exporting); +- strokewidth: icon stroke width (available if 'Use props for stroke-width values' was checked while exporting); +- title: icon title (available if 'Remove ' was not checked while exporting). \ No newline at end of file diff --git a/internal/icons/src/icons/chart-usage.tsx b/internal/icons/src/icons/chart-usage.tsx new file mode 100644 index 0000000000..6edae7cc61 --- /dev/null +++ b/internal/icons/src/icons/chart-usage.tsx @@ -0,0 +1,51 @@ +/** + * Copyright © Nucleo + * Version 1.3, January 3, 2024 + * Nucleo Icons + * https://nucleoapp.com/ + * - Redistribution of icons is prohibited. + * - Icons are restricted for use only within the product they are bundled with. + * + * For more details: + * https://nucleoapp.com/license + */ +import type React from "react"; +import type { IconProps } from "../props"; + +export const ChartUsage: React.FC<IconProps> = (props) => { + return ( + <svg height="18" width="18" {...props} viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"> + <g fill="currentColor"> + <path + d="M15.602,6c.416,.914,.648,1.93,.648,3,0,2.066-.864,3.929-2.25,5.25" + fill="none" + stroke="currentColor" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="1.5" + /> + <path + d="M4,14.25c-1.386-1.321-2.25-3.184-2.25-5.25C1.75,4.996,4.996,1.75,9,1.75c1.938,0,3.699,.761,5,2" + fill="none" + stroke="currentColor" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="1.5" + /> + <circle cx="7" cy="7" fill="currentColor" r="1" stroke="none" /> + <circle cx="11" cy="11" fill="currentColor" r="1" stroke="none" /> + <line + fill="none" + stroke="currentColor" + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="1.5" + x1="7" + x2="11" + y1="11.25" + y2="6.75" + /> + </g> + </svg> + ); +}; diff --git a/internal/icons/src/index.ts b/internal/icons/src/index.ts index 570183828b..951b085c5f 100644 --- a/internal/icons/src/index.ts +++ b/internal/icons/src/index.ts @@ -19,6 +19,7 @@ export * from "./icons/check"; export * from "./icons/chevron-down"; export * from "./icons/chevron-expand-y"; export * from "./icons/chevron-left"; +export * from "./icons/chart-usage"; export * from "./icons/chevron-right"; export * from "./icons/chevron-up"; export * from "./icons/circle-carret-right"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b321bbb121..cca2a06085 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -179,7 +179,7 @@ importers: version: 4.0.9 ai: specifier: ^3.4.7 - version: 3.4.7(react@18.3.1)(svelte@5.25.6)(vue@3.5.13)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.25.8)(vue@3.5.13)(zod@3.23.8) drizzle-orm: specifier: ^0.33.0 version: 0.33.0(@opentelemetry/api@1.4.1)(@planetscale/database@1.19.0)(@types/react@18.3.11)(react@18.3.1) @@ -256,6 +256,9 @@ importers: '@radix-ui/react-popover': 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) + '@radix-ui/react-primitive': + specifier: ^2.0.2 + version: 2.0.2(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-progress': 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) @@ -1064,7 +1067,7 @@ importers: version: link:../../packages/error ai: specifier: ^3.0.23 - version: 3.4.7(react@18.3.1)(svelte@5.25.6)(vue@3.5.13)(zod@3.23.8) + version: 3.4.7(react@18.3.1)(svelte@5.25.8)(vue@3.5.13)(zod@3.23.8) zod: specifier: 3.23.8 version: 3.23.8 @@ -1335,7 +1338,7 @@ importers: version: 18.3.1 react-email: specifier: 2.1.1 - version: 2.1.1(@babel/core@7.26.10)(eslint@9.23.0)(ts-node@10.9.2) + version: 2.1.1(@babel/core@7.26.10)(eslint@9.24.0)(ts-node@10.9.2) resend: specifier: ^4.0.0 version: 4.0.0(react-dom@18.3.1)(react@18.3.1) @@ -1906,7 +1909,7 @@ packages: - zod dev: false - /@ai-sdk/svelte@0.0.51(svelte@5.25.6)(zod@3.23.8): + /@ai-sdk/svelte@0.0.51(svelte@5.25.8)(zod@3.23.8): resolution: {integrity: sha512-aIZJaIds+KpCt19yUDCRDWebzF/17GCY7gN9KkcA2QM6IKRO5UmMcqEYja0ZmwFQPm1kBZkF2njhr8VXis2mAw==} engines: {node: '>=18'} peerDependencies: @@ -1917,8 +1920,8 @@ packages: dependencies: '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) - sswr: 2.1.0(svelte@5.25.6) - svelte: 5.25.6 + sswr: 2.1.0(svelte@5.25.8) + svelte: 5.25.8 transitivePeerDependencies: - zod dev: false @@ -2658,8 +2661,8 @@ packages: bundledDependencies: - is-unicode-supported - /@clerk/backend@1.26.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ioZBMnwm4DD8IVPGDjFW3wkyn1JTMvTlsmdHGYsjdbXLtbRFVRJelAIMMGLcSmqMgzTKxnrJSOz8PxPjSMUFtw==} + /@clerk/backend@1.27.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-WqdigkqGyVcU0Y08xCJSor6I8j7WxtlZfMlIbHyw+JM8U06kNVSX9umRmTePFRFN02EwIQmQmqnRXVn0kwMyBQ==} engines: {node: '>=18.17.0'} peerDependencies: svix: ^1.62.0 @@ -2667,8 +2670,8 @@ packages: svix: optional: true dependencies: - '@clerk/shared': 3.3.0(react-dom@18.3.1)(react@18.3.1) - '@clerk/types': 4.50.2 + '@clerk/shared': 3.4.0(react-dom@18.3.1)(react@18.3.1) + '@clerk/types': 4.51.0 cookie: 1.0.2 snakecase-keys: 8.0.1 tslib: 2.8.1 @@ -2682,9 +2685,9 @@ packages: engines: {node: '>=18.17.0'} deprecated: 'January 10 2025 marks the end of support for @clerk/clerk-sdk-node as previously announced in our October 2024 deprecation notice. Express users can migrate to the @clerk/express package. For more information, you can find our changelog here: https://clerk.com/changelog/2025-01-10-node-sdk-eol' dependencies: - '@clerk/backend': 1.26.0(react-dom@18.3.1)(react@18.3.1) + '@clerk/backend': 1.27.0(react-dom@18.3.1)(react@18.3.1) '@clerk/shared': 2.22.0(react-dom@18.3.1)(react@18.3.1) - '@clerk/types': 4.50.2 + '@clerk/types': 4.51.0 tslib: 2.4.1 transitivePeerDependencies: - react @@ -2705,18 +2708,18 @@ packages: react-dom: optional: true dependencies: - '@clerk/types': 4.50.2 + '@clerk/types': 4.51.0 dequal: 2.0.3 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - std-env: 3.8.1 + std-env: 3.9.0 swr: 2.3.3(react@18.3.1) dev: false - /@clerk/shared@3.3.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-hO1M5aRMzJVqkw6lWJ7NFVG5hWEnTZBUZGeHMYRwSPQzQNsgqsRMvpmaJO0Y2o0HNk50PpwZHaiFHcghUpfMiw==} + /@clerk/shared@3.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3ms1JZVNXe/qJXdsFY+QlOYKcocdMKDHXDr/EvpuQV+WsLKkpMcswH2fbWNhsWG2otekL2sIYBVkCy+/0hBlPA==} engines: {node: '>=18.17.0'} requiresBuild: true peerDependencies: @@ -2728,18 +2731,18 @@ packages: react-dom: optional: true dependencies: - '@clerk/types': 4.50.2 + '@clerk/types': 4.51.0 dequal: 2.0.3 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - std-env: 3.8.1 + std-env: 3.9.0 swr: 2.3.3(react@18.3.1) dev: false - /@clerk/types@4.50.2: - resolution: {integrity: sha512-4m1RlV/Dl3ZGW5FAXmKfdCbhF7uTDDvaADZH1F6L3d3lRBdI6i7GppK1KqscOSgoC8OwJqGaiDVUPsg+Pp8usg==} + /@clerk/types@4.51.0: + resolution: {integrity: sha512-igUZ5BOe3rOgQSM8v9f6zHCOowX3yV36zWYImMUWD61cpLqUokKtN6qH2x8sHUHrq3B9Dj3AsXItGaQsLNs3mw==} engines: {node: '>=18.17.0'} dependencies: csstype: 3.1.3 @@ -4845,13 +4848,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.5.1(eslint@9.23.0): + /@eslint-community/eslint-utils@4.5.1(eslint@9.24.0): resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} 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.23.0 + eslint: 9.24.0 eslint-visitor-keys: 3.4.3 dev: false @@ -4860,8 +4863,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: false - /@eslint/config-array@0.19.2: - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + /@eslint/config-array@0.20.0: + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: '@eslint/object-schema': 2.1.6 @@ -4907,8 +4910,8 @@ packages: - supports-color dev: false - /@eslint/js@9.23.0: - resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + /@eslint/js@9.24.0: + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: false @@ -5414,8 +5417,8 @@ packages: dev: true optional: true - /@inquirer/checkbox@4.1.4(@types/node@20.17.30): - resolution: {integrity: sha512-d30576EZdApjAMceijXA5jDzRQHT/MygbC+J8I7EqA6f/FRpYxlRtRJbHF8gHeWYeSdOuTEJqonn7QLB1ELezA==} + /@inquirer/checkbox@4.1.5(@types/node@20.17.30): + resolution: {integrity: sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5423,9 +5426,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 @@ -5439,8 +5442,8 @@ packages: '@inquirer/type': 1.5.5 dev: true - /@inquirer/confirm@5.1.8(@types/node@20.17.30): - resolution: {integrity: sha512-dNLWCYZvXDjO3rnQfk2iuJNL4Ivwz/T2+C3+WnNfJKsNGSuOs3wAo2F6e0p946gtSAk31nZMfW+MRmYaplPKsg==} + /@inquirer/confirm@5.1.9(@types/node@20.17.30): + resolution: {integrity: sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5448,13 +5451,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 dev: true - /@inquirer/core@10.1.9(@types/node@20.17.30): - resolution: {integrity: sha512-sXhVB8n20NYkUBfDYgizGHlpRVaCRjtuzNZA6xpALIUbkgfd2Hjz+DfEN6+h1BRnuxw0/P4jCIMjMsEOAMwAJw==} + /@inquirer/core@10.1.10(@types/node@20.17.30): + resolution: {integrity: sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5463,7 +5466,7 @@ packages: optional: true dependencies: '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -5491,8 +5494,8 @@ packages: yoctocolors-cjs: 2.1.2 dev: true - /@inquirer/editor@4.2.9(@types/node@20.17.30): - resolution: {integrity: sha512-8HjOppAxO7O4wV1ETUlJFg6NDjp/W2NP5FB9ZPAcinAlNT4ZIWOLe2pUVwmmPRSV0NMdI5r/+lflN55AwZOKSw==} + /@inquirer/editor@4.2.10(@types/node@20.17.30): + resolution: {integrity: sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5500,14 +5503,14 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 external-editor: 3.1.0 dev: true - /@inquirer/expand@4.0.11(@types/node@20.17.30): - resolution: {integrity: sha512-OZSUW4hFMW2TYvX/Sv+NnOZgO8CHT2TU1roUCUIF2T+wfw60XFRRp9MRUPCT06cRnKL+aemt2YmTWwt7rOrNEA==} + /@inquirer/expand@4.0.12(@types/node@20.17.30): + resolution: {integrity: sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5515,8 +5518,8 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 yoctocolors-cjs: 2.1.2 dev: true @@ -5526,8 +5529,8 @@ packages: engines: {node: '>=18'} dev: true - /@inquirer/input@4.1.8(@types/node@20.17.30): - resolution: {integrity: sha512-WXJI16oOZ3/LiENCAxe8joniNp8MQxF6Wi5V+EBbVA0ZIOpFcL4I9e7f7cXse0HJeIPCWO8Lcgnk98juItCi7Q==} + /@inquirer/input@4.1.9(@types/node@20.17.30): + resolution: {integrity: sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5535,13 +5538,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 dev: true - /@inquirer/number@3.0.11(@types/node@20.17.30): - resolution: {integrity: sha512-pQK68CsKOgwvU2eA53AG/4npRTH2pvs/pZ2bFvzpBhrznh8Mcwt19c+nMO7LHRr3Vreu1KPhNBF3vQAKrjIulw==} + /@inquirer/number@3.0.12(@types/node@20.17.30): + resolution: {integrity: sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5549,13 +5552,13 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 dev: true - /@inquirer/password@4.0.11(@types/node@20.17.30): - resolution: {integrity: sha512-dH6zLdv+HEv1nBs96Case6eppkRggMe8LoOTl30+Gq5Wf27AO/vHFgStTVz4aoevLdNXqwE23++IXGw4eiOXTg==} + /@inquirer/password@4.0.12(@types/node@20.17.30): + resolution: {integrity: sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5563,14 +5566,14 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 ansi-escapes: 4.3.2 dev: true - /@inquirer/prompts@7.4.0(@types/node@20.17.30): - resolution: {integrity: sha512-EZiJidQOT4O5PYtqnu1JbF0clv36oW2CviR66c7ma4LsupmmQlUwmdReGKRp456OWPWMz3PdrPiYg3aCk3op2w==} + /@inquirer/prompts@7.4.1(@types/node@20.17.30): + resolution: {integrity: sha512-UlmM5FVOZF0gpoe1PT/jN4vk8JmpIWBlMvTL8M+hlvPmzN89K6z03+IFmyeu/oFCenwdwHDr2gky7nIGSEVvlA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5578,21 +5581,21 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/checkbox': 4.1.4(@types/node@20.17.30) - '@inquirer/confirm': 5.1.8(@types/node@20.17.30) - '@inquirer/editor': 4.2.9(@types/node@20.17.30) - '@inquirer/expand': 4.0.11(@types/node@20.17.30) - '@inquirer/input': 4.1.8(@types/node@20.17.30) - '@inquirer/number': 3.0.11(@types/node@20.17.30) - '@inquirer/password': 4.0.11(@types/node@20.17.30) - '@inquirer/rawlist': 4.0.11(@types/node@20.17.30) - '@inquirer/search': 3.0.11(@types/node@20.17.30) - '@inquirer/select': 4.1.0(@types/node@20.17.30) + '@inquirer/checkbox': 4.1.5(@types/node@20.17.30) + '@inquirer/confirm': 5.1.9(@types/node@20.17.30) + '@inquirer/editor': 4.2.10(@types/node@20.17.30) + '@inquirer/expand': 4.0.12(@types/node@20.17.30) + '@inquirer/input': 4.1.9(@types/node@20.17.30) + '@inquirer/number': 3.0.12(@types/node@20.17.30) + '@inquirer/password': 4.0.12(@types/node@20.17.30) + '@inquirer/rawlist': 4.0.12(@types/node@20.17.30) + '@inquirer/search': 3.0.12(@types/node@20.17.30) + '@inquirer/select': 4.1.1(@types/node@20.17.30) '@types/node': 20.17.30 dev: true - /@inquirer/rawlist@4.0.11(@types/node@20.17.30): - resolution: {integrity: sha512-uAYtTx0IF/PqUAvsRrF3xvnxJV516wmR6YVONOmCWJbbt87HcDHLfL9wmBQFbNJRv5kCjdYKrZcavDkH3sVJPg==} + /@inquirer/rawlist@4.0.12(@types/node@20.17.30): + resolution: {integrity: sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5600,14 +5603,14 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 yoctocolors-cjs: 2.1.2 dev: true - /@inquirer/search@3.0.11(@types/node@20.17.30): - resolution: {integrity: sha512-9CWQT0ikYcg6Ls3TOa7jljsD7PgjcsYEM0bYE+Gkz+uoW9u8eaJCRHJKkucpRE5+xKtaaDbrND+nPDoxzjYyew==} + /@inquirer/search@3.0.12(@types/node@20.17.30): + resolution: {integrity: sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5615,15 +5618,15 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 yoctocolors-cjs: 2.1.2 dev: true - /@inquirer/select@4.1.0(@types/node@20.17.30): - resolution: {integrity: sha512-z0a2fmgTSRN+YBuiK1ROfJ2Nvrpij5lVN3gPDkQGhavdvIVGHGW29LwYZfM/j42Ai2hUghTI/uoBuTbrJk42bA==} + /@inquirer/select@4.1.1(@types/node@20.17.30): + resolution: {integrity: sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -5631,9 +5634,9 @@ packages: '@types/node': optional: true dependencies: - '@inquirer/core': 10.1.9(@types/node@20.17.30) + '@inquirer/core': 10.1.10(@types/node@20.17.30) '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@20.17.30) + '@inquirer/type': 3.0.6(@types/node@20.17.30) '@types/node': 20.17.30 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 @@ -5653,8 +5656,8 @@ packages: mute-stream: 1.0.0 dev: true - /@inquirer/type@3.0.5(@types/node@20.17.30): - resolution: {integrity: sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg==} + /@inquirer/type@3.0.6(@types/node@20.17.30): + resolution: {integrity: sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -6621,7 +6624,7 @@ packages: resolution: {integrity: sha512-UF6GD/aDbElP6LJMZSSq72NvK0aQwtQ+fkjn0VLU9o1vNAA3M2K0tGL7lduZGQNw8LejOhr25eR4aXeRCgKb2A==} engines: {node: '>=18.0.0'} dependencies: - '@inquirer/prompts': 7.4.0(@types/node@20.17.30) + '@inquirer/prompts': 7.4.1(@types/node@20.17.30) '@oclif/core': 4.2.8 ansis: 3.17.0 fast-levenshtein: 3.0.0 @@ -11255,7 +11258,7 @@ packages: '@opentelemetry/semantic-conventions': 1.13.0 '@trigger.dev/core': 3.3.17 chalk: 5.4.1 - cronstrue: 2.57.0 + cronstrue: 2.58.0 debug: 4.4.0(supports-color@8.1.1) evt: 2.5.9 slug: 6.1.0 @@ -11815,7 +11818,7 @@ packages: dependencies: '@types/node': 20.17.30 tapable: 2.2.1 - webpack: 5.98.0(@swc/core@1.3.101)(esbuild@0.19.11) + webpack: 5.99.2(@swc/core@1.3.101)(esbuild@0.19.11) transitivePeerDependencies: - '@swc/core' - esbuild @@ -12468,7 +12471,7 @@ packages: indent-string: 5.0.0 dev: true - /ai@3.4.7(react@18.3.1)(svelte@5.25.6)(vue@3.5.13)(zod@3.23.8): + /ai@3.4.7(react@18.3.1)(svelte@5.25.8)(vue@3.5.13)(zod@3.23.8): resolution: {integrity: sha512-SutkVjFE86+xNql7fJERJkSEwpILEuiQvCoogJef6ZX/PGHvu3yepwHwVwedgABXe9SudOIKN48EQESrXX/xCw==} engines: {node: '>=18'} peerDependencies: @@ -12493,7 +12496,7 @@ packages: '@ai-sdk/provider-utils': 1.0.20(zod@3.23.8) '@ai-sdk/react': 0.0.62(react@18.3.1)(zod@3.23.8) '@ai-sdk/solid': 0.0.49(zod@3.23.8) - '@ai-sdk/svelte': 0.0.51(svelte@5.25.6)(zod@3.23.8) + '@ai-sdk/svelte': 0.0.51(svelte@5.25.8)(zod@3.23.8) '@ai-sdk/ui-utils': 0.0.46(zod@3.23.8) '@ai-sdk/vue': 0.0.53(vue@3.5.13)(zod@3.23.8) '@opentelemetry/api': 1.4.1 @@ -12503,7 +12506,7 @@ packages: nanoid: 3.3.6 react: 18.3.1 secure-json-parse: 2.7.0 - svelte: 5.25.6 + svelte: 5.25.8 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) transitivePeerDependencies: @@ -12843,7 +12846,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12859,7 +12862,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12874,7 +12877,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -13113,8 +13116,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001709 - electron-to-chromium: 1.5.130 + caniuse-lite: 1.0.30001712 + electron-to-chromium: 1.5.134 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -13257,8 +13260,8 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001709: - resolution: {integrity: sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==} + /caniuse-lite@1.0.30001712: + resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==} /capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -13954,8 +13957,8 @@ packages: /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cronstrue@2.57.0: - resolution: {integrity: sha512-gQOfxJa1RA9uDT4hx37NshhX4dW9t9zTCtIYu15LUziH+mkpuLXYcSEyM8ZewMJ2p8UVuHGjI3n4hGpu3HtCbg==} + /cronstrue@2.58.0: + resolution: {integrity: sha512-5P3esL5URj/u1h7N1zYl33V9XHNh15DQVGQITdIq7kAY78rP9tMYxXgi8kCXGoFqbyXFMMQRvzthHTYxUtp9Fw==} hasBin: true dev: false @@ -15081,8 +15084,8 @@ packages: jake: 10.9.2 dev: true - /electron-to-chromium@1.5.130: - resolution: {integrity: sha512-Ou2u7L9j2XLZbhqzyX0jWDj6gA8D3jIfVzt4rikLf3cGBa0VdReuFimBKS9tQJA4+XpeCxj1NoWlfBXzbMa9IA==} + /electron-to-chromium@1.5.134: + resolution: {integrity: sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==} /emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -15609,31 +15612,31 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@9.0.0(eslint@9.23.0): + /eslint-config-prettier@9.0.0(eslint@9.24.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 9.23.0 + eslint: 9.24.0 dev: false - /eslint-config-turbo@1.10.12(eslint@9.23.0): + /eslint-config-turbo@1.10.12(eslint@9.24.0): resolution: {integrity: sha512-z3jfh+D7UGYlzMWGh+Kqz++hf8LOE96q3o5R8X4HTjmxaBWlLAWG+0Ounr38h+JLR2TJno0hU9zfzoPNkR9BdA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 9.23.0 - eslint-plugin-turbo: 1.10.12(eslint@9.23.0) + eslint: 9.24.0 + eslint-plugin-turbo: 1.10.12(eslint@9.24.0) dev: false - /eslint-plugin-turbo@1.10.12(eslint@9.23.0): + /eslint-plugin-turbo@1.10.12(eslint@9.24.0): resolution: {integrity: sha512-uNbdj+ohZaYo4tFJ6dStRXu2FZigwulR1b3URPXe0Q8YaE7thuekKNP+54CHtZPH9Zey9dmDx5btAQl9mfzGOw==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 9.23.0 + eslint: 9.24.0 dev: false /eslint-scope@5.1.1: @@ -15661,8 +15664,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - /eslint@9.23.0: - resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + /eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -15671,13 +15674,13 @@ packages: jiti: optional: true dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 + '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 '@eslint/core': 0.12.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.23.0 + '@eslint/js': 9.24.0 '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -15808,8 +15811,8 @@ packages: astring: 1.9.0 source-map: 0.7.4 - /estree-util-value-to-estree@3.3.2: - resolution: {integrity: sha512-hYH1aSvQI63Cvq3T3loaem6LW4u72F187zW4FHpTrReJSm6W66vYTFNO1vH/chmcOulp1HlAj1pxn8Ag0oXI5Q==} + /estree-util-value-to-estree@3.3.3: + resolution: {integrity: sha512-Db+m1WSD4+mUO7UgMeKkAwdbfNWwIxLt48XF2oFU9emPfXkIu+k5/nlOj313v7wqtAPo0f9REhUvznFrPkG8CQ==} dependencies: '@types/estree': 1.0.7 @@ -16588,7 +16591,7 @@ packages: chokidar: 4.0.3 cross-spawn: 7.0.6 esbuild: 0.24.2 - estree-util-value-to-estree: 3.3.2 + estree-util-value-to-estree: 3.3.3 fast-glob: 3.3.3 fumadocs-core: 14.4.0(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) gray-matter: 4.0.3 @@ -16610,7 +16613,7 @@ packages: '@apidevtools/json-schema-ref-parser': 11.9.3 '@fumari/json-schema-to-typescript': 1.1.3 '@radix-ui/react-select': 2.1.6(@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.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) class-variance-authority: 0.7.1 fast-glob: 3.3.3 fumadocs-core: 14.5.4(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) @@ -16734,7 +16737,7 @@ packages: '@radix-ui/react-navigation-menu': 1.2.5(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-popover': 1.1.6(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-scroll-area': 1.2.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.1.2(@types/react@18.3.11)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.11)(react@18.3.1) '@radix-ui/react-tabs': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) class-variance-authority: 0.7.1 fumadocs-core: 14.5.4(@types/react@18.3.11)(next@14.2.15)(react-dom@18.3.1)(react@18.3.1) @@ -20335,7 +20338,7 @@ packages: acorn: 8.14.1 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 dev: true /mock-property@1.0.3: @@ -20585,7 +20588,7 @@ packages: '@next/env': 14.1.0 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20628,7 +20631,7 @@ packages: '@opentelemetry/api': 1.4.1 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -20669,7 +20672,7 @@ packages: '@next/env': 14.2.25 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001709 + caniuse-lite: 1.0.30001712 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -21642,7 +21645,7 @@ packages: dependencies: core-js: 3.41.0 fflate: 0.4.8 - preact: 10.26.4 + preact: 10.26.5 web-vitals: 4.2.4 dev: false @@ -21666,8 +21669,8 @@ packages: - debug dev: false - /preact@10.26.4: - resolution: {integrity: sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==} + /preact@10.26.5: + resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} dev: false /prelude-ls@1.2.1: @@ -22078,7 +22081,7 @@ packages: react-is: 18.1.0 dev: false - /react-email@2.1.1(@babel/core@7.26.10)(eslint@9.23.0)(ts-node@10.9.2): + /react-email@2.1.1(@babel/core@7.26.10)(eslint@9.24.0)(ts-node@10.9.2): resolution: {integrity: sha512-09oMVl/jN0/Re0bT0sEqYjyyFSCN/Tg0YmzjC9wfYpnMx02Apk40XXitySDfUBMR9EgTdr6T4lYknACqiLK3mg==} engines: {node: '>=18.0.0'} hasBin: true @@ -22104,8 +22107,8 @@ packages: commander: 11.1.0 debounce: 2.0.0 esbuild: 0.19.11 - eslint-config-prettier: 9.0.0(eslint@9.23.0) - eslint-config-turbo: 1.10.12(eslint@9.23.0) + eslint-config-prettier: 9.0.0(eslint@9.24.0) + eslint-config-turbo: 1.10.12(eslint@9.24.0) framer-motion: 10.17.4(react-dom@18.3.1)(react@18.3.1) glob: 10.3.4 log-symbols: 4.1.0 @@ -22774,7 +22777,7 @@ packages: dependencies: '@types/mdast': 4.0.4 estree-util-is-identifier-name: 3.0.0 - estree-util-value-to-estree: 3.3.2 + estree-util-value-to-estree: 3.3.3 toml: 3.0.0 unified: 11.0.5 yaml: 2.7.1 @@ -23821,12 +23824,12 @@ packages: nan: 2.22.2 dev: true - /sswr@2.1.0(svelte@5.25.6): + /sswr@2.1.0(svelte@5.25.8): resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 dependencies: - svelte: 5.25.6 + svelte: 5.25.8 swrev: 4.0.0 dev: false @@ -23853,8 +23856,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + /std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} /stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} @@ -24170,8 +24173,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte@5.25.6: - resolution: {integrity: sha512-RGkaeAXDuJdvhA1fdSM5GgD++vYfJYijZL0uN6kM2s/TRJ663jktBhZlF0qjzAJGR/34PtaeT3G8MKJY1EKeqg==} + /svelte@5.25.8: + resolution: {integrity: sha512-yRmjmT5rgCZUMfCKS5varGlSe/nQyr2oClyIirbBChfTFc00YjVAyVWo1zOH74La3hi5KRSkNJKncyJ04PwIYA==} engines: {node: '>=18'} dependencies: '@ampproject/remapping': 2.3.0 @@ -24442,7 +24445,7 @@ packages: supports-hyperlinks: 2.3.0 dev: false - /terser-webpack-plugin@5.3.14(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.98.0): + /terser-webpack-plugin@5.3.14(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.99.2): resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -24465,7 +24468,7 @@ packages: schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.98.0(@swc/core@1.3.101)(esbuild@0.19.11) + webpack: 5.99.2(@swc/core@1.3.101)(esbuild@0.19.11) dev: false /terser@5.39.0: @@ -25117,8 +25120,8 @@ packages: hasBin: true dev: false - /ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + /ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} dev: true /uglify-js@2.8.29: @@ -25190,7 +25193,7 @@ packages: defu: 6.1.4 ohash: 1.1.6 pathe: 1.1.2 - ufo: 1.5.4 + ufo: 1.6.1 dev: true /unenv@2.0.0-rc.15: @@ -25200,7 +25203,7 @@ packages: exsolve: 1.0.4 ohash: 2.0.11 pathe: 2.0.3 - ufo: 1.5.4 + ufo: 1.6.1 dev: true /unherit@3.0.1: @@ -25768,7 +25771,7 @@ packages: magic-string: 0.30.17 pathe: 1.1.2 picocolors: 1.1.1 - std-env: 3.8.1 + std-env: 3.9.0 strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 @@ -25826,7 +25829,7 @@ packages: magic-string: 0.30.17 pathe: 1.1.2 picocolors: 1.1.1 - std-env: 3.8.1 + std-env: 3.9.0 strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 @@ -25966,8 +25969,8 @@ packages: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} dev: true - /webpack@5.98.0(@swc/core@1.3.101)(esbuild@0.19.11): - resolution: {integrity: sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==} + /webpack@5.99.2(@swc/core@1.3.101)(esbuild@0.19.11): + resolution: {integrity: sha512-1LYyB3DIKS4k2JlBHKp+b63b1jp9Nn86wypihsZOeKove7kpRCAVqN8pIle0wbs6a0p4kxkMt01lbb6Y93CpRw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -25996,7 +25999,7 @@ packages: neo-async: 2.6.2 schema-utils: 4.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.98.0) + terser-webpack-plugin: 5.3.14(@swc/core@1.3.101)(esbuild@0.19.11)(webpack@5.99.2) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/tools/migrate/seed_quotas.ts b/tools/migrate/seed_quotas.ts index cc7dce33f9..bc2a06de43 100644 --- a/tools/migrate/seed_quotas.ts +++ b/tools/migrate/seed_quotas.ts @@ -14,7 +14,7 @@ async function main() { const workspaces = await db.query.workspaces.findMany({ where: (table, { gt }) => gt(table.id, cursor), - with: { quota: true }, + with: { quotas: true }, limit: 1000, orderBy: (table, { asc }) => asc(table.id), });