diff --git a/.github/workflows/deploy-embed-script.yml b/.github/workflows/deploy-embed-script.yml new file mode 100644 index 0000000000..88cd06d1b8 --- /dev/null +++ b/.github/workflows/deploy-embed-script.yml @@ -0,0 +1,28 @@ +name: "Deploy embed script" + +on: + push: + branches: + - main + paths: + - "packages/embeds/core/**" + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Install dependencies & build + run: pnpm --filter @dub/embed-core build + + # - name: Deploy to Cloudflare Pages (https://www.dubcdn.com/embed/script.js) + # uses: cloudflare/wrangler-action@v3 + # with: + # apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} + # accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + # command: pages deploy dist/embed/script.js --project-name=dub-cdn --commit-dirty=true + # workingDirectory: packages/embeds/core + # packageManager: pnpm diff --git a/.github/workflows/publish-embed-react.yml b/.github/workflows/publish-embed-react.yml new file mode 100644 index 0000000000..a2c33052fe --- /dev/null +++ b/.github/workflows/publish-embed-react.yml @@ -0,0 +1,43 @@ +name: Publish `@dub/embed-react` + +on: + push: + branches: + - main + paths: + - "packages/embeds/react/**" + release: + types: [published] + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "18" + registry-url: "https://registry.npmjs.org" + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm --filter @dub/embed-react build + + - name: Publish + run: pnpm --filter @dub/embed-react publish --no-git-checks + if: github.event.release.prerelease == false + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Publish beta + run: pnpm --filter @dub/embed-react publish --no-git-checks --tag beta + if: github.event.release.prerelease == true + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/apps/web/app/api/analytics/client/route.ts b/apps/web/app/api/analytics/client/route.ts new file mode 100644 index 0000000000..9a5761133a --- /dev/null +++ b/apps/web/app/api/analytics/client/route.ts @@ -0,0 +1,50 @@ +import { getAnalytics } from "@/lib/analytics/get-analytics"; +import { calculateEarnings } from "@/lib/api/sales/commission"; +import { withEmbedToken } from "@/lib/embed/auth"; +import { analyticsQuerySchema } from "@/lib/zod/schemas/analytics"; +import { NextResponse } from "next/server"; + +// GET /api/analytics/client - get analytics for the current link +export const GET = withEmbedToken(async ({ link, searchParams, program }) => { + const parsedParams = analyticsQuerySchema + .pick({ + event: true, + start: true, + end: true, + interval: true, + groupBy: true, + timezone: true, + }) + .parse(searchParams); + + const response = await getAnalytics({ + ...parsedParams, + linkId: link.id, + }); + + let data; + + if (response instanceof Array) { + data = response.map((item) => { + return { + ...item, + earnings: calculateEarnings({ + program, + sales: item.sales ?? 0, + saleAmount: item.saleAmount ?? 0, + }), + }; + }); + } else { + data = { + ...response, + earnings: calculateEarnings({ + program, + sales: response.sales, + saleAmount: response.saleAmount, + }), + }; + } + + return NextResponse.json(data); +}); diff --git a/apps/web/app/api/dub/webhook/lead-created.ts b/apps/web/app/api/dub/webhook/lead-created.ts index cb212aaf4a..78adcd2fde 100644 --- a/apps/web/app/api/dub/webhook/lead-created.ts +++ b/apps/web/app/api/dub/webhook/lead-created.ts @@ -1,5 +1,5 @@ +import { REFERRAL_SIGNUPS_MAX } from "@/lib/embed/constants"; import { prisma } from "@/lib/prisma"; -import { REFERRAL_SIGNUPS_MAX } from "@/lib/referrals/constants"; import { LeadCreatedEvent } from "dub/models/components"; import { sendEmail } from "emails"; import NewReferralSignup from "emails/new-referral-signup"; diff --git a/apps/web/app/api/embed/sales/route.ts b/apps/web/app/api/embed/sales/route.ts new file mode 100644 index 0000000000..ff57e941ef --- /dev/null +++ b/apps/web/app/api/embed/sales/route.ts @@ -0,0 +1,35 @@ +import { withEmbedToken } from "@/lib/embed/auth"; +import { prisma } from "@/lib/prisma"; +import z from "@/lib/zod"; +import { PartnerSaleResponseSchema } from "@/lib/zod/schemas/partners"; +import { NextResponse } from "next/server"; + +// GET /api/embed/sales – get sales for a link from an embed token +export const GET = withEmbedToken(async ({ link }) => { + const sales = await prisma.sale.findMany({ + where: { + linkId: link.id, + }, + select: { + id: true, + amount: true, + earnings: true, + currency: true, + status: true, + createdAt: true, + updatedAt: true, + customer: { + select: { + email: true, + avatar: true, + }, + }, + }, + take: 3, + orderBy: { + createdAt: "desc", + }, + }); + + return NextResponse.json(z.array(PartnerSaleResponseSchema).parse(sales)); +}); diff --git a/apps/web/app/api/embed/token/route.ts b/apps/web/app/api/embed/token/route.ts new file mode 100644 index 0000000000..cabd97f5f6 --- /dev/null +++ b/apps/web/app/api/embed/token/route.ts @@ -0,0 +1,7 @@ +import { withEmbedToken } from "@/lib/embed/auth"; +import { NextResponse } from "next/server"; + +// GET /api/embed/token - get the embed token for the given link +export const GET = withEmbedToken(async ({ linkToken }) => { + return NextResponse.json(linkToken); +}); diff --git a/apps/web/app/api/events/client/route.ts b/apps/web/app/api/events/client/route.ts new file mode 100644 index 0000000000..1a8b002662 --- /dev/null +++ b/apps/web/app/api/events/client/route.ts @@ -0,0 +1,42 @@ +import { getEvents } from "@/lib/analytics/get-events"; +import { calculateEarnings } from "@/lib/api/sales/commission"; +import { withEmbedToken } from "@/lib/embed/auth"; +import { eventsQuerySchema } from "@/lib/zod/schemas/analytics"; +import { NextResponse } from "next/server"; + +// GET /api/events/client - get events for the current link +export const GET = withEmbedToken(async ({ searchParams, program, link }) => { + const parsedParams = eventsQuerySchema + .omit({ + linkId: true, + externalId: true, + domain: true, + root: true, + key: true, + tagId: true, + }) + .parse(searchParams); + + // TODO: + // Replace with sales data + + const response = await getEvents({ + ...parsedParams, + linkId: link.id, + }); + + return NextResponse.json( + response.map((item: any) => { + return { + ...item, + ...(parsedParams.event === "sales" && { + earnings: calculateEarnings({ + program, + sales: item.sales ?? 0, + saleAmount: item.sale?.amount ?? 0, + }), + }), + }; + }), + ); +}); diff --git a/apps/web/app/api/tokens/embed/route.ts b/apps/web/app/api/tokens/embed/route.ts new file mode 100644 index 0000000000..743883516a --- /dev/null +++ b/apps/web/app/api/tokens/embed/route.ts @@ -0,0 +1,30 @@ +import { getLinkOrThrow } from "@/lib/api/links/get-link-or-throw"; +import { parseRequestBody } from "@/lib/api/utils"; +import { withWorkspace } from "@/lib/auth"; +import { embedToken } from "@/lib/embed/embed-token"; +import { + createEmbedTokenSchema, + EmbedTokenSchema, +} from "@/lib/zod/schemas/token"; +import { NextResponse } from "next/server"; + +// POST /api/tokens/embed - create a new embed token for the given link +export const POST = withWorkspace( + async ({ workspace, req }) => { + const { linkId } = createEmbedTokenSchema.parse( + await parseRequestBody(req), + ); + + await getLinkOrThrow({ linkId, workspaceId: workspace.id }); + + const response = await embedToken.create(linkId); + + return NextResponse.json(EmbedTokenSchema.parse(response), { + status: 201, + }); + }, + { + requiredPermissions: ["links.write"], + requiredAddOn: "conversion", + }, +); diff --git a/apps/web/app/api/workspaces/[idOrSlug]/embed-token/route.ts b/apps/web/app/api/workspaces/[idOrSlug]/embed-token/route.ts new file mode 100644 index 0000000000..4a0492cd5c --- /dev/null +++ b/apps/web/app/api/workspaces/[idOrSlug]/embed-token/route.ts @@ -0,0 +1,27 @@ +import { DubApiError } from "@/lib/api/errors"; +import { withWorkspace } from "@/lib/auth"; +import { APP_DOMAIN_WITH_NGROK } from "@dub/utils"; +import { NextResponse } from "next/server"; + +// GET /api/workspaces/[idOrSlug]/embed-token - create a new public embed token for the workspace +export const POST = withWorkspace(async ({ workspace }) => { + const { referralLinkId } = workspace; + + if (!referralLinkId) { + throw new DubApiError({ + code: "bad_request", + message: "Referral link not found for this workspace.", + }); + } + + const token = await fetch(`${APP_DOMAIN_WITH_NGROK}/api/tokens/embed`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${process.env.DUB_API_KEY}`, + }, + body: JSON.stringify({ linkId: referralLinkId }), + }).then((res) => res.json()); + + return NextResponse.json(token); +}); diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx index c34cfbccdd..81a3c18a66 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/programs/[programId]/settings/program-settings.tsx @@ -4,11 +4,13 @@ import { updateProgramAction } from "@/lib/actions/update-program"; import useProgram from "@/lib/swr/use-program"; import useWorkspace from "@/lib/swr/use-workspace"; import { ProgramProps } from "@/lib/types"; +import { EmbedDocsSheet } from "@/ui/partners/embed-docs-sheet"; import { ProgramCommissionDescription } from "@/ui/partners/program-commission-description"; import { AnimatedSizeContainer, Button } from "@dub/ui"; -import { CircleCheckFill, LoadingSpinner } from "@dub/ui/src/icons"; +import { CircleCheckFill, Code, LoadingSpinner } from "@dub/ui/src/icons"; import { cn, pluralize } from "@dub/utils"; import { useAction } from "next-safe-action/hooks"; +import { useState } from "react"; import { FormProvider, useForm, @@ -59,6 +61,7 @@ type FormData = Pick< function ProgramSettingsForm({ program }: { program: ProgramProps }) { const { id: workspaceId } = useWorkspace(); + const [isEmbedDocsOpen, setIsEmbedDocsOpen] = useState(false); const form = useForm({ mode: "onBlur", @@ -107,219 +110,233 @@ function ProgramSettingsForm({ program }: { program: ProgramProps }) { }); return ( -
{ - await executeAsync({ - workspaceId: workspaceId || "", - programId: program.id, - ...data, - commissionAmount: - data.commissionType === "flat" - ? data.commissionAmount * 100 - : data.commissionAmount, - }); + <> + + { + await executeAsync({ + workspaceId: workspaceId || "", + programId: program.id, + ...data, + commissionAmount: + data.commissionType === "flat" + ? data.commissionAmount * 100 + : data.commissionAmount, + }); - // Reset isDirty state - reset(data); - })} - > -
-

Program

-
+ // Reset isDirty state + reset(data); + })} + > +
+

Program

+
-
- - - +
+ + + - -
- -
-
- {commissionTypes.map((commissionType) => ( -
- + +
+ - -
-
- -
- + Payout model + +
+ +
-
-
- -
- {commissionType === "flat" && ( - - $ - - )} - + +
+ {commissionType === "flat" && ( + + $ + )} - {...register("commissionAmount", { - required: true, - valueAsNumber: true, - min: 0, - max: commissionType === "flat" ? 1000 : 100, - })} - /> - - {commissionType === "flat" ? "USD" : "%"} - + + + {commissionType === "flat" ? "USD" : "%"} + +
-
-
-
+
+
-
-
-
-
- + + ); } diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx index 75af87ef57..0c92f5568c 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/billing/usage-chart.tsx @@ -3,8 +3,7 @@ import { Bars } from "@/ui/charts/bars"; import TimeSeriesChart from "@/ui/charts/time-series-chart"; import XAxis from "@/ui/charts/x-axis"; import YAxis from "@/ui/charts/y-axis"; -import { EmptyState } from "@dub/blocks/src/empty-state"; -import { LoadingSpinner } from "@dub/ui"; +import { EmptyState, LoadingSpinner } from "@dub/ui"; import { CircleDollar, CursorRays, Hyperlink } from "@dub/ui/src/icons"; import { formatDate, nFormatter } from "@dub/utils"; import { LinearGradient } from "@visx/gradient"; diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx index 1f48299913..1dd6ac1580 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/default-domains.tsx @@ -5,7 +5,7 @@ import useDefaultDomains from "@/lib/swr/use-default-domains"; import useWorkspace from "@/lib/swr/use-workspace"; import { DomainCardTitleColumn } from "@/ui/domains/domain-card-title-column"; import { UpgradeRequiredToast } from "@/ui/shared/upgrade-required-toast"; -import { Logo, Switch } from "@dub/ui"; +import { Logo, Switch, TooltipContent } from "@dub/ui"; import { Amazon, CalendarDays, @@ -15,7 +15,6 @@ import { GoogleEnhanced, Spotify, } from "@dub/ui/src/icons"; -import { TooltipContent } from "@dub/ui/src/tooltip"; import { DUB_DOMAINS } from "@dub/utils"; import Link from "next/link"; import { useEffect, useState } from "react"; diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/page-client.tsx index 54733f2fc5..1795d92ebb 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/page-client.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/domains/page-client.tsx @@ -14,18 +14,20 @@ import { useRegisterDomainSuccessModal } from "@/ui/modals/register-domain-succe import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state"; import EmptyState from "@/ui/shared/empty-state"; import { SearchBoxPersisted } from "@/ui/shared/search-box"; -import { PaginationControls } from "@dub/blocks/src/pagination-controls"; import { Badge, Button, + CursorRays, Globe, + InfoTooltip, + LinkBroken, + PaginationControls, Popover, + ToggleGroup, + TooltipContent, usePagination, useRouterStuff, } from "@dub/ui"; -import { CursorRays, LinkBroken } from "@dub/ui/src/icons"; -import { ToggleGroup } from "@dub/ui/src/toggle-group"; -import { InfoTooltip, TooltipContent } from "@dub/ui/src/tooltip"; import { capitalize, pluralize } from "@dub/utils"; import { ChevronDown, Crown } from "lucide-react"; import { useEffect, useState } from "react"; diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx index deb533a379..a6d18d5c0a 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/integrations/[integrationSlug]/page-client.tsx @@ -17,6 +17,8 @@ import { MaxWidthWrapper, Popover, TokenAvatar, + Tooltip, + TooltipContent, } from "@dub/ui"; import { CircleWarning, @@ -25,7 +27,6 @@ import { OfficeBuilding, ShieldCheck, } from "@dub/ui/src/icons"; -import { Tooltip, TooltipContent } from "@dub/ui/src/tooltip"; import { cn, formatDate, diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx index c0becc7b7f..4a53c8af81 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/tags/page-client.tsx @@ -7,8 +7,13 @@ import { TAGS_MAX_PAGE_SIZE } from "@/lib/zod/schemas/tags"; import { useAddEditTagModal } from "@/ui/modals/add-edit-tag-modal"; import { AnimatedEmptyState } from "@/ui/shared/animated-empty-state"; import { SearchBoxPersisted } from "@/ui/shared/search-box"; -import { PaginationControls } from "@dub/blocks"; -import { CardList, Tag, usePagination, useRouterStuff } from "@dub/ui"; +import { + CardList, + PaginationControls, + Tag, + usePagination, + useRouterStuff, +} from "@dub/ui"; import { createContext, Dispatch, SetStateAction, useState } from "react"; import { TagCard } from "./tag-card"; import { TagCardPlaceholder } from "./tag-card-placeholder"; diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx index 054308383e..11256098dc 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/library/utm/template-card.tsx @@ -11,13 +11,13 @@ import { Popover, Tooltip, useKeyboardShortcut, + UTM_PARAMETERS, } from "@dub/ui"; import { DiamondTurnRight, LoadingSpinner, PenWriting, } from "@dub/ui/src/icons"; -import { UTM_PARAMETERS } from "@dub/ui/src/utm-builder"; import { cn, formatDate } from "@dub/utils"; import { Fragment, useContext, useState } from "react"; import { toast } from "sonner"; diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/bank-account.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/bank-account.tsx index 0bd10dd3d9..4190d822cb 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/bank-account.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/bank-account.tsx @@ -1,8 +1,7 @@ "use client"; import useWorkspace from "@/lib/swr/use-workspace"; -import { StatusBadge, Tooltip } from "@dub/ui"; -import { SimpleTooltipContent } from "@dub/ui/src/tooltip"; +import { SimpleTooltipContent, StatusBadge, Tooltip } from "@dub/ui"; import { Fragment } from "react"; export const BankAccount = () => { diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/wallet.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/wallet.tsx index 359c9a3e70..7c22d0fe6f 100644 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/wallet.tsx +++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/payouts/wallet.tsx @@ -3,8 +3,7 @@ import useDotsApp from "@/lib/swr/use-dots-app"; import useWorkspace from "@/lib/swr/use-workspace"; import { useDepositFundsModal } from "@/ui/modals/deposit-funds-modal"; -import { Button } from "@dub/ui"; -import { SimpleTooltipContent } from "@dub/ui/src/tooltip"; +import { Button, SimpleTooltipContent } from "@dub/ui"; import { currencyFormatter } from "@dub/utils"; export const Wallet = () => { diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/activity-list.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/activity-list.tsx deleted file mode 100644 index 4d64db1d6e..0000000000 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/activity-list.tsx +++ /dev/null @@ -1,159 +0,0 @@ -"use client"; - -import { ConversionEvent } from "@/lib/actions/get-conversion-events"; -import { EventType } from "@/lib/analytics/types"; -import { REFERRAL_REVENUE_SHARE } from "@/lib/referrals/constants"; -import { EventList } from "@dub/blocks"; -import { - CaretUpFill, - ChartActivity2, - CursorRays, - Globe, - InvoiceDollar, - UserCheck, -} from "@dub/ui/src/icons"; -import { capitalize, COUNTRIES, currencyFormatter, timeAgo } from "@dub/utils"; -import { ClickEvent, LeadEvent, SaleEvent } from "dub/models/components"; -import { useSearchParams } from "next/navigation"; - -export function ActivityList({ - events, - totalEvents, - demo, -}: { - events: ConversionEvent[]; - totalEvents: number; - demo?: boolean; -}) { - const searchParams = useSearchParams(); - const event = (searchParams.get("event") || "clicks") as EventType; - - return ( -
- { - const Icon = { - clicks: CursorRays, - leads: UserCheck, - sales: InvoiceDollar, - }[event]; - return { - icon: , - content: { - clicks: , - leads: , - sales: , - }[event], - right: e.timestamp ? ( -
- {timeAgo(new Date(e.timestamp), { withAgo: true })} -
- ) : null, - }; - })} - totalEvents={totalEvents} - emptyState={{ - icon: ChartActivity2, - title: `${capitalize(event)} Activity`, - description: `No referral ${event} have been recorded yet.`, - learnMore: "https://d.to/conversions", - }} - /> - {demo && ( -
- )} -
- ); -} - -function ClickDescription({ event }: { event: ClickEvent }) { - return ( - <> - Someone from{" "} -
- {event.country ? ( - {event.country} - ) : ( - - )}{" "} - - {event.country ? COUNTRIES[event.country] : "Planet Earth"} - {" "} -
- clicked on your link - - ); -} - -function LeadDescription({ event }: { event: LeadEvent }) { - return ( - <> - Someone from{" "} -
- {event.country ? ( - {event.country} - ) : ( - - )}{" "} - - {event.country ? COUNTRIES[event.country] : "Planet Earth"} - {" "} -
- signed up for an account - - ); -} - -const saleText = { - "Subscription creation": "upgraded their account", - "Subscription paid": "paid their subscription", - "Plan upgraded": "upgraded their plan", - default: "made a payment", -}; - -function SaleDescription({ event }: { event: SaleEvent }) { - return ( -
-
- Someone from{" "} -
- {event.country ? ( - {event.country} - ) : ( - - )}{" "} - - {event.country ? COUNTRIES[event.country] : "Planet Earth"} - {" "} -
- {saleText[event.eventName] || saleText.default} -
- {event.saleAmount && event.saleAmount > 0 && ( - - {event.eventName === "Plan upgraded" && ( - - )} - {currencyFormatter( - Math.floor(event.saleAmount * REFERRAL_REVENUE_SHARE) / 100, - { - maximumFractionDigits: 2, - }, - )}{" "} - earned - - )} -
- ); -} diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/constants.ts b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/constants.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/event-tabs.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/event-tabs.tsx deleted file mode 100644 index dad47c15ce..0000000000 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/event-tabs.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useRouterStuff } from "@dub/ui"; -import { ToggleGroup } from "@dub/ui/src/toggle-group"; - -export function EventTabs() { - const { queryParams, searchParams } = useRouterStuff(); - return ( - queryParams({ set: { event }, del: "page" })} - /> - ); -} diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/generate-button.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/generate-button.tsx deleted file mode 100644 index 49faa9ecb4..0000000000 --- a/apps/web/app/app.dub.co/(dashboard)/[slug]/settings/referrals/generate-button.tsx +++ /dev/null @@ -1,35 +0,0 @@ -"use client"; - -import { generateReferralLink } from "@/lib/actions/generate-referral-link"; -import useWorkspace from "@/lib/swr/use-workspace"; -import { Button } from "@dub/ui"; -import { useAction } from "next-safe-action/hooks"; -import { useRouter } from "next/navigation"; -import { toast } from "sonner"; - -export function GenerateButton() { - const router = useRouter(); - const { id: workspaceId } = useWorkspace(); - - const { executeAsync, isExecuting, hasSucceeded } = useAction( - generateReferralLink, - { - onSuccess: () => { - router.refresh(); - toast.success("Referral link generated."); - }, - onError: ({ error }) => { - toast.error(error.serverError); - }, - }, - ); - - return ( - + + ); +} diff --git a/apps/web/ui/layout/sidebar/usage.tsx b/apps/web/ui/layout/sidebar/usage.tsx index f0b4007547..7e4cc2b0f3 100644 --- a/apps/web/ui/layout/sidebar/usage.tsx +++ b/apps/web/ui/layout/sidebar/usage.tsx @@ -2,8 +2,7 @@ import useWorkspace from "@/lib/swr/use-workspace"; import ManageSubscriptionButton from "@/ui/workspaces/manage-subscription-button"; -import { AnimatedSizeContainer, Icon } from "@dub/ui"; -import { buttonVariants } from "@dub/ui/src/button"; +import { AnimatedSizeContainer, Icon, buttonVariants } from "@dub/ui"; import { CursorRays, Hyperlink } from "@dub/ui/src/icons"; import { cn, getFirstAndLastDay, getNextPlan, nFormatter } from "@dub/utils"; import { AnimatePresence, motion } from "framer-motion"; diff --git a/apps/web/ui/links/archived-links-hint.tsx b/apps/web/ui/links/archived-links-hint.tsx index 10fe30de2a..6530150f13 100644 --- a/apps/web/ui/links/archived-links-hint.tsx +++ b/apps/web/ui/links/archived-links-hint.tsx @@ -1,7 +1,6 @@ import useLinksCount from "@/lib/swr/use-links-count"; -import { Button } from "@dub/ui"; +import { Button, Tooltip } from "@dub/ui"; import { BoxArchive } from "@dub/ui/src/icons"; -import { Tooltip } from "@dub/ui/src/tooltip"; import { pluralize } from "@dub/utils"; import { useSearchParams } from "next/navigation"; import { useContext } from "react"; diff --git a/apps/web/ui/links/links-container.tsx b/apps/web/ui/links/links-container.tsx index 29bc5b37d8..8189c5c065 100644 --- a/apps/web/ui/links/links-container.tsx +++ b/apps/web/ui/links/links-container.tsx @@ -3,8 +3,12 @@ import useLinks from "@/lib/swr/use-links"; import useLinksCount from "@/lib/swr/use-links-count"; import { ExpandedLinkProps, UserProps } from "@/lib/types"; -import { PaginationControls } from "@dub/blocks/src/pagination-controls"; -import { CardList, MaxWidthWrapper, usePagination } from "@dub/ui"; +import { + CardList, + MaxWidthWrapper, + PaginationControls, + usePagination, +} from "@dub/ui"; import { CursorRays, Hyperlink, LoadingSpinner } from "@dub/ui/src/icons"; import { cn } from "@dub/utils"; import { useSearchParams } from "next/navigation"; diff --git a/apps/web/ui/modals/add-edit-token-modal.tsx b/apps/web/ui/modals/add-edit-token-modal.tsx index 005d45dce1..03b44cdc35 100644 --- a/apps/web/ui/modals/add-edit-token-modal.tsx +++ b/apps/web/ui/modals/add-edit-token-modal.tsx @@ -16,9 +16,9 @@ import { Modal, RadioGroup, RadioGroupItem, + SimpleTooltipContent, + ToggleGroup, } from "@dub/ui"; -import { ToggleGroup } from "@dub/ui/src/toggle-group"; -import { SimpleTooltipContent } from "@dub/ui/src/tooltip"; import { cn } from "@dub/utils"; import { Dispatch, diff --git a/apps/web/ui/modals/add-edit-utm-template.modal.tsx b/apps/web/ui/modals/add-edit-utm-template.modal.tsx index 28a20d12f1..8c043d5313 100644 --- a/apps/web/ui/modals/add-edit-utm-template.modal.tsx +++ b/apps/web/ui/modals/add-edit-utm-template.modal.tsx @@ -1,7 +1,6 @@ import useWorkspace from "@/lib/swr/use-workspace"; import { UtmTemplateProps } from "@/lib/types"; -import { Button, Modal, useMediaQuery } from "@dub/ui"; -import { UTMBuilder } from "@dub/ui/src/utm-builder"; +import { Button, Modal, useMediaQuery, UTMBuilder } from "@dub/ui"; import posthog from "posthog-js"; import { Dispatch, diff --git a/apps/web/ui/modals/import-csv-modal/field-mapping.tsx b/apps/web/ui/modals/import-csv-modal/field-mapping.tsx index 6f0bf43b30..456d06f4dd 100644 --- a/apps/web/ui/modals/import-csv-modal/field-mapping.tsx +++ b/apps/web/ui/modals/import-csv-modal/field-mapping.tsx @@ -1,7 +1,7 @@ "use client"; import { generateCsvMapping } from "@/lib/ai/generate-csv-mapping"; -import { Button, IconMenu, InfoTooltip, Popover } from "@dub/ui"; +import { Button, IconMenu, InfoTooltip, Popover, Tooltip } from "@dub/ui"; import { ArrowRight, Check, @@ -9,7 +9,6 @@ import { TableIcon, Xmark, } from "@dub/ui/src/icons"; -import { Tooltip } from "@dub/ui/src/tooltip"; import { cn, formatDate, diff --git a/apps/web/ui/modals/link-builder/targeting-modal.tsx b/apps/web/ui/modals/link-builder/targeting-modal.tsx index f41d2d98d1..701d786a0a 100644 --- a/apps/web/ui/modals/link-builder/targeting-modal.tsx +++ b/apps/web/ui/modals/link-builder/targeting-modal.tsx @@ -6,9 +6,9 @@ import { SimpleTooltipContent, Tooltip, useKeyboardShortcut, + UTM_PARAMETERS, } from "@dub/ui"; import { Crosshairs3, Trash } from "@dub/ui/src/icons"; -import { UTM_PARAMETERS } from "@dub/ui/src/utm-builder"; import { cn, constructURLFromUTMParams, diff --git a/apps/web/ui/partners/earnings-chart.tsx b/apps/web/ui/partners/earnings-chart.tsx new file mode 100644 index 0000000000..c7d28d8eb9 --- /dev/null +++ b/apps/web/ui/partners/earnings-chart.tsx @@ -0,0 +1,148 @@ +"use client"; + +import { IntervalOptions } from "@/lib/analytics/types"; +import Areas from "@/ui/charts/areas"; +import { ChartContext } from "@/ui/charts/chart-context"; +import TimeSeriesChart from "@/ui/charts/time-series-chart"; +import XAxis from "@/ui/charts/x-axis"; +import YAxis from "@/ui/charts/y-axis"; +import SimpleDateRangePicker from "@/ui/shared/simple-date-range-picker"; +import { LoadingSpinner } from "@dub/ui/src/icons"; +import { cn, currencyFormatter, formatDate } from "@dub/utils"; +import { LinearGradient } from "@visx/gradient"; +import { createContext, useId, useMemo } from "react"; + +export const ProgramOverviewContext = createContext<{ + start?: Date; + end?: Date; + interval?: IntervalOptions; + color?: string; +}>({}); + +interface EarningsChartProps { + timeseries: any; + total: any; + color: any; + error: any; +} + +export function EarningsChart({ + timeseries, + total, + color, + error, +}: EarningsChartProps) { + const id = useId(); + + const data = useMemo( + () => + timeseries?.map(({ start, earnings }) => ({ + date: new Date(start), + values: { earnings: earnings / 100 }, + })), + [timeseries], + ); + + return ( +
+
+
+ Earnings +
+ {total !== undefined ? ( + + {currencyFormatter(total / 100, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + + ) : ( +
+ )} +
+
+
+ +
+
+
+ {data ? ( + d.values.earnings, + colorClassName: color ? `text-[${color}]` : "text-violet-500", + isActive: true, + }, + ]} + tooltipClassName="p-0" + tooltipContent={(d) => { + return ( + <> +

+ {formatDate(d.date)} +

+
+
+
+

Earnings

+
+

+ {currencyFormatter(d.values.earnings, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} +

+
+ + ); + }} + > + + {(context) => ( + + )} + + + + + + + ) : ( +
+ {error ? ( + + Failed to load earnings data. + + ) : ( + + )} +
+ )} +
+
+ ); +} diff --git a/apps/web/ui/partners/embed-docs-sheet.tsx b/apps/web/ui/partners/embed-docs-sheet.tsx new file mode 100644 index 0000000000..1a643649dc --- /dev/null +++ b/apps/web/ui/partners/embed-docs-sheet.tsx @@ -0,0 +1,160 @@ +import { X } from "@/ui/shared/icons"; +import { Button, Sheet, TabSelect, useRouterStuff } from "@dub/ui"; +import { Dispatch, SetStateAction, useEffect, useState } from "react"; +import { codeToHtml } from "shiki"; + +interface EmbedDocsSheetProps { + setIsOpen: Dispatch>; +} + +type Tab = "react" | "html"; + +function EmbedDocsSheetContent({ setIsOpen }: EmbedDocsSheetProps) { + const [tab, setTab] = useState("react"); + + return ( + <> +
+
+ + Embed docs + + +
+
+ { + setTab(id); + }} + /> + +
+ {tab === "react" && ( +
+ +
+ )} + + {tab === "html" && ( +
+ +
+ )} +
+ +

+ View detailed{" "} + + installation guides + {" "} + to add Dub Embed to your website. +

+
+
+
+
+
+
+ + ); +} + +const reactSnippet = `import { DubWidget } from "@dub/embed-react"; + +const App = () => { + const [token, setToken] = useState(""); + + const createToken = async () => { + // create a token for the token + setToken("PUBLIC_LINK_TOKEN"); + }; + + useEffect(() => { + createToken(); + }, []); + + return `; + +const htmlSnippet = ` + + +`; + +function CodeSnippet({ code, lang }: { code: string; lang: string }) { + const [highlightedCode, setHighlightedCode] = useState(""); + + useEffect(() => { + const highlight = async () => { + const html = await codeToHtml(code, { + lang, + theme: "min-light", + }); + + setHighlightedCode(html); + }; + + highlight(); + }, [code, lang]); + + return ( +
+ ); +} + +export function EmbedDocsSheet({ + isOpen, + ...rest +}: EmbedDocsSheetProps & { + isOpen: boolean; +}) { + const { queryParams } = useRouterStuff(); + return ( + queryParams({ del: "partnerId" })} + > + + + ); +} diff --git a/apps/web/app/partners.dub.co/(dashboard)/[partnerId]/[programId]/hero-background.tsx b/apps/web/ui/partners/hero-background.tsx similarity index 100% rename from apps/web/app/partners.dub.co/(dashboard)/[partnerId]/[programId]/hero-background.tsx rename to apps/web/ui/partners/hero-background.tsx diff --git a/apps/web/ui/partners/program-card.tsx b/apps/web/ui/partners/program-card.tsx index db51d7c27e..9ee1e14a05 100644 --- a/apps/web/ui/partners/program-card.tsx +++ b/apps/web/ui/partners/program-card.tsx @@ -1,7 +1,6 @@ import usePartnerAnalytics from "@/lib/swr/use-partner-analytics"; import { ProgramEnrollmentProps, ProgramProps } from "@/lib/types"; -import { MiniAreaChart } from "@dub/blocks"; -import { BlurImage, StatusBadge } from "@dub/ui"; +import { BlurImage, MiniAreaChart, StatusBadge } from "@dub/ui"; import { cn, currencyFormatter, diff --git a/apps/web/ui/partners/stat-card.tsx b/apps/web/ui/partners/stat-card.tsx new file mode 100644 index 0000000000..295791fe99 --- /dev/null +++ b/apps/web/ui/partners/stat-card.tsx @@ -0,0 +1,90 @@ +import { MiniAreaChart } from "@dub/ui"; +import { LoadingSpinner } from "@dub/ui/src/icons"; +import { currencyFormatter, nFormatter } from "@dub/utils"; +import Link from "next/link"; + +interface StatCardProps { + title: string; + event: "clicks" | "leads" | "sales"; + timeseries?: any; + error?: any; + color?: string; + href?: string; + total?: { + clicks: number; + leads: number; + sales: number; + saleAmount: number; + }; +} + +export function StatCard({ + title, + event, + total, + timeseries, + error, + color, + href, +}: StatCardProps) { + return ( + + {title} + {total !== undefined ? ( +
+ {nFormatter(total[event])} + {event === "sales" && ( + + ({currencyFormatter(total.saleAmount / 100)}) + + )} +
+ ) : ( +
+ )} +
+ {timeseries ? ( + ({ + date: new Date(d.start), + value: d[event], + }))} + curve={false} + color={color} + /> + ) : ( +
+ {error ? ( + + Failed to load data. + + ) : ( + + )} +
+ )} +
+ + ); +} + +const Wrapper = ({ + href, + children, + className, +}: { + href?: string; + children: React.ReactNode; + className?: string; +}) => { + return href ? ( + + {children} + + ) : ( +
{children}
+ ); +}; diff --git a/apps/web/ui/shared/empty-state.tsx b/apps/web/ui/shared/empty-state.tsx index bdb2e54a0d..e5f11a33ff 100644 --- a/apps/web/ui/shared/empty-state.tsx +++ b/apps/web/ui/shared/empty-state.tsx @@ -1,7 +1,6 @@ "use client"; -import { EmptyState as EmptyStateBlock } from "@dub/blocks"; -import { buttonVariants } from "@dub/ui"; +import { buttonVariants, EmptyState as EmptyStateBlock } from "@dub/ui"; import { cn } from "@dub/utils"; import Link from "next/link"; import { ComponentProps } from "react"; diff --git a/apps/web/ui/webhooks/webhook-events.tsx b/apps/web/ui/webhooks/webhook-events.tsx index 914a9ca215..eee7cf82eb 100644 --- a/apps/web/ui/webhooks/webhook-events.tsx +++ b/apps/web/ui/webhooks/webhook-events.tsx @@ -1,9 +1,15 @@ "use client"; import { WebhookEventProps } from "@/lib/types"; -import { Button, Sheet, useCopyToClipboard, useMediaQuery } from "@dub/ui"; +import { + Button, + ButtonTooltip, + Sheet, + Tooltip, + useCopyToClipboard, + useMediaQuery, +} from "@dub/ui"; import { CircleCheck, CircleHalfDottedClock, Copy } from "@dub/ui/src/icons"; -import { ButtonTooltip, Tooltip } from "@dub/ui/src/tooltip"; import { PropsWithChildren, useEffect, useState } from "react"; import { Highlighter } from "shiki"; import { toast } from "sonner"; diff --git a/apps/web/ui/workspaces/create-workspace-button.tsx b/apps/web/ui/workspaces/create-workspace-button.tsx index 2a2d9a2273..989698c931 100644 --- a/apps/web/ui/workspaces/create-workspace-button.tsx +++ b/apps/web/ui/workspaces/create-workspace-button.tsx @@ -2,8 +2,7 @@ import useWorkspaces from "@/lib/swr/use-workspaces"; import { ModalContext } from "@/ui/modals/modal-provider"; -import { Button } from "@dub/ui"; -import { TooltipContent } from "@dub/ui/src/tooltip"; +import { Button, TooltipContent } from "@dub/ui"; import { FREE_WORKSPACES_LIMIT } from "@dub/utils"; import { useContext } from "react"; diff --git a/apps/web/vercel.json b/apps/web/vercel.json index ba487b5a45..8f9ffe21e6 100644 --- a/apps/web/vercel.json +++ b/apps/web/vercel.json @@ -15,6 +15,10 @@ { "path": "/api/cron/disposable-emails", "schedule": "0 12 * * 1" + }, + { + "path": "/api/cron/cleanup-expired-public-tokens", + "schedule": "0 12 * * *" } ], "functions": { diff --git a/packages/blocks/README.md b/packages/blocks/README.md deleted file mode 100644 index a22876d7b9..0000000000 --- a/packages/blocks/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# `@dub/blocks` - -`@dub/blocks` is a library of React components built by Dub. - -## Installation - -To install the package, run: - -```bash -pnpm i @dub/blocks -``` diff --git a/packages/blocks/src/event-list.tsx b/packages/blocks/src/event-list.tsx deleted file mode 100644 index 0cae1ca3bb..0000000000 --- a/packages/blocks/src/event-list.tsx +++ /dev/null @@ -1,73 +0,0 @@ -"use client"; - -import { usePagination } from "@dub/ui"; -import { PropsWithChildren, ReactNode } from "react"; -import { EmptyState, EmptyStateProps } from "./empty-state"; -import { PaginationControls } from "./pagination-controls"; - -export type EventListProps = PropsWithChildren<{ - events: { icon: ReactNode; content: ReactNode; right?: ReactNode }[]; - totalEvents: number; - emptyState: EmptyStateProps; -}>; - -export function EventList({ events, totalEvents, emptyState }: EventListProps) { - const { pagination, setPagination } = usePagination(); - - return ( -
- {events.length === 0 && totalEvents === 0 ? ( -
- -
- ) : ( - <> -
- {events.map((event, index) => ( -
-
-
{event.icon}
-
{event.content}
-
- {event.right !== undefined && ( -
{event.right}
- )} -
- ))} -
-
- `event${p ? "s" : ""}`} - /> -
- - )} -
- ); -} - -export function EventListSkeleton() { - return ( -
-
- {[...Array(5)].map((_, index) => ( -
-
-
-
-
-
- ))} -
-
- ); -} diff --git a/packages/blocks/src/gauge.tsx b/packages/blocks/src/gauge.tsx deleted file mode 100644 index f024b86c13..0000000000 --- a/packages/blocks/src/gauge.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { PropsWithChildren } from "react"; - -export type GaugeProps = PropsWithChildren<{ - value: number; - min?: number; - max: number; -}>; - -export function Gauge({ value, min = 0, max, children }: GaugeProps) { - const fraction = (value - min) / (max - min); - const gradientStop = fraction * 50; - - return ( -
-
-
-
- -
- -
-
-
{children}
-
-
- ); -} diff --git a/packages/blocks/src/index.ts b/packages/blocks/src/index.ts deleted file mode 100644 index 3a63f7417a..0000000000 --- a/packages/blocks/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -// styles -import "./styles.css"; - -export * from "./empty-state"; -export * from "./event-list"; -export * from "./gauge"; -export * from "./mini-area-chart"; -export * from "./pagination-controls"; -export * from "./stats-card"; diff --git a/packages/blocks/src/stats-card.tsx b/packages/blocks/src/stats-card.tsx deleted file mode 100644 index 517dfe21b7..0000000000 --- a/packages/blocks/src/stats-card.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { cn } from "@dub/utils"; -import { PropsWithChildren, ReactNode } from "react"; - -const wrapperClassName = - "flex justify-between gap-4 rounded-xl border border-gray-200 bg-white px-5 py-4 text-left overflow-hidden"; - -export function StatsCard({ - label, - demo, - graphic, - children, -}: PropsWithChildren<{ - label: string; - demo?: boolean; - graphic?: ReactNode; -}>) { - return ( -
- {demo && ( - - DEMO DATA - - )} -
- - {label} - - {children} -
- {graphic && ( -
- {graphic} -
- )} -
- ); -} - -export function StatsCardSkeleton({ error }: { error?: boolean }) { - return ( -
- {error ? ( -
- Failed to load data -
- ) : ( -
- - -
- )} -
- ); -} diff --git a/packages/blocks/src/styles.css b/packages/blocks/src/styles.css deleted file mode 100644 index b5c61c9567..0000000000 --- a/packages/blocks/src/styles.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/packages/embeds/core/README.md b/packages/embeds/core/README.md new file mode 100644 index 0000000000..a7176d8978 --- /dev/null +++ b/packages/embeds/core/README.md @@ -0,0 +1,11 @@ +# `@dub/embed-core` + +`@dub/embed-core` is a library that contains the core logic for embedding Dub's widget and dashboard on third-party websites. + +## Installation + +To install the package, run: + +```bash +pnpm i @dub/embed-core +``` diff --git a/packages/embeds/core/package.json b/packages/embeds/core/package.json new file mode 100644 index 0000000000..211558b674 --- /dev/null +++ b/packages/embeds/core/package.json @@ -0,0 +1,42 @@ +{ + "name": "@dub/embed-core", + "description": "Vanilla JS core script that embeds Dub dashboards & widgets.", + "version": "0.0.1", + "sideEffects": false, + "main": "./dist/index.js", + "files": [ + "dist/**" + ], + "scripts": { + "build": "tsup", + "lint": "eslint src/", + "dev": "tsup --watch", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@floating-ui/dom": "^1.6.12" + }, + "devDependencies": { + "@types/js-cookie": "^3.0.6", + "tsconfig": "workspace:*", + "tsup": "^6.1.3", + "typescript": "^5.1.6" + }, + "author": "Steven Tey ", + "homepage": "https://dub.co", + "repository": { + "type": "git", + "url": "git+https://github.com/steven-tey/dub.git" + }, + "bugs": { + "url": "https://github.com/steven-tey/dub/issues" + }, + "keywords": [ + "dub", + "dub.co", + "ui" + ], + "publishConfig": { + "access": "public" + } +} diff --git a/packages/embeds/core/src/constants.ts b/packages/embeds/core/src/constants.ts new file mode 100644 index 0000000000..d9e0c112df --- /dev/null +++ b/packages/embeds/core/src/constants.ts @@ -0,0 +1,27 @@ +export const WIDGET_URL = "https://preview.dub.co/embed/widget"; // TODO: update to app.dub.co before launch + +export const DUB_CONTAINER_ID = "dub-embed-container"; +export const DUB_POPUP_ID = "dub-embed-popup"; +export const DUB_CLOSE_BUTTON_ID = "dub-embed-close"; +export const DUB_FLOATING_BUTTON_ID = "dub-floating-button"; + +export const GIFT_ICON = + `` + + `` + + `` + + `` + + `` + + `` + + ``; + +export const CLOSE_ICON = + `` + + `` + + `` + + `` + + `` + + ``; diff --git a/packages/embeds/core/src/core.ts b/packages/embeds/core/src/core.ts new file mode 100644 index 0000000000..19803fd848 --- /dev/null +++ b/packages/embeds/core/src/core.ts @@ -0,0 +1,302 @@ +import { + CLOSE_ICON, + DUB_CLOSE_BUTTON_ID, + DUB_CONTAINER_ID, + DUB_FLOATING_BUTTON_ID, + DUB_POPUP_ID, + WIDGET_URL, +} from "./constants"; +import { EmbedError } from "./error"; +import { createFloatingButton } from "./floating-button"; +import { DubInitResult, DubOptions, IframeMessage } from "./types"; + +const CONTAINER_STYLES: Partial = { + position: "fixed", + display: "flex", + alignItems: "center", + justifyContent: "center", + inset: "0", + padding: "16px", + zIndex: "9998", + backgroundColor: "rgba(115, 115, 115, 0.3)", +}; + +const POPUP_STYLES: Partial = { + width: "100%", + height: "100%", + maxWidth: "400px", + maxHeight: "500px", + backgroundColor: "white", + borderRadius: "12px", + boxShadow: "0px 8px 30px rgba(0, 0, 0, 0.12), 0px 2px 4px rgba(0, 0, 0, 0.1)", + overflow: "hidden", +}; + +const CLOSE_BUTTON_STYLES = { + position: "absolute", + top: "20px", + right: "20px", + padding: "4px", + color: "white", + backgroundColor: "transparent", + border: "none", + cursor: "pointer", +}; + +class DubWidget { + options: DubOptions; + prefix: string; + container: HTMLElement | null; + + constructor(options: DubOptions) { + options.trigger = options.trigger ?? "floating-button"; + options.buttonPlacement = options.buttonPlacement ?? "bottom-right"; + + this.options = options; + this.prefix = options.id ? `${options.id}-` : ""; + + console.debug("[Dub] Initializing.", options); + + const prefix = options.id ? `${options.id}-` : ""; + + this.container = this.renderWidget(); + + if (options.trigger === "floating-button") { + createFloatingButton({ + prefix, + buttonStyles: options.buttonStyles, + buttonPlacement: options.buttonPlacement, + onClick: () => this.toggleWidget(), + }); + } + } + + /** + * Generates and renders all of the widget's DOM elements. + */ + renderWidget() { + console.debug("[Dub] Rendering widget."); + + const { + token, + containerStyles, + popupStyles, + onClose, + onError, + onTokenExpired, + } = this.options; + + const existingContainer = document.getElementById( + `${this.prefix}${DUB_CONTAINER_ID}`, + ); + + if (existingContainer) { + document.body.removeChild(existingContainer); + onClose?.(); + return existingContainer; + } + + if (!token) { + console.error("[Dub] A link token is required to embed the widget."); + return null; + } + + const container = document.createElement("div"); + container.id = `${this.prefix}${DUB_CONTAINER_ID}`; + Object.assign(container.style, { + ...CONTAINER_STYLES, + ...containerStyles, + visibility: "hidden", + }); + + container.addEventListener("click", (e) => { + if (e.target === container) this.closeWidget(); + }); + + const popup: HTMLElement = + container.querySelector( + "#" + CSS.escape(`${this.prefix}${DUB_POPUP_ID}`), + ) ?? document.createElement("div"); + popup.id = `${this.prefix}${DUB_POPUP_ID}`; + Object.assign(popup.style, { + ...POPUP_STYLES, + ...popupStyles, + }); + + const iframe = createIframe(WIDGET_URL, token); + + // Close button + const closeButton = document.createElement("button"); + closeButton.id = `${this.prefix}${DUB_CLOSE_BUTTON_ID}`; + closeButton.innerHTML = CLOSE_ICON; + Object.assign(closeButton.style, CLOSE_BUTTON_STYLES); + closeButton.addEventListener("click", () => this.closeWidget()); + + popup.appendChild(iframe); + popup.appendChild(closeButton); + container.appendChild(popup); + + // Listen the message from the iframe + window.addEventListener("message", (e) => { + const { data, event } = e.data as IframeMessage; + + console.debug("[Dub] Iframe message", data); + + if (event === "ERROR") { + onError?.( + new EmbedError({ + code: data?.code ?? "", + message: data?.message ?? "", + }), + ); + } + + if (data?.code === "unauthorized") { + onTokenExpired?.(); + } + }); + + document.body.appendChild(container); + + return container; + } + + /** + * Checks if the widget is open. + */ + isWidgetOpen() { + const container = document.getElementById( + `${this.prefix}${DUB_CONTAINER_ID}`, + ); + return container?.style.visibility !== "hidden"; + } + + /** + * Opens the widget. + */ + openWidget() { + const popup = document.getElementById(`${this.prefix}${DUB_POPUP_ID}`); + const container = document.getElementById( + `${this.prefix}${DUB_CONTAINER_ID}`, + ); + if (!popup) { + console.error("[Dub] No popup found."); + return; + } + + if (container) { + container.style.visibility = "visible"; + container.animate( + [ + { + backgroundColor: "rgba(115, 115, 115, 0)", + }, + { + backgroundColor: "rgba(115, 115, 115, 0.3)", + }, + ], + { + duration: 250, + easing: "ease-out", + fill: "forwards", + }, + ); + } + + popup.getAnimations().forEach((a) => a.cancel()); + popup.animate( + [ + { transform: "translateY(10px)", opacity: 0 }, + { transform: "translateY(0)", opacity: 1 }, + ], + { + duration: 250, + easing: "ease-in-out", + fill: "forwards", + }, + ); + } + + /** + * Closes the widget. + */ + closeWidget() { + const popup = document.getElementById(`${this.prefix}${DUB_POPUP_ID}`); + const container = document.getElementById( + `${this.prefix}${DUB_CONTAINER_ID}`, + ); + if (!popup) return; + + popup.getAnimations().forEach((a) => a.cancel()); + popup.animate([{ transform: "translateY(10px)", opacity: 0 }], { + duration: 100, + easing: "ease-in-out", + fill: "forwards", + }); + + if (container) { + container.animate( + [ + { + backgroundColor: "rgba(115, 115, 115, 0.3)", + }, + { + backgroundColor: "rgba(115, 115, 115, 0)", + }, + ], + { + duration: 250, + easing: "ease-in", + fill: "forwards", + }, + ).onfinish = () => { + container.style.visibility = "hidden"; + }; + } + } + + /** + * Toggles the widget open state. + */ + toggleWidget() { + this.isWidgetOpen() ? this.closeWidget() : this.openWidget(); + } + + /** + * Destroys the widget, removing any remaining DOM elements. + */ + destroy() { + document.getElementById(`${this.prefix}${DUB_CONTAINER_ID}`)?.remove(); + document + .getElementById(`${this.prefix}${DUB_FLOATING_BUTTON_ID}`) + ?.remove(); + } +} + +const createIframe = (iframeUrl: string, token: string): HTMLIFrameElement => { + const iframe = document.createElement("iframe"); + + iframe.src = `${iframeUrl}?token=${token}`; + iframe.style.width = "100%"; + iframe.style.height = "100%"; + iframe.style.border = "none"; + iframe.setAttribute("credentialssupport", ""); + iframe.setAttribute("allow", "clipboard-write"); + + return iframe; +}; + +/** + * Initializes the Dub embed widget. + */ +export const init = (options: DubOptions): DubInitResult => { + const widget = new DubWidget(options); + + return { + openWidget: widget.openWidget.bind(widget), + closeWidget: widget.closeWidget.bind(widget), + toggleWidget: widget.toggleWidget.bind(widget), + isWidgetOpen: widget.isWidgetOpen.bind(widget), + destroy: widget.destroy.bind(widget), + }; +}; diff --git a/packages/embeds/core/src/embed.ts b/packages/embeds/core/src/embed.ts new file mode 100644 index 0000000000..9f3b32212d --- /dev/null +++ b/packages/embeds/core/src/embed.ts @@ -0,0 +1,13 @@ +import { init } from "./core"; +import { DubEmbed } from "./types"; + +declare global { + interface Window { + Dub: DubEmbed; + } +} + +if (typeof window !== "undefined") { + window.Dub = (window.Dub || {}) as DubEmbed; + window.Dub.init = init; +} diff --git a/packages/embeds/core/src/error.ts b/packages/embeds/core/src/error.ts new file mode 100644 index 0000000000..933bd4af8f --- /dev/null +++ b/packages/embeds/core/src/error.ts @@ -0,0 +1,9 @@ +export class EmbedError extends Error { + code: string; + + constructor({ code, message }: { code: string; message: string }) { + super(message); + this.code = code; + this.name = "EmbedError"; + } +} diff --git a/packages/embeds/core/src/example/widget.html b/packages/embeds/core/src/example/widget.html new file mode 100644 index 0000000000..28c5ddfc8b --- /dev/null +++ b/packages/embeds/core/src/example/widget.html @@ -0,0 +1,20 @@ + + + + + +

Dub Referral Widget

+ + + + + + \ No newline at end of file diff --git a/packages/embeds/core/src/floating-button.ts b/packages/embeds/core/src/floating-button.ts new file mode 100644 index 0000000000..a0378d5934 --- /dev/null +++ b/packages/embeds/core/src/floating-button.ts @@ -0,0 +1,78 @@ +import { DUB_FLOATING_BUTTON_ID, GIFT_ICON } from "./constants"; +import { DubFloatingButtonPlacement } from "./types"; + +const FLOATING_BUTTON_STYLES = ( + buttonPlacement: DubFloatingButtonPlacement, +): Partial => ({ + margin: "16px", + backgroundColor: "#171717", + color: "#fafafa", + padding: "12px", + borderRadius: "9999px", + border: "none", + transition: "transform 0.1s ease-in-out", + position: "fixed", + ...{ + "top-left": { + top: "0", + left: "0", + }, + "top-right": { + top: "0", + right: "0", + }, + "bottom-left": { + bottom: "0", + left: "0", + }, + "bottom-right": { + bottom: "0", + right: "0", + }, + }[buttonPlacement], + zIndex: "9997", +}); + +export const createFloatingButton = ({ + prefix, + buttonStyles, + buttonPlacement, + onClick, +}: { + prefix?: string; + buttonStyles?: Record; + buttonPlacement: DubFloatingButtonPlacement; + onClick: () => void; +}): void => { + const button = document.createElement("button"); + button.id = `${prefix}${DUB_FLOATING_BUTTON_ID}`; + Object.assign(button.style, { + ...FLOATING_BUTTON_STYLES(buttonPlacement), + ...buttonStyles, + }); + + button.innerHTML = GIFT_ICON; + + button.addEventListener("click", () => onClick()); + + // TODO: Figure out if we can use Tailwind classes for these states, + // or at least make them easily overrideable + button.addEventListener( + "mouseenter", + () => (button.style.transform = "scale(1.1)"), + ); + button.addEventListener( + "mouseleave", + () => (button.style.transform = "scale(1)"), + ); + button.addEventListener( + "pointerdown", + () => (button.style.transform = "scale(0.95)"), + ); + button.addEventListener( + "pointerup", + () => (button.style.transform = "scale(1.1)"), + ); + + document.body.appendChild(button); +}; diff --git a/packages/embeds/core/src/index.ts b/packages/embeds/core/src/index.ts new file mode 100644 index 0000000000..fe469cfcc0 --- /dev/null +++ b/packages/embeds/core/src/index.ts @@ -0,0 +1,3 @@ +export * from "./constants"; +export * from "./core"; +export * from "./types"; diff --git a/packages/embeds/core/src/types.ts b/packages/embeds/core/src/types.ts new file mode 100644 index 0000000000..a47f607b54 --- /dev/null +++ b/packages/embeds/core/src/types.ts @@ -0,0 +1,59 @@ +export type DubInitResult = { + openWidget: () => void; + closeWidget: () => void; + toggleWidget: () => void; + isWidgetOpen: () => boolean; + destroy: () => void; +} | null; + +export interface DubEmbed { + init: (options: DubOptions) => void; +} + +export type DubOptions = { + // The link token + token: string; + + // The trigger for the widget + trigger?: DubWidgetTrigger; + + // The ID of the widget (for multiple widgets on the same page) + id?: string; + + // The widget was opened + onOpen?: () => void; + + // The widget was closed + onClose?: () => void; + + // An error occurred in the APIs + onError?: (error: Error) => void; + + // The token expired + onTokenExpired?: () => void; + + // The placement of the floating button + buttonPlacement?: DubFloatingButtonPlacement; + + // The styles for the widget container + containerStyles?: Partial; + popupStyles?: Partial; + buttonStyles?: Partial; +}; + +export type DubWidgetTrigger = "floating-button" | "manual"; + +export type DubFloatingButtonPlacement = + | "bottom-right" + | "bottom-left" + | "top-right" + | "top-left"; + +export interface IframeMessage { + originator?: "Dub"; + event?: "ERROR"; + data?: { + code: string; + message: string; + }; +} diff --git a/packages/embeds/core/tsconfig.json b/packages/embeds/core/tsconfig.json new file mode 100644 index 0000000000..8c5aa8f1d1 --- /dev/null +++ b/packages/embeds/core/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "tsconfig/react-library.json", + "include": [ + "." + ], + "exclude": [ + "dist", + "build", + "node_modules" + ], + "compilerOptions": { + "strict": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitThis": true, + "strictNullChecks": true, + "esModuleInterop": true + } +} \ No newline at end of file diff --git a/packages/blocks/tsup.config.ts b/packages/embeds/core/tsup.config.ts similarity index 55% rename from packages/blocks/tsup.config.ts rename to packages/embeds/core/tsup.config.ts index 78a41d1e80..6bd87babde 100644 --- a/packages/blocks/tsup.config.ts +++ b/packages/embeds/core/tsup.config.ts @@ -1,8 +1,12 @@ import { defineConfig, Options } from "tsup"; export default defineConfig((options: Options) => ({ - entry: ["src/**/*.tsx", "src/**/*.ts"], - format: ["esm"], + clean: true, + entry: { + "embed/script": "src/embed.ts", // Standalone entry for embed.ts + index: "src/index.ts", // Entry for all other files via index.ts + }, + format: ["cjs"], esbuildOptions(options) { options.banner = { js: '"use client"', @@ -10,6 +14,5 @@ export default defineConfig((options: Options) => ({ }, dts: true, minify: true, - external: ["react"], ...options, })); diff --git a/packages/embeds/react/README.md b/packages/embeds/react/README.md new file mode 100644 index 0000000000..05a51af07e --- /dev/null +++ b/packages/embeds/react/README.md @@ -0,0 +1,11 @@ +# `@dub/embed-react` + +`@dub/embed-react` is a library of React components that are used embed Dub's widget on third-party websites. + +## Installation + +To install the package, run: + +```bash +pnpm i @dub/embed-react +``` diff --git a/packages/blocks/package.json b/packages/embeds/react/package.json similarity index 58% rename from packages/blocks/package.json rename to packages/embeds/react/package.json index f366666dde..8e1e03b09c 100644 --- a/packages/blocks/package.json +++ b/packages/embeds/react/package.json @@ -1,6 +1,6 @@ { - "name": "@dub/blocks", - "description": "UI components built by Dub", + "name": "@dub/embed-react", + "description": "Embed React components for Dub.", "version": "0.0.1", "sideEffects": false, "main": "./dist/index.js", @@ -13,51 +13,41 @@ "build": "tsup", "lint": "eslint src/", "dev": "tsup --watch", - "check-types": "tsc --noEmit" + "check-types": "tsc --noEmit", + "preview": "vite --port=3101 --open" }, "peerDependencies": { - "next": "14.2.0-canary.47", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { - "@dub/tailwind-config": "workspace:*", "@types/react": "^18.2.47", "@types/react-dom": "^18.2.14", "autoprefixer": "^10.4.16", - "next": "14.2.0-canary.67", "postcss": "^8.4.31", "react": "^18.2.0", - "tailwindcss": "^3.4.4", "tsconfig": "workspace:*", "tsup": "^6.1.3", "typescript": "^5.1.6" }, "dependencies": { - "@dub/ui": "workspace:*", - "@dub/utils": "workspace:*", - "@visx/curve": "^3.3.0", - "@visx/gradient": "^3.3.0", - "@visx/group": "^3.3.0", - "@visx/responsive": "^2.10.0", - "@visx/scale": "^3.3.0", - "@visx/shape": "^2.12.2", "class-variance-authority": "^0.7.0", - "framer-motion": "^10.16.16" + "vite": "5.2.9", + "@dub/embed-core": "workspace:*" }, "author": "Steven Tey ", "homepage": "https://dub.co", "repository": { "type": "git", - "url": "git+https://github.com/dubinc/dub.git" + "url": "git+https://github.com/steven-tey/dub.git" }, "bugs": { - "url": "https://github.com/dubinc/dub/issues" + "url": "https://github.com/steven-tey/dub/issues" }, "keywords": [ "dub", "dub.co", - "blocks" + "ui" ], "publishConfig": { "access": "public" diff --git a/packages/blocks/postcss.config.js b/packages/embeds/react/postcss.config.js similarity index 100% rename from packages/blocks/postcss.config.js rename to packages/embeds/react/postcss.config.js diff --git a/packages/embeds/react/src/example/widget.tsx b/packages/embeds/react/src/example/widget.tsx new file mode 100644 index 0000000000..c4d0fc8f48 --- /dev/null +++ b/packages/embeds/react/src/example/widget.tsx @@ -0,0 +1,21 @@ +import { useCallback, useEffect, useState } from "react"; +import ReactDom from "react-dom"; +import { DubWidget } from "../widget"; + +const Widget = () => { + const [token, setToken] = useState(""); + + const createToken = useCallback(async () => { + const res = await fetch("/api/create-token"); + const data = await res.json(); + setToken(data.token); + }, []); + + useEffect(() => { + createToken(); + }, []); + + return ; +}; + +ReactDom.render(, document.getElementById("root")); diff --git a/packages/embeds/react/src/index.ts b/packages/embeds/react/src/index.ts new file mode 100644 index 0000000000..97866ce19b --- /dev/null +++ b/packages/embeds/react/src/index.ts @@ -0,0 +1 @@ +export * from "./widget"; diff --git a/packages/embeds/react/src/widget.tsx b/packages/embeds/react/src/widget.tsx new file mode 100644 index 0000000000..5c3751093b --- /dev/null +++ b/packages/embeds/react/src/widget.tsx @@ -0,0 +1,52 @@ +"use client"; + +import { DubOptions, init } from "@dub/embed-core"; +import { + Children, + cloneElement, + HTMLAttributes, + isValidElement, + memo, + PropsWithChildren, + useEffect, + useId, + useRef, +} from "react"; + +export const DubWidget = memo( + ({ children, ...options }: PropsWithChildren) => { + const id = useId(); + const toggleWidgetRef = useRef<() => void>(); + + useEffect(() => { + const { destroy, toggleWidget } = + init({ + id, + ...options, + }) || {}; + + toggleWidgetRef.current = toggleWidget; + + return () => destroy?.(); + }, [children, id, options]); + + return children ? ( + toggleWidgetRef.current?.()}> + {children} + + ) : null; + }, +); + +function Slot({ + children, + ...props +}: PropsWithChildren>) { + if (Children.count(children) > 1) + throw new Error("DubWidget may only have one child"); + + if (isValidElement(children)) + return cloneElement(children, { ...props, ...children.props }); + + return null; +} diff --git a/packages/blocks/tailwind.config.ts b/packages/embeds/react/tailwind.config.ts similarity index 100% rename from packages/blocks/tailwind.config.ts rename to packages/embeds/react/tailwind.config.ts diff --git a/packages/blocks/tsconfig.json b/packages/embeds/react/tsconfig.json similarity index 100% rename from packages/blocks/tsconfig.json rename to packages/embeds/react/tsconfig.json diff --git a/packages/embeds/react/tsup.config.ts b/packages/embeds/react/tsup.config.ts new file mode 100644 index 0000000000..f3d89e77b4 --- /dev/null +++ b/packages/embeds/react/tsup.config.ts @@ -0,0 +1,22 @@ +import { defineConfig, Options } from "tsup"; + +export default defineConfig((options: Options) => ({ + entry: { + index: "src/index.ts", // Entry for all other files via index.ts + }, + format: ["esm", "cjs"], + esbuildOptions(options) { + options.banner = { + js: '"use client"', + }; + }, + outExtension({ format }) { + return { + js: format === "esm" ? ".mjs" : ".js", + }; + }, + dts: true, + minify: true, + external: ["react"], + ...options, +})); diff --git a/packages/ui/package.json b/packages/ui/package.json index a5822071c7..4ce3f62252 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -67,7 +67,13 @@ "sonner": "^1.4.41", "swr": "^2.1.5", "use-debounce": "^8.0.4", - "vaul": "^0.9.6" + "vaul": "^0.9.6", + "@visx/curve": "^3.3.0", + "@visx/gradient": "^3.3.0", + "@visx/group": "^3.3.0", + "@visx/responsive": "^2.10.0", + "@visx/scale": "^3.3.0", + "@visx/shape": "^2.12.2" }, "author": "Steven Tey ", "homepage": "https://dub.co", diff --git a/packages/blocks/src/empty-state.tsx b/packages/ui/src/empty-state.tsx similarity index 100% rename from packages/blocks/src/empty-state.tsx rename to packages/ui/src/empty-state.tsx diff --git a/packages/ui/src/icons/nucleo/envelope-arrow-right.tsx b/packages/ui/src/icons/nucleo/envelope-arrow-right.tsx new file mode 100644 index 0000000000..375d818a72 --- /dev/null +++ b/packages/ui/src/icons/nucleo/envelope-arrow-right.tsx @@ -0,0 +1,51 @@ +import { SVGProps } from "react"; + +export function EnvelopeArrowRight(props: SVGProps) { + return ( + + + + + + + + + ); +} diff --git a/packages/ui/src/icons/nucleo/index.ts b/packages/ui/src/icons/nucleo/index.ts index c26258666f..b99a54dcbf 100644 --- a/packages/ui/src/icons/nucleo/index.ts +++ b/packages/ui/src/icons/nucleo/index.ts @@ -53,6 +53,7 @@ export * from "./dots"; export * from "./download"; export * from "./duplicate"; export * from "./earth-position"; +export * from "./envelope-arrow-right"; export * from "./eye"; export * from "./eye-slash"; export * from "./file-zip2"; diff --git a/packages/ui/src/index.tsx b/packages/ui/src/index.tsx index 08b40281be..7f7d83e0f2 100644 --- a/packages/ui/src/index.tsx +++ b/packages/ui/src/index.tsx @@ -12,6 +12,7 @@ export * from "./carousel"; export * from "./checkbox"; export * from "./combobox"; export * from "./date-picker"; +export * from "./empty-state"; export * from "./file-upload"; export * from "./filter"; export * from "./form"; @@ -19,7 +20,9 @@ export * from "./grid"; export * from "./input"; export * from "./input-select"; export * from "./label"; +export * from "./mini-area-chart"; export * from "./modal"; +export * from "./pagination-controls"; export * from "./popover"; export * from "./radio-group"; export * from "./sheet"; diff --git a/packages/blocks/src/mini-area-chart.tsx b/packages/ui/src/mini-area-chart.tsx similarity index 100% rename from packages/blocks/src/mini-area-chart.tsx rename to packages/ui/src/mini-area-chart.tsx diff --git a/packages/blocks/src/pagination-controls.tsx b/packages/ui/src/pagination-controls.tsx similarity index 97% rename from packages/blocks/src/pagination-controls.tsx rename to packages/ui/src/pagination-controls.tsx index 43f6c1f7ef..d5d2aa76ce 100644 --- a/packages/blocks/src/pagination-controls.tsx +++ b/packages/ui/src/pagination-controls.tsx @@ -1,5 +1,5 @@ -import { PaginationState } from "@dub/ui"; import { cn, nFormatter } from "@dub/utils"; +import { PaginationState } from "@tanstack/react-table"; import { PropsWithChildren } from "react"; const buttonClassName = cn( diff --git a/packages/utils/src/functions/fetcher.ts b/packages/utils/src/functions/fetcher.ts index 837b49dd90..af81e9f06a 100644 --- a/packages/utils/src/functions/fetcher.ts +++ b/packages/utils/src/functions/fetcher.ts @@ -1,4 +1,5 @@ interface SWRError extends Error { + info: any; status: number; } @@ -9,10 +10,14 @@ export async function fetcher( const res = await fetch(input, init); if (!res.ok) { - const error = await res.text(); - const err = new Error(error) as SWRError; - err.status = res.status; - throw err; + const error = new Error( + "An error occurred while fetching the data.", + ) as SWRError; + + error.info = (await res.json()).error; + error.status = res.status; + + throw error; } return res.json(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3de7bc6b51..a3b8800e24 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,9 +48,9 @@ importers: '@dub/analytics': specifier: ^0.0.21 version: 0.0.21 - '@dub/blocks': + '@dub/embed-react': specifier: workspace:* - version: link:../../packages/blocks + version: link:../../packages/embeds/react '@dub/tailwind-config': specifier: workspace:* version: link:../../packages/tailwind-config @@ -416,76 +416,6 @@ importers: specifier: 1.5.0 version: 1.5.0(@types/node@18.11.9) - packages/blocks: - dependencies: - '@dub/ui': - specifier: workspace:* - version: link:../ui - '@dub/utils': - specifier: workspace:* - version: link:../utils - '@visx/curve': - specifier: ^3.3.0 - version: 3.3.0 - '@visx/gradient': - specifier: ^3.3.0 - version: 3.3.0(react@18.2.0) - '@visx/group': - specifier: ^3.3.0 - version: 3.3.0(react@18.2.0) - '@visx/responsive': - specifier: ^2.10.0 - version: 2.10.0(react@18.2.0) - '@visx/scale': - specifier: ^3.3.0 - version: 3.3.0 - '@visx/shape': - specifier: ^2.12.2 - version: 2.12.2(react@18.2.0) - class-variance-authority: - specifier: ^0.7.0 - version: 0.7.0 - framer-motion: - specifier: ^10.16.16 - version: 10.18.0(react-dom@18.2.0)(react@18.2.0) - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@dub/tailwind-config': - specifier: workspace:* - version: link:../tailwind-config - '@types/react': - specifier: ^18.2.47 - version: 18.2.48 - '@types/react-dom': - specifier: ^18.2.14 - version: 18.2.14 - autoprefixer: - specifier: ^10.4.16 - version: 10.4.16(postcss@8.4.38) - next: - specifier: 14.2.0-canary.67 - version: 14.2.0-canary.67(react-dom@18.2.0)(react@18.2.0) - postcss: - specifier: ^8.4.31 - version: 8.4.38 - react: - specifier: ^18.2.0 - version: 18.2.0 - tailwindcss: - specifier: ^3.4.4 - version: 3.4.4 - tsconfig: - specifier: workspace:* - version: link:../tsconfig - tsup: - specifier: ^6.1.3 - version: 6.1.3(postcss@8.4.38)(typescript@5.5.3) - typescript: - specifier: ^5.1.6 - version: 5.5.3 - packages/cli: dependencies: '@badgateway/oauth2-client': @@ -559,6 +489,65 @@ importers: specifier: ^5.6.2 version: 5.6.2 + packages/embeds/core: + dependencies: + '@floating-ui/dom': + specifier: ^1.6.12 + version: 1.6.12 + devDependencies: + '@types/js-cookie': + specifier: ^3.0.6 + version: 3.0.6 + tsconfig: + specifier: workspace:* + version: link:../../tsconfig + tsup: + specifier: ^6.1.3 + version: 6.7.0(postcss@8.4.31)(typescript@5.6.2) + typescript: + specifier: ^5.1.6 + version: 5.6.2 + + packages/embeds/react: + dependencies: + '@dub/embed-core': + specifier: workspace:* + version: link:../core + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + vite: + specifier: 5.2.9 + version: 5.2.9(@types/node@18.11.9) + devDependencies: + '@types/react': + specifier: ^18.2.47 + version: 18.2.47 + '@types/react-dom': + specifier: ^18.2.14 + version: 18.2.14 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.31) + postcss: + specifier: ^8.4.31 + version: 8.4.31 + react: + specifier: ^18.2.0 + version: 18.2.0 + tsconfig: + specifier: workspace:* + version: link:../../tsconfig + tsup: + specifier: ^6.1.3 + version: 6.7.0(postcss@8.4.31)(typescript@5.6.2) + typescript: + specifier: ^5.1.6 + version: 5.6.2 + packages/stripe-app: dependencies: '@stripe/ui-extension-sdk': @@ -570,7 +559,7 @@ importers: devDependencies: '@stripe/ui-extension-tools': specifier: ^0.0.1 - version: 0.0.1(@babel/core@7.23.0) + version: 0.0.1(@babel/core@7.24.5) packages/tailwind-config: dependencies: @@ -643,6 +632,24 @@ importers: '@tanstack/react-table': specifier: ^8.17.3 version: 8.17.3(react-dom@18.2.0)(react@18.2.0) + '@visx/curve': + specifier: ^3.3.0 + version: 3.3.0 + '@visx/gradient': + specifier: ^3.3.0 + version: 3.3.0(react@18.2.0) + '@visx/group': + specifier: ^3.3.0 + version: 3.3.0(react@18.2.0) + '@visx/responsive': + specifier: ^2.10.0 + version: 2.10.0(react@18.2.0) + '@visx/scale': + specifier: ^3.3.0 + version: 3.3.0 + '@visx/shape': + specifier: ^2.12.2 + version: 2.12.2(react@18.2.0) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -1702,38 +1709,19 @@ packages: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + /@babel/code-frame@7.26.2: + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - dev: true + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.0.1 + dev: false /@babel/compat-data@7.25.2: resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 - '@babel/parser': 7.24.4 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.24.5: resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} @@ -1744,7 +1732,7 @@ packages: '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) '@babel/helpers': 7.25.0 - '@babel/parser': 7.24.5 + '@babel/parser': 7.25.3 '@babel/template': 7.25.0 '@babel/traverse': 7.25.3 '@babel/types': 7.25.2 @@ -1775,30 +1763,30 @@ packages: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + /@babel/generator@7.26.2: + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 dev: false - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + /@babel/helper-annotate-as-pure@7.25.9: + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.0 dev: false - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.22.20 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true + '@babel/types': 7.26.0 + dev: false /@babel/helper-compilation-targets@7.25.2: resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} @@ -1817,7 +1805,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-member-expression-to-functions': 7.23.0 @@ -1835,7 +1823,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 5.3.2 semver: 6.3.1 dev: false @@ -1847,7 +1835,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.6 @@ -1876,16 +1864,9 @@ packages: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.0 dev: false - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - /@babel/helper-module-imports@7.24.7: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} @@ -1895,19 +1876,15 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + dev: false /@babel/helper-module-transforms@7.25.2(@babel/core@7.24.5): resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} @@ -1927,13 +1904,18 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.0 dev: false /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} engines: {node: '>=6.9.0'} + /@babel/helper-plugin-utils@7.25.9: + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} engines: {node: '>=6.9.0'} @@ -1941,7 +1923,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 dev: false @@ -1958,13 +1940,6 @@ packages: '@babel/helper-optimise-call-expression': 7.22.5 dev: false - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - /@babel/helper-simple-access@7.24.7: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} @@ -1978,7 +1953,7 @@ packages: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.0 dev: false /@babel/helper-split-export-declaration@7.22.6: @@ -1995,6 +1970,11 @@ packages: resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser@7.25.9: + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} @@ -2003,10 +1983,10 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + /@babel/helper-validator-identifier@7.25.9: + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - dev: true + dev: false /@babel/helper-validator-option@7.24.8: resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} @@ -2017,21 +1997,10 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 dev: false - /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers@7.25.0: resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} @@ -2069,6 +2038,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.23.0 + dev: false /@babel/parser@7.25.3: resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} @@ -2077,6 +2047,14 @@ packages: dependencies: '@babel/types': 7.25.2 + /@babel/parser@7.26.2: + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.26.0 + dev: false + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.24.5): resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} engines: {node: '>=6.9.0'} @@ -2084,7 +2062,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.24.5): @@ -2094,7 +2072,7 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.24.5) dev: false @@ -2108,7 +2086,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) dev: false @@ -2122,7 +2100,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.24.5): @@ -2132,7 +2110,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.24.5) dev: false @@ -2144,7 +2122,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) dev: false @@ -2156,7 +2134,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) dev: false @@ -2170,7 +2148,7 @@ packages: '@babel/compat-data': 7.25.2 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.5) dev: false @@ -2183,7 +2161,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) dev: false @@ -2195,7 +2173,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) dev: false @@ -2209,15 +2187,6 @@ packages: '@babel/core': 7.24.5 dev: false - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -2225,23 +2194,13 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -2252,7 +2211,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -2261,7 +2219,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): @@ -2270,7 +2228,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.24.5): @@ -2280,7 +2238,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): @@ -2289,7 +2247,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.24.5): @@ -2299,7 +2257,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.24.5): @@ -2309,7 +2267,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.24.5): @@ -2319,18 +2277,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -2338,16 +2287,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -2356,27 +2295,17 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.24.5): + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -2384,16 +2313,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -2402,16 +2321,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -2420,16 +2329,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -2438,16 +2337,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -2456,65 +2345,33 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: false - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: true /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.24.5): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} @@ -2524,7 +2381,6 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-plugin-utils': 7.22.5 - dev: false /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -2534,7 +2390,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.24.5): @@ -2544,7 +2400,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.24.5): @@ -2555,7 +2411,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) dev: false @@ -2567,8 +2423,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) transitivePeerDependencies: - supports-color @@ -2581,7 +2437,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.24.5): @@ -2591,7 +2447,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.24.5): @@ -2602,7 +2458,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.24.5): @@ -2613,7 +2469,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) dev: false @@ -2624,12 +2480,12 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.5) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 @@ -2642,8 +2498,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.25.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 dev: false /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.24.5): @@ -2653,7 +2509,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.24.5): @@ -2664,7 +2520,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.24.5): @@ -2674,7 +2530,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.24.5): @@ -2684,7 +2540,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) dev: false @@ -2696,7 +2552,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.24.5): @@ -2706,7 +2562,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) dev: false @@ -2717,7 +2573,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.24.5) dev: false @@ -2728,7 +2584,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.24.5): @@ -2740,7 +2596,7 @@ packages: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.24.5): @@ -2750,7 +2606,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) dev: false @@ -2761,7 +2617,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.24.5): @@ -2771,7 +2627,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) dev: false @@ -2782,7 +2638,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.24.5): @@ -2793,7 +2649,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color dev: false @@ -2806,7 +2662,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color @@ -2821,8 +2677,8 @@ packages: '@babel/core': 7.24.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 transitivePeerDependencies: - supports-color dev: false @@ -2835,7 +2691,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color dev: false @@ -2848,7 +2704,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.24.5): @@ -2858,7 +2714,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.24.5): @@ -2868,7 +2724,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) dev: false @@ -2879,7 +2735,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) dev: false @@ -2892,7 +2748,7 @@ packages: '@babel/compat-data': 7.25.2 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.5) dev: false @@ -2904,7 +2760,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.5) dev: false @@ -2915,7 +2771,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) dev: false @@ -2926,7 +2782,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) dev: false @@ -2938,7 +2794,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.24.5): @@ -2949,7 +2805,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.24.5): @@ -2959,9 +2815,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) dev: false @@ -2972,7 +2828,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.24.5): @@ -2982,7 +2838,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.24.5): @@ -2992,7 +2848,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.24.5): @@ -3002,21 +2858,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + /@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.24.5): + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.5) - '@babel/types': 7.25.2 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.24.5) + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color dev: false @@ -3028,7 +2884,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 dev: false @@ -3039,7 +2895,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.24.5): @@ -3049,8 +2905,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.24.5) babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.24.5) babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.24.5) @@ -3066,7 +2922,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-spread@7.22.5(@babel/core@7.24.5): @@ -3076,7 +2932,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: false @@ -3087,7 +2943,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.24.5): @@ -3097,7 +2953,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.24.5): @@ -3107,7 +2963,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.24.5): @@ -3117,9 +2973,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.24.5) dev: false @@ -3130,7 +2986,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.24.5): @@ -3141,7 +2997,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.24.5): @@ -3152,7 +3008,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.24.5): @@ -3163,7 +3019,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 dev: false /@babel/preset-env@7.22.20(@babel/core@7.24.5): @@ -3175,7 +3031,7 @@ packages: '@babel/compat-data': 7.25.2 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.24.8 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.24.5) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.24.5) @@ -3247,7 +3103,7 @@ packages: '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.24.5) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - '@babel/types': 7.25.2 + '@babel/types': 7.26.0 babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.24.5) babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.24.5) babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.24.5) @@ -3264,7 +3120,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.24.8 '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.24.5) dev: false @@ -3275,8 +3131,8 @@ packages: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.25.2 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 esutils: 2.0.3 dev: false @@ -3287,9 +3143,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.5) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.24.5) '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.5) '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.24.5) transitivePeerDependencies: @@ -3351,6 +3207,15 @@ packages: '@babel/parser': 7.25.3 '@babel/types': 7.25.2 + /@babel/template@7.25.9: + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + dev: false + /@babel/traverse@7.23.0: resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} engines: {node: '>=6.9.0'} @@ -3383,6 +3248,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse@7.25.9: + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/types@7.23.0: resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} @@ -3399,6 +3279,14 @@ packages: '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + /@babel/types@7.26.0: + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + dev: false + /@badgateway/oauth2-client@2.4.2: resolution: {integrity: sha512-70Fmzlmn8EfCjjssls8N6E94quBUWnLhu4inPZU2pkwpc6ZvbErkLRvtkYl81KFCvVcuVC0X10QPZVNwjXo2KA==} engines: {node: '>= 14'} @@ -4398,14 +4286,14 @@ packages: /@floating-ui/core@1.6.5: resolution: {integrity: sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==} dependencies: - '@floating-ui/utils': 0.2.5 + '@floating-ui/utils': 0.2.8 dev: false - /@floating-ui/dom@1.6.8: - resolution: {integrity: sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==} + /@floating-ui/dom@1.6.12: + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} dependencies: '@floating-ui/core': 1.6.5 - '@floating-ui/utils': 0.2.5 + '@floating-ui/utils': 0.2.8 dev: false /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): @@ -4414,7 +4302,7 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.8 + '@floating-ui/dom': 1.6.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -4425,7 +4313,7 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@floating-ui/dom': 1.6.8 + '@floating-ui/dom': 1.6.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -4447,6 +4335,10 @@ packages: resolution: {integrity: sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ==} dev: false + /@floating-ui/utils@0.2.8: + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + dev: false + /@formatjs/ecma402-abstract@2.0.0: resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} dependencies: @@ -4736,7 +4628,7 @@ packages: /@internationalized/date@3.5.4: resolution: {integrity: sha512-qoVJVro+O0rBaw+8HPjUB1iH8Ihf8oziEnqMnvhJUSuVIrHOuZ6eNLHNvzXJKUvAtaDiqMnRlg8Z2mgh09BlUw==} dependencies: - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 dev: false /@internationalized/message@3.1.4: @@ -4995,7 +4887,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -5059,14 +4951,6 @@ packages: chalk: 4.1.2 dev: false - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -5715,7 +5599,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-collapsible': 1.0.1(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collection': 1.0.1(react-dom@18.2.0)(react@18.2.0) @@ -5823,7 +5707,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0) @@ -6440,7 +6324,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.2 + '@babel/runtime': 7.23.9 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.48 '@types/react-dom': 18.2.14 @@ -6454,7 +6338,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-collection': 1.0.2(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) @@ -6521,7 +6405,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0) @@ -6587,7 +6471,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.23.9 - '@floating-ui/react-dom': 2.0.2(react-dom@18.2.0)(react@18.2.0) + '@floating-ui/react-dom': 2.1.1(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.14)(@types/react@18.2.48)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.48)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.48)(react@18.2.0) @@ -7111,7 +6995,7 @@ packages: react: ^16.8 || ^17.0 || ^18.0 react-dom: ^16.8 || ^17.0 || ^18.0 dependencies: - '@babel/runtime': 7.23.1 + '@babel/runtime': 7.23.9 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) '@radix-ui/react-context': 1.0.0(react@18.2.0) @@ -7751,7 +7635,7 @@ packages: '@react-types/datepicker': 3.7.4(react@18.2.0) '@react-types/dialog': 3.5.10(react@18.2.0) '@react-types/shared': 3.23.1(react@18.2.0) - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -8282,7 +8166,7 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.26.2 '@babel/preset-env': 7.22.20(@babel/core@7.24.5) flow-parser: 0.206.0 jscodeshift: 0.14.0(@babel/preset-env@7.22.20) @@ -8443,7 +8327,7 @@ packages: '@react-stately/utils': 3.10.1(react@18.2.0) '@react-types/datepicker': 3.7.4(react@18.2.0) '@react-types/shared': 3.23.1(react@18.2.0) - '@swc/helpers': 0.5.11 + '@swc/helpers': 0.5.12 react: 18.2.0 dev: false @@ -9298,7 +9182,7 @@ packages: stripe: 13.11.0 dev: false - /@stripe/ui-extension-tools@0.0.1(@babel/core@7.23.0): + /@stripe/ui-extension-tools@0.0.1(@babel/core@7.24.5): resolution: {integrity: sha512-0pOgQ3AuEUeypAgAhcJbyC9QxMaMW1OqzzxkCO4a+5ALDyIFEA6M4jDQ3H9KayNwqQ23qq+PQ0rlYY7dRACNgA==} dependencies: '@types/jest': 28.1.8 @@ -9309,7 +9193,7 @@ packages: eslint-plugin-react-hooks: 4.6.2(eslint@8.48.0) jest: 27.5.1 jest-transform-stub: 2.0.0 - ts-jest: 27.1.5(@babel/core@7.23.0)(@types/jest@28.1.8)(jest@27.5.1)(typescript@4.9.5) + ts-jest: 27.1.5(@babel/core@7.24.5)(@types/jest@28.1.8)(jest@27.5.1)(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - '@babel/core' @@ -9873,7 +9757,6 @@ packages: '@types/prop-types': 15.7.8 '@types/scheduler': 0.16.4 csstype: 3.1.3 - dev: false /@types/react@18.2.48: resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} @@ -10439,7 +10322,7 @@ packages: /@vue/compiler-core@3.4.21: resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.26.2 '@vue/shared': 3.4.21 entities: 4.5.0 estree-walker: 2.0.2 @@ -10456,7 +10339,7 @@ packages: /@vue/compiler-sfc@3.4.21: resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.26.2 '@vue/compiler-core': 3.4.21 '@vue/compiler-dom': 3.4.21 '@vue/compiler-ssr': 3.4.21 @@ -11055,7 +10938,7 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.22.1 + browserslist: 4.23.3 caniuse-lite: 1.0.30001651 fraction.js: 4.3.6 normalize-range: 0.1.2 @@ -11065,22 +10948,6 @@ packages: dev: false /autoprefixer@10.4.16(postcss@8.4.31): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001543 - fraction.js: 4.3.6 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.31 - postcss-value-parser: 4.2.0 - dev: true - - /autoprefixer@10.4.16(postcss@8.4.38): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -11092,7 +10959,7 @@ packages: fraction.js: 4.3.6 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.38 + postcss: 8.4.31 postcss-value-parser: 4.2.0 dev: true @@ -11135,18 +11002,18 @@ packages: '@babel/core': 7.24.5 dev: false - /babel-jest@27.5.1(@babel/core@7.23.0): + /babel-jest@27.5.1(@babel/core@7.24.5): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.23.0) + babel-preset-jest: 27.5.1(@babel/core@7.24.5) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -11225,24 +11092,24 @@ packages: - '@babel/core' dev: false - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + '@babel/core': 7.24.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) dev: true /babel-preset-fbjs@3.4.0(@babel/core@7.24.5): @@ -11255,7 +11122,7 @@ packages: '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.5) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.5) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.24.5) '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.24.5) @@ -11273,7 +11140,7 @@ packages: '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.5) '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.5) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.24.5) '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.24.5) @@ -11282,15 +11149,15 @@ packages: - supports-color dev: false - /babel-preset-jest@27.5.1(@babel/core@7.23.0): + /babel-preset-jest@27.5.1(@babel/core@7.24.5): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) dev: true /bail@2.0.2: @@ -11387,16 +11254,6 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001583 - electron-to-chromium: 1.4.540 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - /browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -11566,13 +11423,6 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001543: - resolution: {integrity: sha512-qxdO8KPWPQ+Zk6bvNpPeQIOH47qZSYdFZd6dXQzb2KzhnSXju4Kd7H1PkSJx6NICSMgo/IhRZRhhfPTHYpJUCA==} - dev: true - - /caniuse-lite@1.0.30001583: - resolution: {integrity: sha512-acWTYaha8xfhA/Du/z4sNZjHUWjkiuoAi2LM+T/aL+kemKQgPT1xBb/YKjlQ0Qo8gvbHsGNplrEJ+9G3gL7i4Q==} - /caniuse-lite@1.0.30001651: resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} @@ -12127,7 +11977,6 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: false /csv-parse@5.5.6: resolution: {integrity: sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A==} @@ -12685,9 +12534,6 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /electron-to-chromium@1.4.540: - resolution: {integrity: sha512-aoCqgU6r9+o9/S7wkcSbmPRFi7OWZWiXS9rtjEd+Ouyu/Xyw5RSq2XN8s5Qp8IaFOLiRrhQCphCIjAxgG3eCAg==} - /electron-to-chromium@1.5.11: resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} @@ -13344,6 +13190,7 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: false /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -15002,7 +14849,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -15141,10 +14988,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1(@babel/core@7.23.0) + babel-jest: 27.5.1(@babel/core@7.24.5) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -15399,7 +15246,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -15544,16 +15391,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.24.5) '@babel/traverse': 7.23.0 '@babel/types': 7.23.0 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.5 '@types/prettier': 2.7.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.11 @@ -15769,7 +15616,7 @@ packages: '@babel/preset-env': ^7.1.6 dependencies: '@babel/core': 7.24.5 - '@babel/parser': 7.25.3 + '@babel/parser': 7.26.2 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) @@ -15844,6 +15691,12 @@ packages: engines: {node: '>=4'} hasBin: true + /jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + dev: false + /json-2-csv@5.5.0: resolution: {integrity: sha512-1Y4upYpzhoweEMkFDogMU8fKLCs+ciNKviTotrrMZ8duqlycERcB38GYXpu4xcwm6YBn86cTXd7za2yUl0GAkg==} engines: {node: '>= 16'} @@ -16675,7 +16528,7 @@ packages: '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.5) '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.5) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.24.5) @@ -16684,7 +16537,7 @@ packages: '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.24.5) '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.24.5) '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.24.5) - '@babel/template': 7.25.0 + '@babel/template': 7.25.9 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.5) react-refresh: 0.4.3 transitivePeerDependencies: @@ -16723,8 +16576,8 @@ packages: resolution: {integrity: sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==} engines: {node: '>=16'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 invariant: 2.2.4 metro-symbolicate: 0.76.8 nullthrows: 1.1.1 @@ -16755,9 +16608,9 @@ packages: engines: {node: '>=16'} dependencies: '@babel/core': 7.24.5 - '@babel/generator': 7.25.0 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 + '@babel/generator': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -16768,9 +16621,9 @@ packages: engines: {node: '>=16'} dependencies: '@babel/core': 7.24.5 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 babel-preset-fbjs: 3.4.0(@babel/core@7.24.5) metro: 0.76.8 metro-babel-transformer: 0.76.8 @@ -16791,13 +16644,13 @@ packages: engines: {node: '>=16'} hasBin: true dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@babel/core': 7.24.5 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 accepts: 1.3.8 async: 3.2.4 chalk: 4.1.2 @@ -17480,6 +17333,7 @@ packages: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -17780,9 +17634,6 @@ packages: /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - /node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} @@ -18443,23 +18294,6 @@ packages: yaml: 1.10.2 dev: true - /postcss-load-config@3.1.4(postcss@8.4.38): - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.38 - yaml: 1.10.2 - dev: true - /postcss-load-config@3.1.4(ts-node@10.9.2): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} @@ -18524,9 +18358,9 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} @@ -20239,6 +20073,7 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} @@ -20592,7 +20427,7 @@ packages: engines: {node: '>=8'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 @@ -21006,7 +20841,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-jest@27.1.5(@babel/core@7.23.0)(@types/jest@28.1.8)(jest@27.5.1)(typescript@4.9.5): + /ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@28.1.8)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -21027,7 +20862,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.5 '@types/jest': 28.1.8 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -21128,14 +20963,14 @@ packages: - ts-node dev: true - /tsup@6.1.3(postcss@8.4.38)(typescript@5.5.3): - resolution: {integrity: sha512-eRpBnbfpDFng+EJNTQ90N7QAf4HAGGC7O3buHIjroKWK7D1ibk9/YnR/3cS8HsMU5T+6Oi+cnF+yU5WmCnB//Q==} - engines: {node: '>=14'} + /tsup@6.7.0(postcss@8.4.31)(typescript@5.6.2): + resolution: {integrity: sha512-L3o8hGkaHnu5TdJns+mCqFsDBo83bJ44rlK7e6VdanIvpea4ArPcU3swWGsLVbXak1PqQx/V+SSmFPujBK+zEQ==} + engines: {node: '>=14.18'} hasBin: true peerDependencies: '@swc/core': ^1 postcss: ^8.4.12 - typescript: ^4.1.0 + typescript: '>=4.1.0' peerDependenciesMeta: '@swc/core': optional: true @@ -21144,22 +20979,22 @@ packages: typescript: optional: true dependencies: - bundle-require: 3.1.2(esbuild@0.14.54) + bundle-require: 4.2.1(esbuild@0.17.19) cac: 6.7.14 chokidar: 3.5.3 debug: 4.3.4 - esbuild: 0.14.54 + esbuild: 0.17.19 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss: 8.4.38 - postcss-load-config: 3.1.4(postcss@8.4.38) + postcss: 8.4.31 + postcss-load-config: 3.1.4(postcss@8.4.31) resolve-from: 5.0.0 - rollup: 2.79.1 + rollup: 3.29.5 source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - ts-node @@ -21557,12 +21392,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /typescript@5.6.2: resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} @@ -21752,16 +21581,6 @@ packages: content-type: 1.0.5 dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.1 - /update-browserslist-db@1.1.0(browserslist@4.23.3): resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true @@ -22268,7 +22087,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.22.1 + browserslist: 4.23.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.4.1 @@ -22630,7 +22449,7 @@ packages: engines: {node: '>=10'} dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9a9ae3ca63..11bdc3a1c9 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ packages: - "apps/*" - "apps/web/.react-email" - "packages/*" + - "packages/embeds/*"