diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 0d322bb4b38..c7f4b640d30 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -72,7 +72,6 @@ "next-plausible": "^3.12.4", "next-themes": "^0.4.4", "nextjs-toploader": "^1.6.12", - "openapi-types": "^12.1.3", "p-limit": "^6.2.0", "papaparse": "^5.5.2", "pluralize": "^8.0.0", diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.client.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.client.tsx deleted file mode 100644 index 2c82422e46f..00000000000 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.client.tsx +++ /dev/null @@ -1,979 +0,0 @@ -"use client"; - -import { SingleNetworkSelector } from "@/components/blocks/NetworkSelectors"; -import { ScrollShadow } from "@/components/ui/ScrollShadow/ScrollShadow"; -import { Spinner } from "@/components/ui/Spinner/Spinner"; -import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; -import { CodeClient } from "@/components/ui/code/code.client"; -import { Form, FormField, FormItem, FormMessage } from "@/components/ui/form"; -import { Input } from "@/components/ui/input"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui/select"; -import { ToolTipLabel } from "@/components/ui/tooltip"; -import { cn } from "@/lib/utils"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { useMutation } from "@tanstack/react-query"; -import { - ArrowDownLeftIcon, - ArrowLeftIcon, - ArrowUpRightIcon, - CheckIcon, - CircleAlertIcon, - CopyIcon, - InfoIcon, - PlayIcon, -} from "lucide-react"; -import Link from "next/link"; -import type { OpenAPIV3 } from "openapi-types"; -import { useEffect, useMemo, useState } from "react"; -import { - type ControllerRenderProps, - type UseFormReturn, - useForm, -} from "react-hook-form"; -import { z } from "zod"; -import { useTrack } from "../../../../../../hooks/analytics/useTrack"; -import { getVercelEnv } from "../../../../../../lib/vercel-utils"; -import type { BlueprintParameter, BlueprintPathMetadata } from "../utils"; - -const trackingCategory = "insightBlueprint"; - -export function BlueprintPlayground(props: { - metadata: BlueprintPathMetadata; - backLink: string; - clientId: string; - path: string; - isInsightEnabled: boolean; - projectSettingsLink: string; - supportedChainIds: number[]; - authToken: string; -}) { - const [abortController, setAbortController] = - useState(null); - const requestMutation = useMutation({ - mutationFn: async (url: string) => { - const controller = new AbortController(); - setAbortController(controller); - const start = performance.now(); - try { - const res = await fetch(url, { - signal: controller.signal, - headers: { - Authorization: `Bearer ${props.authToken}`, - }, - }); - return { - status: res.status, - data: await res.text(), - time: performance.now() - start, - }; - } catch (e) { - const time = performance.now() - start; - if (e instanceof Error) { - return { - data: e.message, - time: time, - }; - } - return { - data: "Failed to fetch", - time: time, - }; - } - }, - }); - - const thirdwebDomain = - getVercelEnv() !== "production" ? "thirdweb-dev" : "thirdweb"; - - return ( - { - requestMutation.mutate(url); - }} - response={ - abortController?.signal.aborted ? undefined : requestMutation.data - } - abortRequest={() => { - if (abortController) { - // just abort it - don't set a new controller - abortController.abort(); - } - }} - domain={`https://insight.${thirdwebDomain}.com`} - path={props.path} - isInsightEnabled={props.isInsightEnabled} - projectSettingsLink={props.projectSettingsLink} - supportedChainIds={props.supportedChainIds} - /> - ); -} - -function modifyParametersForPlayground(_parameters: BlueprintParameter[]) { - const parameters = [..._parameters]; - - // make chain query param required - its not required in open api spec - because it either has to be set in subdomain or as a query param - const chainIdParameter = parameters.find((p) => p.name === "chain"); - if (chainIdParameter) { - chainIdParameter.required = true; - } - - // remove the client id parameter if it is present - we will always replace the parameter with project's client id - const clientIdParameterIndex = parameters.findIndex( - (p) => p.name === "clientId", - ); - if (clientIdParameterIndex !== -1) { - parameters.splice(clientIdParameterIndex, 1); - } - - return parameters; -} - -export function BlueprintPlaygroundUI(props: { - backLink: string; - isPending: boolean; - onRun: (url: string) => void; - response: - | { - time: number; - data: undefined | string; - status?: number; - } - | undefined; - clientId: string; - abortRequest: () => void; - domain: string; - path: string; - metadata: BlueprintPathMetadata; - isInsightEnabled: boolean; - projectSettingsLink: string; - supportedChainIds: number[]; -}) { - const trackEvent = useTrack(); - const parameters = useMemo(() => { - const filteredParams = props.metadata.parameters?.filter( - isOpenAPIV3ParameterObject, - ); - return modifyParametersForPlayground(filteredParams || []); - }, [props.metadata.parameters]); - - const formSchema = useMemo(() => { - return createParametersFormSchema(parameters); - }, [parameters]); - - const defaultValues = useMemo(() => { - const values: Record = {}; - for (const param of parameters) { - if (param.schema && "type" in param.schema && param.schema.default) { - values[param.name] = param.schema.default; - } else { - values[param.name] = ""; - } - } - return values; - }, [parameters]); - - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: defaultValues, - }); - - function onSubmit(values: z.infer) { - const url = createBlueprintUrl({ - parameters: parameters, - values: values, - clientId: props.clientId, - domain: props.domain, - path: props.path, - intent: "run", - }); - - trackEvent({ - category: trackingCategory, - action: "click", - label: "run", - url: url, - }); - props.onRun(url); - } - - return ( -
- -
- - -
- {!props.isInsightEnabled && ( - - - - Insight service is disabled for this project - - - You can enable Insight service in{" "} - - {" "} - Project Settings{" "} - - - - )} - -
- form.getValues()} - clientId={props.clientId} - /> -
-
- -
- -
- -
-
-
-
-
-
- - ); -} - -function BlueprintMetaHeader(props: { - title: string; - description: string | undefined; - backLink: string; -}) { - return ( -
-
-
- - -
-

- {props.title} -

- {props.description && ( -

- {props.description} -

- )} -
-
-
-
- ); -} - -function PlaygroundHeader(props: { - parameters: BlueprintParameter[]; - isPending: boolean; - getFormValues: () => Record; - clientId: string; - domain: string; - path: string; -}) { - const trackEvent = useTrack(); - - const [hasCopied, setHasCopied] = useState(false); - return ( -
-
-
- {/* copy url */} - - - {/* vertical line */} -
- - {/* domain + path */} -
-
- {props.domain} - ... -
-
- {props.path} -
-
- - {/* Run */} - -
- - -
-
- ); -} - -function RequestConfigSection(props: { - parameters: BlueprintParameter[]; - form: ParametersForm; - domain: string; - path: string; - supportedChainIds: number[]; -}) { - const { pathVariables, queryParams, filterQueryParams } = useMemo(() => { - const pathVariables: OpenAPIV3.ParameterObject[] = []; - const queryParams: OpenAPIV3.ParameterObject[] = []; - const filterQueryParams: OpenAPIV3.ParameterObject[] = []; - - for (const param of props.parameters) { - if (param.in === "path") { - pathVariables.push(param); - } - - if (param.in === "query") { - if (param.name.startsWith("filter_")) { - filterQueryParams.push(param); - } else { - queryParams.push(param); - } - } - } - - return { - pathVariables, - queryParams, - filterQueryParams, - }; - }, [props.parameters]); - - const showError = - !props.form.formState.isValid && - props.form.formState.isDirty && - props.form.formState.isSubmitted; - - return ( -
-
-
- - Request -
- {showError && Invalid Request} -
- - - {pathVariables.length > 0 && ( - - )} - - {queryParams.length > 0 && ( - - )} - - {filterQueryParams.length > 0 && ( - - )} - -
- ); -} - -type ParametersForm = UseFormReturn<{ - [x: string]: string | number; -}>; - -function ParameterSection(props: { - parameters: BlueprintParameter[]; - title: string; - form: ParametersForm; - domain: string; - path: string; - supportedChainIds: number[]; - className?: string; -}) { - const url = `${props.domain}${props.path}`; - return ( -
-

{props.title}

-
- {props.parameters.map((param, i) => { - const description = - param.schema && "type" in param.schema - ? param.schema.description - : undefined; - - const example = - param.schema && "type" in param.schema - ? param.schema.example - : undefined; - const exampleToShow = - typeof example === "string" || typeof example === "number" - ? example - : undefined; - - const showTip = description !== undefined || example !== undefined; - - const hasError = !!props.form.formState.errors[param.name]; - - const placeholder = url.includes(`{${param.name}}`) - ? `{${param.name}}` - : url.includes(`:${param.name}`) - ? `:${param.name}` - : "Value"; - - return ( - ( - -
-
-
- {param.name} -
- {param.required && ( - - Required - - )} -
-
- {param.name === "chain" ? ( - { - field.onChange({ - target: { value: chainId.toString() }, - }); - }} - className="rounded-none border-0 border-t lg:border-none" - popoverContentClassName="min-w-[calc(100vw-20px)] lg:min-w-[500px]" - chainIds={ - props.supportedChainIds.length > 0 - ? props.supportedChainIds - : undefined - } - /> - ) : ( - <> - - - {showTip && ( - - {description && ( -

- {description} -

- )} - - {exampleToShow !== undefined && ( -
-

- Example:{" "} - - {exampleToShow} - -

-
- )} -
- } - > - - - )} - - )} -
-
- - - )} - /> - ); - })} -
-
- ); -} - -function ParameterInput(props: { - param: OpenAPIV3.ParameterObject; - field: ControllerRenderProps< - { - [x: string]: string | number; - }, - string - >; - showTip: boolean; - hasError: boolean; - placeholder: string; -}) { - const { param, field, showTip, hasError, placeholder } = props; - - if (param.schema && "type" in param.schema && param.schema.enum) { - const { value, onChange, ...restField } = field; - return ( - - ); - } - - return ( - - ); -} - -function formatMilliseconds(ms: number) { - if (ms < 1000) { - return `${Math.round(ms)}ms`; - } - return `${(ms / 1000).toFixed(2)}s`; -} - -function ResponseSection(props: { - isPending: boolean; - response: - | { data: undefined | string; status?: number; time: number } - | undefined; - abortRequest: () => void; -}) { - const trackEvent = useTrack(); - const formattedData = useMemo(() => { - if (!props.response?.data) return undefined; - try { - return JSON.stringify(JSON.parse(props.response.data), null, 2); - } catch { - return props.response.data; - } - }, [props.response]); - - return ( -
-
-
- - Response - {props.isPending && } - {props.response?.time && !props.isPending && ( - - {formatMilliseconds(props.response.time)} - - )} -
- {!props.isPending && props.response?.status && ( - = 200 && props.response.status < 300 - ? "success" - : "destructive" - } - > - {props.response.status} - - )} -
- - {props.isPending && ( -
- - -
- )} - - {!props.isPending && !props.response && ( -
-
-
-
-
- -
-
-
-

Click Run to start a request

-
-
- )} - - {!props.isPending && props.response && ( - { - trackEvent({ - category: trackingCategory, - action: "click", - label: "copy-response", - }); - }} - /> - )} -
- ); -} - -function openAPIV3ParamToZodFormSchema( - schema: BlueprintParameter["schema"], - isRequired: boolean, -): z.ZodTypeAny | undefined { - if (!schema) { - return; - } - - if ("anyOf" in schema) { - const anyOf = schema.anyOf; - if (!anyOf) { - return; - } - const anySchemas = anyOf - .map((s) => openAPIV3ParamToZodFormSchema(s, isRequired)) - .filter((x) => !!x); - // @ts-expect-error - Its ok, z.union is expecting tuple type but we have array - return z.union(anySchemas); - } - - if (!("type" in schema)) { - return; - } - - // if enum values - const enumValues = schema.enum; - if (enumValues) { - const enumSchema = z.enum( - // @ts-expect-error - Its correct - enumValues, - ); - - if (isRequired) { - return enumSchema; - } - - return enumSchema.or(z.literal("")); - } - - switch (schema.type) { - case "integer": { - const intSchema = z.coerce - .number({ - message: "Must be an integer", - }) - .int({ - message: "Must be an integer", - }); - return isRequired - ? intSchema.min(1, { - message: "Required", - }) - : intSchema.optional(); - } - - case "number": { - const numberSchema = z.coerce.number(); - return isRequired - ? numberSchema.min(1, { - message: "Required", - }) - : numberSchema.optional(); - } - - case "boolean": { - const booleanSchema = z.coerce.boolean(); - return isRequired ? booleanSchema : booleanSchema.optional(); - } - - // everything else - just accept it as a string; - default: { - const stringSchema = z.string(); - return isRequired - ? stringSchema.min(1, { - message: "Required", - }) - : stringSchema.optional(); - } - } -} - -function createParametersFormSchema(parameters: BlueprintParameter[]) { - const shape: z.ZodRawShape = {}; - for (const param of parameters) { - const paramSchema = openAPIV3ParamToZodFormSchema( - param.schema, - !!param.required, - ); - if (paramSchema) { - shape[param.name] = paramSchema; - } else { - shape[param.name] = param.required - ? z.string().min(1, { message: "Required" }) - : z.string(); - } - } - - return z.object(shape); -} - -function createBlueprintUrl(options: { - parameters: BlueprintParameter[]; - values: Record; - clientId: string; - domain: string; - path: string; - intent: "copy" | "run"; -}) { - const { parameters, domain, path, values, clientId } = options; - - let url = `${domain}${path}`; - // loop over the values and replace {x} or :x with the actual values for paths - // and add query parameters - const pathVariables = parameters.filter((param) => param.in === "path"); - - const queryParams = parameters.filter((param) => param.in === "query"); - - for (const parameter of pathVariables) { - const value = values[parameter.name]; - if (value) { - url = url.replace(`{${parameter.name}}`, value); - url = url.replace(`:${parameter.name}`, value); - } - } - - const searchParams = new URLSearchParams(); - for (const parameter of queryParams) { - const value = values[parameter.name]; - if (value) { - searchParams.append(parameter.name, value); - } - } - - // add client Id search param - if (options.intent === "copy") { - searchParams.append("clientId", clientId); - } - - if (searchParams.toString()) { - url = `${url}?${searchParams.toString()}`; - } - - return url; -} - -function ElapsedTimeCounter() { - const [ms, setMs] = useState(0); - - // eslint-disable-next-line no-restricted-syntax - useEffect(() => { - const internal = 100; - const id = setInterval(() => { - setMs((prev) => prev + internal); - }, internal); - - return () => clearInterval(id); - }, []); - - return ( - - {formatMilliseconds(ms)} - - ); -} - -function isOpenAPIV3ParameterObject( - x: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject, -): x is OpenAPIV3.ParameterObject { - return !("$ref" in x); -} diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.stories.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.stories.tsx deleted file mode 100644 index bd361989501..00000000000 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/blueprint-playground.stories.tsx +++ /dev/null @@ -1,544 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { useMutation } from "@tanstack/react-query"; -import { useState } from "react"; -import { mobileViewport } from "../../../../../../stories/utils"; -import type { BlueprintPathMetadata } from "../utils"; -import { BlueprintPlaygroundUI } from "./blueprint-playground.client"; - -const meta = { - title: "Insight/BlueprintPlayground", - component: Story, - parameters: { - nextjs: { - appDirectory: true, - }, - }, -} satisfies Meta; - -export default meta; -type Story = StoryObj; - -export const Desktop: Story = { - args: { - metadata: getBlueprintMetadata().test1, - }, -}; - -export const Mobile: Story = { - args: { - metadata: getBlueprintMetadata().test1, - }, - parameters: { - viewport: mobileViewport("iphone14"), - }, -}; - -function Story() { - return ( -
- - - -
- ); -} - -function Variant(props: { - metadata: BlueprintPathMetadata; - isInsightEnabled: boolean; -}) { - const [abortController, setAbortController] = - useState(null); - - const mutation = useMutation({ - mutationFn: async () => { - const controller = new AbortController(); - setAbortController(controller); - const start = performance.now(); - const promise = new Promise((resolve) => - setTimeout(resolve, Math.random() * 4000), - ); - await Promise.race([ - promise, - new Promise((_, reject) => - controller.signal.addEventListener("abort", reject), - ), - ]); - - const dummyResponse = { - data: { - title: "This is a dummy response", - content: crypto.getRandomValues(new Uint8Array(100)), - }, - }; - - return { - data: JSON.stringify(dummyResponse, null, 2), - status: 200, - time: performance.now() - start, - }; - }, - }); - return ( -
- { - mutation.mutateAsync(); - }} - response={mutation.data} - clientId="68665db28327c771c9a1bd5fc4580a0a" - abortRequest={() => { - abortController?.abort(); - }} - domain="https://insight.thirdweb.com" - path="/foo/bar" - isInsightEnabled={props.isInsightEnabled} - projectSettingsLink="/foo" - supportedChainIds={[ - 2039, 30, 98865, 42793, 1, 1952959480, 37714555429, 8008135, 55244, - 42019, 8453, 480, 84532, 7897, - ]} - /> -
- ); -} - -function getBlueprintMetadata() { - const test1: BlueprintPathMetadata = { - description: "Get transactions", - summary: "Get transactions", - parameters: [ - { - schema: { - type: "number", - description: "Filter by block number", - example: 1000000, - }, - required: false, - name: "filter_block_number", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block number greater than or equal to", - example: 1000000, - }, - required: false, - name: "filter_block_number_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block number greater than", - example: 1000000, - }, - required: false, - name: "filter_block_number_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block number less than or equal to", - example: 1000000, - }, - required: false, - name: "filter_block_number_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block number less than", - example: 1000000, - }, - required: false, - name: "filter_block_number_lt", - in: "query", - }, - { - schema: { - type: "string", - description: "Filter by block hash", - example: - "0x3a1fba5abd9d41457944e91ed097e039b7b12d3d7ba324a3f422db2277a48e28", - }, - required: false, - name: "filter_block_hash", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block timestamp", - example: 1715222400, - }, - required: false, - name: "filter_block_timestamp", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block timestamp greater than or equal to", - example: 1715222400, - }, - required: false, - name: "filter_block_timestamp_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block timestamp greater than", - example: 1715222400, - }, - required: false, - name: "filter_block_timestamp_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block timestamp less than or equal to", - example: 1715222400, - }, - required: false, - name: "filter_block_timestamp_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by block timestamp less than", - example: 1715222400, - }, - required: false, - name: "filter_block_timestamp_lt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by transaction index", - example: 5, - }, - required: false, - name: "filter_transaction_index", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by transaction index greater than or equal to", - example: 5, - }, - required: false, - name: "filter_transaction_index_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by transaction index greater than", - example: 5, - }, - required: false, - name: "filter_transaction_index_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by transaction index less than or equal to", - example: 5, - }, - required: false, - name: "filter_transaction_index_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by transaction index less than", - example: 5, - }, - required: false, - name: "filter_transaction_index_lt", - in: "query", - }, - { - schema: { - type: "string", - enum: ["block_number", "block_timestamp", "transaction_index"], - description: "Field to sort results by", - example: "block_number", - }, - required: false, - name: "sort_by", - in: "query", - }, - { - schema: { - type: "string", - enum: ["asc", "desc"], - description: "Sort order (asc or desc)", - example: "desc", - }, - required: false, - name: "sort_order", - in: "query", - }, - { - schema: { - type: "string", - }, - required: false, - name: "group_by", - in: "query", - }, - { - schema: { - type: "array", - items: { - type: "string", - }, - }, - required: false, - name: "aggregate", - in: "query", - }, - { - schema: { - type: "string", - description: "Filter by transaction hash", - example: - "0x218b632d932371478d1ae5a01620ebab1a2030f9dad6f8fba4a044ea6335a57e", - }, - required: false, - name: "filter_hash", - in: "query", - }, - { - schema: { - type: "string", - description: "Filter by from address", - example: "0xa1e4380a3b1f749673e270229993ee55f35663b4", - }, - required: false, - name: "filter_from_address", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by value", - example: 21000000000000, - }, - required: false, - name: "filter_value", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by value greater than or equal to", - example: 21000000000000, - }, - required: false, - name: "filter_value_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by value greater than", - example: 21000000000000, - }, - required: false, - name: "filter_value_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by value less than or equal to", - example: 21000000000000, - }, - required: false, - name: "filter_value_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by value less than", - example: 21000000000000, - }, - required: false, - name: "filter_value_lt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas price", - example: 50000000000000, - }, - required: false, - name: "filter_gas_price", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas price greater than or equal to", - example: 50000000000000, - }, - required: false, - name: "filter_gas_price_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas price greater than", - example: 50000000000000, - }, - required: false, - name: "filter_gas_price_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas price less than or equal to", - example: 50000000000000, - }, - required: false, - name: "filter_gas_price_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas price less than", - example: 50000000000000, - }, - required: false, - name: "filter_gas_price_lt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas", - example: 21000, - }, - required: false, - name: "filter_gas", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas greater than or equal to", - example: 21000, - }, - required: false, - name: "filter_gas_gte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas greater than", - example: 21000, - }, - required: false, - name: "filter_gas_gt", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas less than or equal to", - example: 21000, - }, - required: false, - name: "filter_gas_lte", - in: "query", - }, - { - schema: { - type: "number", - description: "Filter by gas less than", - example: 21000, - }, - required: false, - name: "filter_gas_lt", - in: "query", - }, - { - schema: { - type: "string", - description: "Filter by function selector", - example: "0x095ea7b3", - }, - required: false, - name: "filter_function_selector", - in: "query", - }, - { - schema: { - type: "string", - description: "Filter by to address", - example: "0xa1e4380a3b1f749673e270229993ee55f35663b4", - }, - required: false, - name: "filter_to_address", - in: "query", - }, - { - schema: { - type: "integer", - minimum: 0, - exclusiveMinimum: true, - default: 20, - description: "The number of items to return", - example: 20, - }, - required: false, - name: "limit", - in: "query", - }, - { - schema: { - type: "integer", - nullable: true, - minimum: 0, - default: 0, - example: 0, - }, - required: false, - name: "page", - in: "query", - }, - ], - }; - - return { - test1: test1, - }; -} diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/page.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/page.tsx deleted file mode 100644 index 75b59b5ef9d..00000000000 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/[blueprint_slug]/page.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { getProject } from "@/api/projects"; -import { notFound, redirect } from "next/navigation"; -import { getAPIKeyForProjectId } from "../../../../../api/lib/getAPIKeys"; -import { getAuthToken } from "../../../../../api/lib/getAuthToken"; -import { loginRedirect } from "../../../../../login/loginRedirect"; -import { fetchBlueprintSpec } from "../utils"; -import { BlueprintPlayground } from "./blueprint-playground.client"; - -export default async function Page(props: { - params: Promise<{ - team_slug: string; - project_slug: string; - blueprint_slug: string; - }>; - searchParams: Promise<{ path: string }>; -}) { - const [params, searchParams, authToken] = await Promise.all([ - props.params, - props.searchParams, - getAuthToken(), - ]); - - if (!authToken) { - loginRedirect( - `/team/${params.team_slug}/${params.project_slug}/insight/${params.blueprint_slug}?path=${searchParams.path}`, - ); - } - - // invalid url - if (!searchParams.path) { - redirect(`/team/${params.team_slug}/${params.project_slug}/insight`); - } - - const project = await getProject(params.team_slug, params.project_slug); - - if (!project) { - return redirect(`/team/${params.team_slug}`); - } - - const [blueprintSpec, apiKey] = await Promise.all([ - fetchBlueprintSpec({ - authToken, - blueprintId: params.blueprint_slug, - }), - getAPIKeyForProjectId(project.id), - ]); - - // unexpected error - should never happen - if (!apiKey) { - console.error("Failed to get API key for project", { - projectId: project.id, - teamSlug: params.team_slug, - projectSlug: params.project_slug, - }); - notFound(); - } - - const pathMetadata = blueprintSpec.openapiJson.paths[searchParams.path]?.get; - - // invalid url - if (!pathMetadata) { - redirect(`/team/${params.team_slug}/${params.project_slug}/insight`); - } - - const isInsightEnabled = !!apiKey.services?.find((s) => s.name === "insight"); - - const supportedChainIds = - blueprintSpec.openapiJson.servers?.[0]?.variables?.chainId?.enum?.map( - Number, - ) || []; - - return ( - - ); -} diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/page.tsx b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/page.tsx index 5e7b16bf2f8..d8b6d4c7f90 100644 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/page.tsx +++ b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/page.tsx @@ -1,123 +1,109 @@ import { Button } from "@/components/ui/button"; -import { ToolTipLabel } from "@/components/ui/tooltip"; -import { BoxIcon, PlusIcon } from "lucide-react"; +import { + Code2Icon, + DatabaseIcon, + ExternalLinkIcon, + ZapIcon, +} from "lucide-react"; import Link from "next/link"; -import { redirect } from "next/navigation"; -import { getAuthToken } from "../../../../api/lib/getAuthToken"; -import { fetchAllBlueprints } from "./utils"; - -export default async function Page(props: { - params: Promise<{ team_slug: string; project_slug: string }>; -}) { - const params = await props.params; - const authToken = await getAuthToken(); - - if (!authToken) { - const { team_slug, project_slug } = await props.params; - return redirect( - `/login?next=${encodeURIComponent(`/team/${team_slug}/${project_slug}/insight`)}`, - ); - } +export default async function Page() { return (
-
+

Insight

- - -
-
- +
+
); } -async function BlueprintsSection(params: { - authToken: string; - layoutPath: string; -}) { - const blueprints = await fetchAllBlueprints(params); +function BlueprintCard() { + const features = [ + { + icon: Code2Icon, + title: "Easy-to-Use API", + description: "RESTful endpoints for any application", + }, + { + icon: DatabaseIcon, + title: "Managed Infrastructure", + description: + "No need to index blockchains yourself or manage infrastructure and RPC costs.", + }, + { + icon: ZapIcon, + title: "Lightning-Fast Queries", + description: "Access any transaction, event or token API data", + }, + ]; return ( -
-

- Explore Blueprints -

-
- {blueprints.map((blueprint) => { - const paths = Object.keys(blueprint.openapiJson.paths); - return ( -
-

- {blueprint.name} -

-

- {blueprint.description} -

+
+ {/* header */} +
+
+

Blueprints

-
- {paths.map((pathName) => { - const pathObj = blueprint.openapiJson.paths[pathName]; - if (!pathObj) { - return null; - } - return ( - - ); - })} -
-
- ); - })} +
+ +
+
-
- ); -} -function BlueprintCard(props: { - href: string; - title: string; - description: string | undefined; -}) { - return ( -
-
-
- + {/* Content */} +
+

+ Simple endpoints for querying rich blockchain data +

+

+ A blueprint is an API that provides access to on-chain data in a + user-friendly format.
No need for ABIs, decoding, RPC, or web3 + knowledge required to fetch blockchain data. +

+ +
+ + {/* Features */} +
+ {features.map((feature) => ( +
+
+ +
+
+

{feature.title}

+

+ {feature.description} +

+
+
+ ))}
-
- -

{props.title}

- - - {props.description && ( -

- {props.description} -

- )} + {/* Playground link */} +
+
); diff --git a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/utils.ts b/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/utils.ts deleted file mode 100644 index 5ea77ee85b7..00000000000 --- a/apps/dashboard/src/app/team/[team_slug]/[project_slug]/insight/utils.ts +++ /dev/null @@ -1,88 +0,0 @@ -import "server-only"; - -import type { OpenAPIV3 } from "openapi-types"; -import { getVercelEnv } from "../../../../../lib/vercel-utils"; - -type BlueprintListItem = { - id: string; - name: string; - description: string; - slug: string; -}; - -const thirdwebDomain = - getVercelEnv() !== "production" ? "thirdweb-dev" : "thirdweb"; - -async function fetchBlueprintList(props: { - authToken: string; -}) { - const res = await fetch( - `https://insight.${thirdwebDomain}.com/v1/blueprints`, - { - headers: { - Authorization: `Bearer ${props.authToken}`, - }, - }, - ); - - if (!res.ok) { - const text = await res.text(); - throw new Error(`Failed to fetch blueprints: ${text}`); - } - - const json = (await res.json()) as { data: BlueprintListItem[] }; - - return json.data; -} - -export type BlueprintParameter = OpenAPIV3.ParameterObject; -export type BlueprintPathMetadata = OpenAPIV3.PathItemObject; - -type BlueprintSpec = { - id: string; - name: string; - description: string; - openapiJson: OpenAPIV3.Document; -}; - -export async function fetchBlueprintSpec(params: { - blueprintId: string; - authToken: string; -}) { - const res = await fetch( - `https://insight.${thirdwebDomain}.com/v1/blueprints/${params.blueprintId}`, - { - headers: { - Authorization: `Bearer ${params.authToken}`, - }, - }, - ); - - if (!res.ok) { - const text = await res.text(); - throw new Error(`Failed to fetch blueprint: ${text}`); - } - - const json = (await res.json()) as { data: BlueprintSpec }; - - return json.data; -} - -export async function fetchAllBlueprints(params: { - authToken: string; -}) { - // fetch list - const blueprintSpecs = await fetchBlueprintList(params); - - // fetch all blueprints - const blueprints = await Promise.all( - blueprintSpecs.map((spec) => - fetchBlueprintSpec({ - blueprintId: spec.id, - authToken: params.authToken, - }), - ), - ); - - return blueprints; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db5a24b9581..0c5c5716303 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,7 +135,7 @@ importers: version: 1.1.7(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@sentry/nextjs': specifier: 8.53.0 - version: 8.53.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + version: 8.53.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) '@shazow/whatsabi': specifier: ^0.19.0 version: 0.19.0(@noble/hashes@1.7.1)(typescript@5.7.3)(zod@3.24.1) @@ -211,9 +211,6 @@ importers: nextjs-toploader: specifier: ^1.6.12 version: 1.6.12(next@15.1.6(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - openapi-types: - specifier: ^12.1.3 - version: 12.1.3 p-limit: specifier: ^6.2.0 version: 6.2.0 @@ -285,7 +282,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -334,7 +331,7 @@ importers: version: 8.5.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)) '@storybook/nextjs': specifier: 8.5.2 - version: 8.5.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(type-fest@4.33.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + version: 8.5.2(@swc/core@1.10.12)(esbuild@0.24.2)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(type-fest@4.33.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) '@storybook/react': specifier: 8.5.2 version: 8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) @@ -382,7 +379,7 @@ importers: version: 10.4.20(postcss@8.5.1) checkly: specifier: ^4.19.1 - version: 4.19.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) + version: 4.19.1(@swc/core@1.10.12)(@types/node@22.13.0)(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) eslint: specifier: 8.57.0 version: 8.57.0 @@ -409,7 +406,7 @@ importers: version: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) typescript: specifier: 5.7.3 version: 5.7.3 @@ -461,7 +458,7 @@ importers: version: 6.0.1(jiti@2.4.2)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0) tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) typescript: specifier: 5.7.3 version: 5.7.3 @@ -606,10 +603,10 @@ importers: version: 8.5.1 tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))) typescript: specifier: 5.7.3 version: 5.7.3 @@ -621,13 +618,13 @@ importers: version: 1.0.6(react@19.0.0) '@mdx-js/loader': specifier: ^2.3.0 - version: 2.3.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 2.3.0(webpack@5.97.1) '@mdx-js/react': specifier: ^2.3.0 version: 2.3.0(react@19.0.0) '@next/mdx': specifier: 15.1.6 - version: 15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))))(@mdx-js/react@2.3.0(react@19.0.0)) + version: 15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1))(@mdx-js/react@2.3.0(react@19.0.0)) '@radix-ui/react-dialog': specifier: 1.1.5 version: 1.1.5(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -705,7 +702,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -763,7 +760,7 @@ importers: version: 1.2.4 eslint-plugin-tailwindcss: specifier: ^3.18.0 - version: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))) + version: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))) knip: specifier: 5.43.6 version: 5.43.6(@types/node@22.13.0)(typescript@5.7.3) @@ -775,7 +772,7 @@ importers: version: 8.5.1 tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) tsx: specifier: 4.19.2 version: 4.19.2 @@ -841,7 +838,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -890,7 +887,7 @@ importers: version: 6.0.1(jiti@2.4.2)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0) tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) typescript: specifier: 5.7.3 version: 5.7.3 @@ -15197,7 +15194,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/client-sts': 3.592.0 '@aws-sdk/core': 3.592.0 '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) @@ -15243,7 +15240,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/client-sts': 3.592.0 '@aws-sdk/core': 3.592.0 '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) @@ -15289,7 +15286,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/client-sts': 3.592.0 '@aws-sdk/core': 3.592.0 '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) @@ -15336,7 +15333,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.592.0(@aws-sdk/client-sts@3.592.0)': + '@aws-sdk/client-sso-oidc@3.592.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 @@ -15379,7 +15376,6 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso-oidc@3.738.0': @@ -15516,7 +15512,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/core': 3.592.0 '@aws-sdk/credential-provider-node': 3.592.0(@aws-sdk/client-sso-oidc@3.592.0)(@aws-sdk/client-sts@3.592.0) '@aws-sdk/middleware-host-header': 3.577.0 @@ -15958,7 +15954,7 @@ snapshots: '@aws-sdk/token-providers@3.587.0(@aws-sdk/client-sso-oidc@3.592.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.592.0(@aws-sdk/client-sts@3.592.0) + '@aws-sdk/client-sso-oidc': 3.592.0 '@aws-sdk/types': 3.577.0 '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 @@ -18716,11 +18712,11 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mdx-js/loader@2.3.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': + '@mdx-js/loader@2.3.0(webpack@5.97.1)': dependencies: '@mdx-js/mdx': 2.3.0 source-map: 0.7.4 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15)) + webpack: 5.97.1 transitivePeerDependencies: - supports-color @@ -19042,11 +19038,11 @@ snapshots: dependencies: fast-glob: 3.3.1 - '@next/mdx@15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))))(@mdx-js/react@2.3.0(react@19.0.0))': + '@next/mdx@15.1.6(@mdx-js/loader@2.3.0(webpack@5.97.1))(@mdx-js/react@2.3.0(react@19.0.0))': dependencies: source-map: 0.7.4 optionalDependencies: - '@mdx-js/loader': 2.3.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + '@mdx-js/loader': 2.3.0(webpack@5.97.1) '@mdx-js/react': 2.3.0(react@19.0.0) '@next/swc-darwin-arm64@15.1.6': @@ -19216,7 +19212,7 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - '@oclif/core@2.8.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)': + '@oclif/core@2.8.11(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3)': dependencies: '@types/cli-progress': 3.11.6 ansi-escapes: 4.3.2 @@ -19242,7 +19238,7 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) tslib: 2.8.1 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -19280,10 +19276,10 @@ snapshots: dependencies: '@oclif/core': 1.26.2 - '@oclif/plugin-not-found@2.3.23(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)': + '@oclif/plugin-not-found@2.3.23(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3)': dependencies: '@oclif/color': 1.0.13 - '@oclif/core': 2.8.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + '@oclif/core': 2.8.11(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) fast-levenshtein: 3.0.0 lodash: 4.17.21 transitivePeerDependencies: @@ -19308,9 +19304,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@oclif/plugin-warn-if-update-available@2.0.24(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)': + '@oclif/plugin-warn-if-update-available@2.0.24(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3)': dependencies: - '@oclif/core': 2.8.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + '@oclif/core': 2.8.11(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) chalk: 4.1.2 debug: 4.4.0(supports-color@8.1.1) fs-extra: 9.1.0 @@ -19628,7 +19624,7 @@ snapshots: dependencies: playwright: 1.50.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@4.33.0)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@4.33.0)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.40.0 @@ -19638,7 +19634,7 @@ snapshots: react-refresh: 0.14.2 schema-utils: 4.3.0 source-map: 0.7.4 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) optionalDependencies: type-fest: 4.33.0 webpack-hot-middleware: 2.26.1 @@ -20778,7 +20774,7 @@ snapshots: '@sentry/core@8.53.0': {} - '@sentry/nextjs@8.53.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': + '@sentry/nextjs@8.53.0(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 @@ -20789,7 +20785,7 @@ snapshots: '@sentry/opentelemetry': 8.53.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.28.0) '@sentry/react': 8.53.0(react@19.0.0) '@sentry/vercel-edge': 8.53.0 - '@sentry/webpack-plugin': 2.22.7(encoding@0.1.13)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + '@sentry/webpack-plugin': 2.22.7(encoding@0.1.13)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) chalk: 3.0.0 next: 15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) resolve: 1.22.8 @@ -20865,12 +20861,12 @@ snapshots: '@opentelemetry/api': 1.9.0 '@sentry/core': 8.53.0 - '@sentry/webpack-plugin@2.22.7(encoding@0.1.13)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': + '@sentry/webpack-plugin@2.22.7(encoding@0.1.13)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2))': dependencies: '@sentry/bundler-plugin-core': 2.22.7(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) transitivePeerDependencies: - encoding - supports-color @@ -21958,7 +21954,7 @@ snapshots: ts-dedent: 2.2.0 vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - '@storybook/builder-webpack5@8.5.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3)': + '@storybook/builder-webpack5@8.5.2(@swc/core@1.10.12)(esbuild@0.24.2)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)) '@types/semver': 7.5.8 @@ -21966,23 +21962,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) es-module-lexer: 1.6.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) - html-webpack-plugin: 5.6.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) + html-webpack-plugin: 5.6.3(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.0 storybook: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) - style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) - terser-webpack-plugin: 5.3.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) + terser-webpack-plugin: 5.3.11(@swc/core@1.10.12)(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) - webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) + webpack-dev-middleware: 6.1.3(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -22097,7 +22093,7 @@ snapshots: dependencies: storybook: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) - '@storybook/nextjs@8.5.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(type-fest@4.33.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': + '@storybook/nextjs@8.5.2(@swc/core@1.10.12)(esbuild@0.24.2)(next@15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(type-fest@4.33.0)(typescript@5.7.3)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2))': dependencies: '@babel/core': 7.26.7 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.7) @@ -22112,30 +22108,30 @@ snapshots: '@babel/preset-react': 7.26.3(@babel/core@7.26.7) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.7) '@babel/runtime': 7.26.7 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(type-fest@4.33.0)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) - '@storybook/builder-webpack5': 8.5.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) - '@storybook/preset-react-webpack': 8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(type-fest@4.33.0)(webpack-hot-middleware@2.26.1)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) + '@storybook/builder-webpack5': 8.5.2(@swc/core@1.10.12)(esbuild@0.24.2)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) + '@storybook/preset-react-webpack': 8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(@swc/core@1.10.12)(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) '@storybook/react': 8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) '@storybook/test': 8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)) '@types/semver': 7.5.8 - babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) - css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + babel-loader: 9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) + css-loader: 6.11.0(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) find-up: 5.0.0 image-size: 1.2.0 loader-utils: 3.3.1 next: 15.1.6(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - node-polyfill-webpack-plugin: 2.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) pnp-webpack-plugin: 1.7.0(typescript@5.7.3) postcss: 8.5.1 - postcss-loader: 8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + postcss-loader: 8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-refresh: 0.14.2 resolve-url-loader: 5.0.0 - sass-loader: 14.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + sass-loader: 14.2.1(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) semver: 7.7.0 storybook: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) - style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + style-loader: 3.3.4(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) styled-jsx: 5.1.6(@babel/core@7.26.7)(react@19.0.0) ts-dedent: 2.2.0 tsconfig-paths: 4.2.0 @@ -22143,7 +22139,7 @@ snapshots: optionalDependencies: sharp: 0.33.5 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -22162,11 +22158,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3)': + '@storybook/preset-react-webpack@8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(@swc/core@1.10.12)(esbuild@0.24.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3)': dependencies: '@storybook/core-webpack': 8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)) '@storybook/react': 8.5.2(@storybook/test@8.5.2(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10))(typescript@5.7.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) '@types/semver': 7.5.8 find-up: 5.0.0 magic-string: 0.30.17 @@ -22177,7 +22173,7 @@ snapshots: semver: 7.7.0 storybook: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) tsconfig-paths: 4.2.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -22196,7 +22192,7 @@ snapshots: dependencies: storybook: 8.5.2(bufferutil@4.0.9)(prettier@3.4.2)(utf-8-validate@5.0.10) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2))': dependencies: debug: 4.4.0(supports-color@8.1.1) endent: 2.1.0 @@ -22206,7 +22202,7 @@ snapshots: react-docgen-typescript: 2.2.2(typescript@5.7.3) tslib: 2.8.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) transitivePeerDependencies: - supports-color @@ -22705,7 +22701,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.10.12': optional: true - '@swc/core@1.10.12(@swc/helpers@0.5.15)': + '@swc/core@1.10.12': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 @@ -22720,7 +22716,6 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.10.12 '@swc/core-win32-ia32-msvc': 1.10.12 '@swc/core-win32-x64-msvc': 1.10.12 - '@swc/helpers': 0.5.15 optional: true '@swc/counter@0.1.3': {} @@ -24593,12 +24588,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + babel-loader@9.2.1(@babel/core@7.26.7)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: '@babel/core': 7.26.7 find-cache-dir: 4.0.0 schema-utils: 4.3.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) babel-plugin-istanbul@6.1.1: dependencies: @@ -25093,13 +25088,13 @@ snapshots: check-error@2.1.1: {} - checkly@4.19.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): + checkly@4.19.1(@swc/core@1.10.12)(@types/node@22.13.0)(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): dependencies: - '@oclif/core': 2.8.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + '@oclif/core': 2.8.11(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) '@oclif/plugin-help': 5.1.20 - '@oclif/plugin-not-found': 2.3.23(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + '@oclif/plugin-not-found': 2.3.23(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) '@oclif/plugin-plugins': 5.4.4 - '@oclif/plugin-warn-if-update-available': 2.0.24(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + '@oclif/plugin-warn-if-update-available': 2.0.24(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) '@typescript-eslint/typescript-estree': 6.19.0(typescript@5.7.3) acorn: 8.8.1 acorn-walk: 8.2.0 @@ -25536,7 +25531,7 @@ snapshots: css-gradient-parser@0.0.16: {} - css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + css-loader@6.11.0(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: icss-utils: 5.1.0(postcss@8.5.1) postcss: 8.5.1 @@ -25547,7 +25542,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.0 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) css-select@4.3.0: dependencies: @@ -26567,11 +26562,11 @@ snapshots: eslint-plugin-svg-jsx@1.2.4: {} - eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))): + eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))): dependencies: fast-glob: 3.3.3 postcss: 8.5.1 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) eslint-scope@5.1.1: dependencies: @@ -27360,7 +27355,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: '@babel/code-frame': 7.26.2 chalk: 4.1.2 @@ -27375,7 +27370,7 @@ snapshots: semver: 7.7.0 tapable: 2.2.1 typescript: 5.7.3 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) form-data-encoder@2.1.4: {} @@ -27847,7 +27842,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + html-webpack-plugin@5.6.3(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -27855,7 +27850,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) htmlparser2@3.10.1: dependencies: @@ -30377,7 +30372,7 @@ snapshots: node-int64@0.4.0: {} - node-polyfill-webpack-plugin@2.0.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + node-polyfill-webpack-plugin@2.0.1(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -30404,7 +30399,7 @@ snapshots: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) node-releases@2.0.19: {} @@ -31057,13 +31052,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)): + postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.5.1 - ts-node: 10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3) postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0): dependencies: @@ -31074,14 +31069,14 @@ snapshots: tsx: 4.19.2 yaml: 2.7.0 - postcss-loader@8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + postcss-loader@8.1.1(postcss@8.5.1)(typescript@5.7.3)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: cosmiconfig: 9.0.0(typescript@5.7.3) jiti: 1.21.7 postcss: 8.5.1 semver: 7.7.0 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) transitivePeerDependencies: - typescript @@ -32287,11 +32282,11 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@14.2.1(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + sass-loader@14.2.1(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: neo-async: 2.6.2 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) satori@0.12.1: dependencies: @@ -32892,9 +32887,9 @@ snapshots: structured-headers@0.4.1: {} - style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + style-loader@3.3.4(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) style-to-object@0.4.4: dependencies: @@ -33056,11 +33051,11 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -33079,7 +33074,7 @@ snapshots: postcss: 8.5.1 postcss-import: 15.1.0(postcss@8.5.1) postcss-js: 4.0.1(postcss@8.5.1) - postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3)) + postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)) postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -33141,29 +33136,18 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + terser-webpack-plugin@5.3.11(@swc/core@1.10.12)(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) optionalDependencies: - '@swc/core': 1.10.12(@swc/helpers@0.5.15) + '@swc/core': 1.10.12 esbuild: 0.24.2 - terser-webpack-plugin@5.3.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.37.0 - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15)) - optionalDependencies: - '@swc/core': 1.10.12(@swc/helpers@0.5.15) - terser-webpack-plugin@5.3.11(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -33309,7 +33293,7 @@ snapshots: ts-mixer@6.0.4: {} - ts-node@10.9.2(@swc/core@1.10.12(@swc/helpers@0.5.15))(@types/node@22.13.0)(typescript@5.7.3): + ts-node@10.9.2(@swc/core@1.10.12)(@types/node@22.13.0)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -33327,7 +33311,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.10.12(@swc/helpers@0.5.15) + '@swc/core': 1.10.12 ts-pnp@1.2.0(typescript@5.7.3): optionalDependencies: @@ -34127,7 +34111,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)): + webpack-dev-middleware@6.1.3(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -34135,7 +34119,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.0 optionalDependencies: - webpack: 5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2) + webpack: 5.97.1(@swc/core@1.10.12)(esbuild@0.24.2) webpack-hot-middleware@2.26.1: dependencies: @@ -34179,37 +34163,7 @@ snapshots: - esbuild - uglify-js - webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15)): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.0 - browserslist: 4.24.4 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2): + webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -34231,7 +34185,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.24.2)) + terser-webpack-plugin: 5.3.11(@swc/core@1.10.12)(esbuild@0.24.2)(webpack@5.97.1(@swc/core@1.10.12)(esbuild@0.24.2)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: