From f43dbb715dc3999be83b1e0c5aebb0ff96af4438 Mon Sep 17 00:00:00 2001 From: evocoder-agent Date: Thu, 22 Jan 2026 22:56:51 +0000 Subject: [PATCH 01/14] evoticketresolver: apply ticket prompt --- app/api/farcaster/route.ts | 92 ++++++++++---------------------- app/api/open-graph/ens.ts | 62 +++++++-------------- app/api/open-graph/route.ts | 23 ++++---- app/api/tiktok/route.ts | 8 ++- app/api/wikimedia-card/route.ts | 24 ++++----- lib/cache/lruTtl.ts | 33 +++++++++++- services/api/farcaster.ts | 9 +++- services/api/link-preview-api.ts | 10 +++- services/api/tiktok-preview.ts | 9 +++- services/api/wikimedia-card.ts | 11 +++- 10 files changed, 140 insertions(+), 141 deletions(-) diff --git a/app/api/farcaster/route.ts b/app/api/farcaster/route.ts index a14e29beab..63e0e15274 100644 --- a/app/api/farcaster/route.ts +++ b/app/api/farcaster/route.ts @@ -10,6 +10,7 @@ import { type UrlGuardOptions, } from "@/lib/security/urlGuard"; import { escapeRegExp } from "@/lib/text/regex"; +import LruTtlCache from "@/lib/cache/lruTtl"; import { parseFarcasterResource, type FarcasterResourceIdentifier, @@ -32,6 +33,7 @@ const CAST_CACHE_TTL_MS = 20 * 60 * 1000; const PROFILE_CACHE_TTL_MS = 24 * 60 * 60 * 1000; const CHANNEL_CACHE_TTL_MS = 24 * 60 * 60 * 1000; const FRAME_CACHE_TTL_MS = 6 * 60 * 60 * 1000; +const CACHE_MAX_ITEMS = 500; const FETCH_TIMEOUT_MS = 6000; const REDIRECT_STATUS_CODES = new Set([301, 302, 303, 307, 308]); @@ -58,50 +60,22 @@ const PUBLIC_URL_OPTIONS: UrlGuardOptions = { policy: PUBLIC_URL_POLICY, }; -type CacheEntry = { - readonly value: T; - readonly expiresAt: number; -}; - -const castCache = new Map>(); -const profileCache = new Map< - string, - CacheEntry ->(); -const channelCache = new Map< - string, - CacheEntry ->(); -const frameCache = new Map>(); - -const getCacheValue = ( - cache: Map>, - key: string -): T | undefined => { - const entry = cache.get(key); - if (!entry) { - return undefined; - } - - if (entry.expiresAt > Date.now()) { - return entry.value; - } - - cache.delete(key); - return undefined; -}; - -const setCacheValue = ( - cache: Map>, - key: string, - value: T, - ttlMs: number -): void => { - cache.set(key, { - value, - expiresAt: Date.now() + ttlMs, - }); -}; +const castCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: CAST_CACHE_TTL_MS, +}); +const profileCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: PROFILE_CACHE_TTL_MS, +}); +const channelCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: CHANNEL_CACHE_TTL_MS, +}); +const frameCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: FRAME_CACHE_TTL_MS, +}); const createAbortController = ( timeoutMs: number @@ -421,7 +395,7 @@ const mapWarpcastChannel = ( const fetchCastPreview = async ( identifier: Extract ): Promise => { - const cached = getCacheValue(castCache, identifier.canonicalUrl); + const cached = castCache.get(identifier.canonicalUrl); if (cached !== undefined) { return cached; } @@ -431,14 +405,14 @@ const fetchCastPreview = async ( }); const mapped = mapWarpcastCast(response, identifier.canonicalUrl); - setCacheValue(castCache, identifier.canonicalUrl, mapped, CAST_CACHE_TTL_MS); + castCache.set(identifier.canonicalUrl, mapped); return mapped; }; const fetchProfilePreview = async ( identifier: Extract ): Promise => { - const cached = getCacheValue(profileCache, identifier.canonicalUrl); + const cached = profileCache.get(identifier.canonicalUrl); if (cached !== undefined) { return cached; } @@ -451,19 +425,14 @@ const fetchProfilePreview = async ( ); const mapped = mapWarpcastUser(response, identifier.canonicalUrl); - setCacheValue( - profileCache, - identifier.canonicalUrl, - mapped, - PROFILE_CACHE_TTL_MS - ); + profileCache.set(identifier.canonicalUrl, mapped); return mapped; }; const fetchChannelPreview = async ( identifier: Extract ): Promise => { - const cached = getCacheValue(channelCache, identifier.canonicalUrl); + const cached = channelCache.get(identifier.canonicalUrl); if (cached !== undefined) { return cached; } @@ -476,12 +445,7 @@ const fetchChannelPreview = async ( ); const mapped = mapWarpcastChannel(response, identifier.canonicalUrl); - setCacheValue( - channelCache, - identifier.canonicalUrl, - mapped, - CHANNEL_CACHE_TTL_MS - ); + channelCache.set(identifier.canonicalUrl, mapped); return mapped; }; @@ -582,21 +546,21 @@ const fetchHtml = async ( const detectFramePreview = async ( url: URL ): Promise => { - const cached = getCacheValue(frameCache, url.toString()); + const cached = frameCache.get(url.toString()); if (cached !== undefined) { return cached; } const result = await fetchHtml(url); if (!result) { - setCacheValue(frameCache, url.toString(), null, FRAME_CACHE_TTL_MS); + frameCache.set(url.toString(), null); return null; } const { html, finalUrl } = result; if (!hasFrameMeta(html)) { - setCacheValue(frameCache, url.toString(), null, FRAME_CACHE_TTL_MS); + frameCache.set(url.toString(), null); return null; } @@ -634,7 +598,7 @@ const detectFramePreview = async ( }, }; - setCacheValue(frameCache, url.toString(), preview, FRAME_CACHE_TTL_MS); + frameCache.set(url.toString(), preview); return preview; }; diff --git a/app/api/open-graph/ens.ts b/app/api/open-graph/ens.ts index efdd83e682..e146a41f07 100644 --- a/app/api/open-graph/ens.ts +++ b/app/api/open-graph/ens.ts @@ -11,6 +11,7 @@ import { } from "@/components/waves/ens/types"; import type { EnsTarget } from "@/lib/ens/detect"; import { stripHtmlTags } from "@/lib/text/html"; +import LruTtlCache from "@/lib/cache/lruTtl"; import { ens_normalize } from "@adraffy/ens-normalize"; import * as contentHash from "@ensdomains/content-hash"; import { toUnicode } from "punycode"; @@ -95,15 +96,20 @@ const publicClient = createPublicClient({ const NAME_CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes const ADDRESS_CACHE_TTL_MS = 15 * 60 * 1000; // 15 minutes const OWNERSHIP_CACHE_TTL_MS = 4 * 60 * 60 * 1000; // 4 hours +const CACHE_MAX_ITEMS = 500; -interface CacheEntry { - readonly expiresAt: number; - readonly data: T; -} - -const nameCache = new Map>(); -const addressCache = new Map>(); -const ownershipCache = new Map>(); +const nameCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: NAME_CACHE_TTL_MS, +}); +const addressCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: ADDRESS_CACHE_TTL_MS, +}); +const ownershipCache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: OWNERSHIP_CACHE_TTL_MS, +}); export class EnsPreviewError extends Error { readonly status: number; @@ -118,34 +124,6 @@ type ContenthashResult = EnsContenthash | null; type NullableAddress = string | null | undefined; -function now(): number { - return Date.now(); -} - -function fromCache( - cache: Map>, - key: string -): T | null { - const entry = cache.get(key); - if (!entry) { - return null; - } - if (entry.expiresAt <= now()) { - cache.delete(key); - return null; - } - return entry.data; -} - -function storeCache( - cache: Map>, - key: string, - data: T, - ttlMs: number -): void { - cache.set(key, { data, expiresAt: now() + ttlMs }); -} - function normalizeEnsName(name: string): { normalized: string; display: string; @@ -353,7 +331,7 @@ async function loadOwnership( node: Hex ): Promise { const cacheKey = normalized.toLowerCase(); - const cached = fromCache(ownershipCache, cacheKey); + const cached = ownershipCache.get(cacheKey); if (cached) { return cached; } @@ -443,7 +421,7 @@ async function loadOwnership( ...(gracePeriodEnds === null ? {} : { gracePeriodEnds }), }; - storeCache(ownershipCache, cacheKey, ownership, OWNERSHIP_CACHE_TTL_MS); + ownershipCache.set(cacheKey, ownership); return ownership; } @@ -469,7 +447,7 @@ async function fetchTextRecords( async function fetchEnsName(input: string): Promise { const cacheKey = input.toLowerCase(); - const cached = fromCache(nameCache, cacheKey); + const cached = nameCache.get(cacheKey); if (cached) { return cached; } @@ -538,14 +516,14 @@ async function fetchEnsName(input: string): Promise { links: createLinksForName(normalized, address), }; - storeCache(nameCache, cacheKey, preview, NAME_CACHE_TTL_MS); + nameCache.set(cacheKey, preview); return preview; } async function fetchEnsAddress(address: string): Promise { const cacheKey = address.toLowerCase(); - const cached = fromCache(addressCache, cacheKey); + const cached = addressCache.get(cacheKey); if (cached) { return cached; } @@ -589,7 +567,7 @@ async function fetchEnsAddress(address: string): Promise { links: createLinksForAddress(checksummed), }; - storeCache(addressCache, cacheKey, preview, ADDRESS_CACHE_TTL_MS); + addressCache.set(cacheKey, preview); return preview; } diff --git a/app/api/open-graph/route.ts b/app/api/open-graph/route.ts index 0fc7b29f8a..9b843ae695 100644 --- a/app/api/open-graph/route.ts +++ b/app/api/open-graph/route.ts @@ -8,6 +8,7 @@ import { parsePublicUrl, type UrlGuardOptions, } from "@/lib/security/urlGuard"; +import LruTtlCache from "@/lib/cache/lruTtl"; import type { LinkPreviewResponse } from "@/services/api/link-preview-api"; import { HTML_ACCEPT_HEADER, @@ -19,6 +20,7 @@ import { createCompoundPlan, type PreviewPlan } from "./compound/service"; import { detectEnsTarget, fetchEnsPreview, EnsPreviewError } from "./ens"; const CACHE_TTL_MS = 5 * 60 * 1000; +const CACHE_MAX_ITEMS = 500; const FETCH_TIMEOUT_MS = 8000; const USER_AGENT = LINK_PREVIEW_USER_AGENT; const MAX_REDIRECTS = 5; @@ -122,12 +124,10 @@ function createFetchConfig(url: URL): { }; } -type CacheEntry = { - readonly expiresAt: number; - readonly data: LinkPreviewResponse; -}; - -const cache = new Map(); +const cache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: CACHE_TTL_MS, +}); const isUrlGuardError = (error: unknown): error is UrlGuardError => error instanceof UrlGuardError || @@ -329,18 +329,13 @@ export async function GET(request: NextRequest) { const cached = cache.get(plan.cacheKey); - if (cached && cached.expiresAt > Date.now()) { - return NextResponse.json(cached.data); + if (cached) { + return NextResponse.json(cached); } try { const { data, ttl } = await plan.execute(); - const entry: CacheEntry = { - data, - expiresAt: Date.now() + ttl, - }; - - cache.set(plan.cacheKey, entry); + cache.set(plan.cacheKey, data, ttl); return NextResponse.json(data); } catch (error) { diff --git a/app/api/tiktok/route.ts b/app/api/tiktok/route.ts index e400cffec7..ab1bf92610 100644 --- a/app/api/tiktok/route.ts +++ b/app/api/tiktok/route.ts @@ -7,6 +7,7 @@ import { fetchPublicUrl, parsePublicUrl, } from "@/lib/security/urlGuard"; +import LruTtlCache from "@/lib/cache/lruTtl"; import { decodeHtmlEntities, replaceHtmlBreaksWithNewlines, @@ -20,6 +21,8 @@ import type { } from "@/services/api/tiktok-preview"; const CACHE_TTL_MS = 24 * 60 * 60 * 1000; +const CACHE_STALE_TTL_MS = 3 * CACHE_TTL_MS; +const CACHE_MAX_ITEMS = 500; const FETCH_TIMEOUT_MS = 8000; const USER_AGENT = "6529seize-tiktok-preview/1.0 (+https://6529.io; Fetching public TikTok oEmbed data)"; @@ -56,7 +59,10 @@ type CacheEntry = { revalidating: boolean; }; -const cache = new Map(); +const cache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: CACHE_STALE_TTL_MS, +}); const revalidating = new Set(); const TRACKING_PARAM_PREFIXES = ["utm_", "is_from_", "share_"]; diff --git a/app/api/wikimedia-card/route.ts b/app/api/wikimedia-card/route.ts index 2f583dca30..a2c0d2f2fd 100644 --- a/app/api/wikimedia-card/route.ts +++ b/app/api/wikimedia-card/route.ts @@ -16,17 +16,12 @@ import { type UrlGuardHostPolicy, } from "@/lib/security/urlGuard"; import { sanitizeHtmlToText } from "@/lib/text/html"; +import LruTtlCache from "@/lib/cache/lruTtl"; const USER_AGENT = "6529seize-wikimedia-preview/1.0 (+https://6529.io)"; const REQUEST_TIMEOUT_MS = 8000; const SHORT_LINK_MAX_REDIRECTS = 5; - -type CacheEntry = { - readonly data: WikimediaCardResponse; - readonly expiresAt: number; -}; - -const cache = new Map(); +const CACHE_MAX_ITEMS = 1000; const TTL_BY_KIND: Record = { article: 24 * 60 * 60 * 1000, @@ -36,6 +31,11 @@ const TTL_BY_KIND: Record = { unavailable: 60 * 60 * 1000, }; +const cache = new LruTtlCache({ + max: CACHE_MAX_ITEMS, + ttlMs: TTL_BY_KIND.unavailable, +}); + interface SummaryTarget { readonly type: "summary"; readonly host: string; @@ -1201,10 +1201,9 @@ export async function GET(request: NextRequest) { } const cacheKey = sanitizeCacheKey(targetUrl); - const now = Date.now(); const cached = cache.get(cacheKey); - if (cached && cached.expiresAt > now) { - return NextResponse.json(cached.data); + if (cached) { + return NextResponse.json(cached); } const languages = parseAcceptLanguage(request.headers.get("accept-language")); @@ -1220,10 +1219,9 @@ export async function GET(request: NextRequest) { const card = await buildCard(target, languages); const ttl = TTL_BY_KIND[card.kind] ?? TTL_BY_KIND.unavailable; - const entry: CacheEntry = { data: card, expiresAt: now + ttl }; - cache.set(cacheKey, entry); - cache.set(card.canonicalUrl, entry); + cache.set(cacheKey, card, ttl); + cache.set(card.canonicalUrl, card, ttl); return NextResponse.json(card); } diff --git a/lib/cache/lruTtl.ts b/lib/cache/lruTtl.ts index f478834692..d09801020e 100644 --- a/lib/cache/lruTtl.ts +++ b/lib/cache/lruTtl.ts @@ -37,8 +37,30 @@ export default class LruTtlCache { return entry.value; } - set(key: K, value: V): void { - const expiresAt = Date.now() + this.ttlMs; + has(key: K): boolean { + const entry = this.map.get(key); + if (!entry) { + return false; + } + + if (Date.now() > entry.expiresAt) { + this.map.delete(key); + return false; + } + + return true; + } + + delete(key: K): boolean { + return this.map.delete(key); + } + + clear(): void { + this.map.clear(); + } + + set(key: K, value: V, ttlMs?: number): void { + const expiresAt = Date.now() + this.normalizeTtlMs(ttlMs); if (this.map.has(key)) { this.map.delete(key); } @@ -47,6 +69,13 @@ export default class LruTtlCache { this.prune(); } + private normalizeTtlMs(ttlMs: number | undefined): number { + if (typeof ttlMs === "number" && Number.isFinite(ttlMs)) { + return Math.max(1000, ttlMs); + } + return this.ttlMs; + } + private prune(): void { const now = Date.now(); for (const key of Array.from(this.map.keys())) { diff --git a/services/api/farcaster.ts b/services/api/farcaster.ts index cf8bea8435..4d633fecf2 100644 --- a/services/api/farcaster.ts +++ b/services/api/farcaster.ts @@ -1,6 +1,13 @@ import type { FarcasterPreviewResponse } from "@/types/farcaster.types"; +import LruTtlCache from "@/lib/cache/lruTtl"; -const previewCache = new Map>(); +const FARCASTER_PREVIEW_CACHE_TTL_MS = 5 * 60 * 1000; +const FARCASTER_PREVIEW_CACHE_MAX_ITEMS = 200; + +const previewCache = new LruTtlCache>({ + max: FARCASTER_PREVIEW_CACHE_MAX_ITEMS, + ttlMs: FARCASTER_PREVIEW_CACHE_TTL_MS, +}); const normalizeUrl = (url: string): string => url.trim(); diff --git a/services/api/link-preview-api.ts b/services/api/link-preview-api.ts index 6bbe7c3500..b8e38c3e3e 100644 --- a/services/api/link-preview-api.ts +++ b/services/api/link-preview-api.ts @@ -1,3 +1,5 @@ +import LruTtlCache from "@/lib/cache/lruTtl"; + interface LinkPreviewMedia { readonly url?: string | null | undefined; readonly secureUrl?: string | null | undefined; @@ -74,7 +76,13 @@ export type LinkPreviewResponse = | GenericLinkPreviewResponse | GoogleWorkspaceLinkPreview; -const linkPreviewCache = new Map>(); +const LINK_PREVIEW_CACHE_TTL_MS = 5 * 60 * 1000; +const LINK_PREVIEW_CACHE_MAX_ITEMS = 200; + +const linkPreviewCache = new LruTtlCache>({ + max: LINK_PREVIEW_CACHE_MAX_ITEMS, + ttlMs: LINK_PREVIEW_CACHE_TTL_MS, +}); const normalizeUrl = (url: string): string => url.trim(); diff --git a/services/api/tiktok-preview.ts b/services/api/tiktok-preview.ts index fa17f7a296..502981a4f8 100644 --- a/services/api/tiktok-preview.ts +++ b/services/api/tiktok-preview.ts @@ -1,5 +1,9 @@ +import LruTtlCache from "@/lib/cache/lruTtl"; + const CACHE_TTL_MS = 24 * 60 * 60 * 1000; const MAX_CACHE_ENTRIES = 50; +const MAX_ALIAS_ENTRIES = MAX_CACHE_ENTRIES * 4; +const ALIAS_TTL_MS = CACHE_TTL_MS * 3; export type TikTokPreviewKind = "video" | "profile"; @@ -31,7 +35,10 @@ type CacheEntry = { }; const cache = new Map(); -const aliasMap = new Map(); +const aliasMap = new LruTtlCache({ + max: MAX_ALIAS_ENTRIES, + ttlMs: ALIAS_TTL_MS, +}); const requests = new Map>(); function getCacheKey(url: string): string { diff --git a/services/api/wikimedia-card.ts b/services/api/wikimedia-card.ts index 81b450c07f..72cdaed4ff 100644 --- a/services/api/wikimedia-card.ts +++ b/services/api/wikimedia-card.ts @@ -1,3 +1,5 @@ +import LruTtlCache from "@/lib/cache/lruTtl"; + export type WikimediaSource = "wikipedia" | "wikimedia-commons" | "wikidata"; export interface WikimediaImage { @@ -86,7 +88,13 @@ export type WikimediaCardResponse = | WikimediaWikidataCard | WikimediaUnavailableCard; -const wikimediaCache = new Map>(); +const WIKIMEDIA_CARD_CACHE_TTL_MS = 5 * 60 * 1000; +const WIKIMEDIA_CARD_CACHE_MAX_ITEMS = 200; + +const wikimediaCache = new LruTtlCache>({ + max: WIKIMEDIA_CARD_CACHE_MAX_ITEMS, + ttlMs: WIKIMEDIA_CARD_CACHE_TTL_MS, +}); const normalizeUrl = (url: string): string => url.trim(); @@ -135,4 +143,3 @@ export const fetchWikimediaCard = async ( return requestPromise; }; - From dca85c7a851103a153bd6ca256c7764d16f455cd Mon Sep 17 00:00:00 2001 From: Simo Date: Fri, 23 Jan 2026 08:15:52 +0100 Subject: [PATCH 02/14] wip Signed-off-by: Simo --- .../drops/WaveCreatorPreviewModalContent.tsx | 1 + hooks/useWaves.ts | 56 +++--- package-lock.json | 186 +++++++++--------- 3 files changed, 119 insertions(+), 124 deletions(-) diff --git a/components/waves/drops/WaveCreatorPreviewModalContent.tsx b/components/waves/drops/WaveCreatorPreviewModalContent.tsx index ffd55c6122..6e352392de 100644 --- a/components/waves/drops/WaveCreatorPreviewModalContent.tsx +++ b/components/waves/drops/WaveCreatorPreviewModalContent.tsx @@ -36,6 +36,7 @@ export const WaveCreatorPreviewModalContent: React.FC< identity, waveName: null, enabled: isOpen, + directMessage: false, }); const onBottomIntersection = (state: boolean) => { diff --git a/hooks/useWaves.ts b/hooks/useWaves.ts index 0c937d5e38..0048d84eef 100644 --- a/hooks/useWaves.ts +++ b/hooks/useWaves.ts @@ -2,7 +2,7 @@ import { useInfiniteQuery } from "@tanstack/react-query"; -import { useContext, useEffect, useState } from "react"; +import { useContext, useMemo, useState } from "react"; import { useDebounce } from "react-use"; import { AuthContext } from "@/components/auth/Auth"; @@ -16,6 +16,7 @@ interface SearchWavesParams { readonly limit: number; readonly serial_no_less_than?: number | undefined; readonly group_id?: string | undefined; + readonly direct_message?: boolean | undefined; } interface UseWavesParams { @@ -24,6 +25,7 @@ interface UseWavesParams { readonly limit?: number | undefined; readonly refetchInterval?: number | undefined; readonly enabled?: boolean | undefined; + readonly directMessage?: boolean | undefined; } export function useWaves({ @@ -32,29 +34,25 @@ export function useWaves({ limit = 20, refetchInterval = Infinity, enabled = true, + directMessage, }: UseWavesParams) { const { connectedProfile, activeProfileProxy } = useContext(AuthContext); - const getUsePublicWaves = () => - !connectedProfile?.handle || !!activeProfileProxy; - const [usePublicWaves, setUsePublicWaves] = useState(getUsePublicWaves()); - useEffect( - () => setUsePublicWaves(getUsePublicWaves()), - [connectedProfile, activeProfileProxy] - ); - - const getParams = (): SearchWavesParams => ({ - author: identity ?? undefined, - name: waveName ?? undefined, - limit, - }); + const usePublicWaves = !connectedProfile?.handle || !!activeProfileProxy; - const [params, setParams] = useState(getParams()); - useEffect(() => setParams(getParams()), [identity, waveName]); + const params = useMemo( + () => ({ + author: identity ?? undefined, + name: waveName ?? undefined, + limit, + direct_message: directMessage, + }), + [identity, waveName, limit, directMessage] + ); const [debouncedParams, setDebouncedParams] = useState(params); - useDebounce(() => setDebouncedParams(params), 200, [params]); + useDebounce(() => setDebouncedParams(params), 200, [params]); const authQuery = useInfiniteQuery({ queryKey: [QueryKey.WAVES, debouncedParams], @@ -62,7 +60,7 @@ export function useWaves({ const queryParams: Record = {}; queryParams["limit"] = `${limit}`; - if (pageParam) { + if (typeof pageParam === "number") { queryParams["serial_no_less_than"] = `${pageParam}`; } if (debouncedParams.author) { @@ -71,6 +69,9 @@ export function useWaves({ if (debouncedParams.name) { queryParams["name"] = debouncedParams.name; } + if (debouncedParams.direct_message !== undefined) { + queryParams["direct_message"] = `${debouncedParams.direct_message}`; + } return await commonApiFetch({ endpoint: `waves`, params: queryParams, @@ -87,7 +88,7 @@ export function useWaves({ queryKey: [QueryKey.WAVES_PUBLIC, debouncedParams], queryFn: async ({ pageParam }: { pageParam: number | null }) => { const queryParams: Record = {}; - if (pageParam) { + if (typeof pageParam === "number") { queryParams["serial_no_less_than"] = `${pageParam}`; } if (debouncedParams.author) { @@ -96,6 +97,9 @@ export function useWaves({ if (debouncedParams.name) { queryParams["name"] = debouncedParams.name; } + if (debouncedParams.direct_message !== undefined) { + queryParams["direct_message"] = `${debouncedParams.direct_message}`; + } return await commonApiFetch({ endpoint: `waves-public`, params: queryParams, @@ -108,20 +112,14 @@ export function useWaves({ ...getDefaultQueryRetry(), }); - const getWaves = (): ApiWave[] => { + const waves = useMemo(() => { + if (!enabled) { + return []; + } if (usePublicWaves) { return publicQuery.data?.pages.flat() ?? []; } return authQuery.data?.pages.flat() ?? []; - }; - - const [waves, setWaves] = useState(getWaves()); - useEffect(() => { - if (!enabled) { - setWaves([]); - return; - } - setWaves(getWaves()); }, [enabled, authQuery.data, publicQuery.data, usePublicWaves]); const activeQuery = usePublicWaves ? publicQuery : authQuery; diff --git a/package-lock.json b/package-lock.json index 49068b81df..2a7f552b75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -345,6 +345,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -980,6 +981,7 @@ "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.4.1.tgz", "integrity": "sha512-0ap4FzPJItaeg3QiiS1WguPNHY2aD67fQ9wr7DojCRzTFuNXQPvFB6lBkqlrVeQyJ9jCw0KV/LXv25oXjDcsyA==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -1063,6 +1065,7 @@ "resolved": "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-4.3.6.tgz", "integrity": "sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@noble/hashes": "1.4.0", "clsx": "1.2.1", @@ -1914,6 +1917,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.7.2" }, @@ -1963,6 +1967,7 @@ "resolved": "https://registry.npmjs.org/@gemini-wallet/core/-/core-0.3.2.tgz", "integrity": "sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==", "license": "MIT", + "peer": true, "dependencies": { "@metamask/rpc-errors": "7.0.2", "eventemitter3": "5.0.1" @@ -3857,7 +3862,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -4620,6 +4624,7 @@ "version": "0.33.1", "resolved": "https://registry.npmjs.org/@metamask/sdk/-/sdk-0.33.1.tgz", "integrity": "sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==", + "peer": true, "dependencies": { "@babel/runtime": "^7.26.0", "@metamask/onboarding": "^1.0.1", @@ -4685,6 +4690,7 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "license": "MIT", + "peer": true, "dependencies": { "node-fetch": "^2.7.0" } @@ -4856,6 +4862,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.9.tgz", "integrity": "sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==", "license": "MIT", + "peer": true, "dependencies": { "file-type": "21.1.0", "iterare": "1.2.1", @@ -5072,6 +5079,7 @@ "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -5244,6 +5252,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -5265,6 +5274,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.19.0 || >=20.6.0" }, @@ -5277,6 +5287,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -5292,6 +5303,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.208.0", "import-in-the-middle": "^2.0.0", @@ -5679,6 +5691,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5695,6 +5708,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.2.0.tgz", "integrity": "sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/resources": "2.2.0", @@ -5712,6 +5726,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=14" } @@ -6384,6 +6399,7 @@ "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright": "1.57.0" }, @@ -6399,6 +6415,7 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -8499,6 +8516,7 @@ "resolved": "https://registry.npmjs.org/@solana/kit/-/kit-3.0.3.tgz", "integrity": "sha512-CEEhCDmkvztd1zbgADsEQhmj9GyWOOGeW1hZD+gtwbBSF5YN1uofS/pex5MIh/VIqKRj+A2UnYWI1V+9+q/lyQ==", "license": "MIT", + "peer": true, "dependencies": { "@solana/accounts": "3.0.3", "@solana/addresses": "3.0.3", @@ -9101,6 +9119,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", "integrity": "sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -9111,6 +9130,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.11.tgz", "integrity": "sha512-3uyzz01D1fkTLXuxF3JfoJoHQMU2fxsfJwE+6N5hHy0dVNoZOvwKP8Z2k7k1KDeD54N20apcJnG75TBAStIrBA==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.11" }, @@ -9323,8 +9343,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -9394,7 +9413,6 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -9405,7 +9423,6 @@ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -9751,6 +9768,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -9809,6 +9827,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.3.tgz", "integrity": "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -9818,6 +9837,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -9943,6 +9963,7 @@ "integrity": "sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.48.0", @@ -9983,6 +10004,7 @@ "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.0", "@typescript-eslint/types": "8.48.0", @@ -10615,7 +10637,6 @@ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.0.tgz", "integrity": "sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20.0" }, @@ -10710,6 +10731,7 @@ "integrity": "sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==", "deprecated": "Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases", "license": "Apache-2.0", + "peer": true, "dependencies": { "@reown/appkit": "1.7.8", "@walletconnect/jsonrpc-http-connection": "1.0.8", @@ -11817,6 +11839,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -12321,7 +12344,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -12331,29 +12353,25 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -12364,15 +12382,13 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12385,7 +12401,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -12395,7 +12410,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -12404,15 +12418,13 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12429,7 +12441,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -12443,7 +12454,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -12456,7 +12466,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -12471,7 +12480,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -12487,15 +12495,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -12531,6 +12537,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12563,7 +12570,6 @@ "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" }, @@ -12646,7 +12652,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12664,7 +12669,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -12680,8 +12684,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/ansi-escapes": { "version": "4.3.2", @@ -13118,6 +13121,7 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", + "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -13207,6 +13211,7 @@ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.26.0" } @@ -13487,6 +13492,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -13569,6 +13575,7 @@ "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -13850,6 +13857,7 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -13940,7 +13948,6 @@ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.0" } @@ -15175,8 +15182,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -15315,6 +15321,7 @@ "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.16.tgz", "integrity": "sha512-dS5cbA9rA2VR4Ybuvhg6jvdmp46ubLn3E+px8cG/35aEDNclrqoCjg6mt0HYZ/M+OoESS3jSkCrqk1kWAEhWAw==", "license": "MIT", + "peer": true, "dependencies": { "@ecies/ciphers": "^0.2.4", "@noble/ciphers": "^1.3.0", @@ -15362,7 +15369,8 @@ "version": "5.6.0", "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/emoji-regex": { "version": "10.6.0", @@ -15463,7 +15471,6 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15622,8 +15629,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -15799,6 +15805,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -16000,6 +16007,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -16772,7 +16780,8 @@ "version": "6.4.9", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/eventemitter3": { "version": "5.0.1", @@ -16975,8 +16984,7 @@ "url": "https://opencollective.com/fastify" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/fastest-stable-stringify": { "version": "2.0.2", @@ -17596,8 +17604,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/minimatch": { "version": "10.1.1", @@ -19101,7 +19108,6 @@ "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", "license": "MIT", - "peer": true, "funding": { "type": "GitHub Sponsors ❤", "url": "https://github.com/sponsors/dmonad" @@ -23026,7 +23032,6 @@ "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.114.tgz", "integrity": "sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==", "license": "MIT", - "peer": true, "dependencies": { "isomorphic.js": "^0.2.4" }, @@ -23125,7 +23130,6 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.11.5" }, @@ -23228,7 +23232,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -24509,6 +24512,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-16.1.3.tgz", "integrity": "sha512-gthG3TRD+E3/mA0uDQb9lqBmx1zVosq5kIwxNN6+MRNd085GzD+9VXMPUs+GGZCbZ+GDZdODUq4Pm7CTXK6ipw==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "16.1.3", "@swc/helpers": "0.5.15", @@ -25898,6 +25902,7 @@ "resolved": "https://registry.npmjs.org/porto/-/porto-0.2.35.tgz", "integrity": "sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==", "license": "MIT", + "peer": true, "dependencies": { "hono": "^4.10.3", "idb-keyval": "^6.2.1", @@ -26058,6 +26063,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -26090,6 +26096,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -26250,6 +26257,7 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -26345,7 +26353,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -26361,7 +26368,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -26374,8 +26380,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/prismjs": { "version": "1.30.0", @@ -26446,6 +26451,7 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -26790,7 +26796,6 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -26800,6 +26805,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -26850,6 +26856,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -26922,6 +26929,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", "license": "MIT", + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -27114,6 +27122,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -27174,7 +27183,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -27202,7 +27212,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", @@ -27384,7 +27395,6 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -27545,6 +27555,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -27686,6 +27697,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -27794,6 +27806,7 @@ "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.2.tgz", "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -27861,7 +27874,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -27898,7 +27910,6 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -27910,8 +27921,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/screenfull": { "version": "5.2.0", @@ -27978,7 +27988,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -28332,6 +28341,7 @@ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", "license": "MIT", + "peer": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", @@ -29107,6 +29117,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -29172,6 +29183,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -29218,29 +29230,11 @@ } } }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -29254,7 +29248,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -29273,7 +29266,6 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "license": "MIT", - "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -29308,7 +29300,6 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "license": "MIT", - "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -29323,7 +29314,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -29338,15 +29328,13 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -29452,7 +29440,8 @@ "version": "0.163.0", "resolved": "https://registry.npmjs.org/three/-/three-0.163.0.tgz", "integrity": "sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/throttle-debounce": { "version": "3.0.1", @@ -29868,7 +29857,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.21.0", @@ -29876,6 +29866,7 @@ "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -30491,6 +30482,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -31021,6 +31013,7 @@ "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -31080,6 +31073,7 @@ "resolved": "https://registry.npmjs.org/valtio/-/valtio-2.1.7.tgz", "integrity": "sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg==", "license": "MIT", + "peer": true, "dependencies": { "proxy-compare": "^3.0.1" }, @@ -31138,6 +31132,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@noble/curves": "1.9.1", "@noble/hashes": "1.8.0", @@ -31280,6 +31275,7 @@ "resolved": "https://registry.npmjs.org/wagmi/-/wagmi-2.19.5.tgz", "integrity": "sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==", "license": "MIT", + "peer": true, "dependencies": { "@wagmi/connectors": "6.2.0", "@wagmi/core": "2.22.1", @@ -31335,6 +31331,7 @@ "resolved": "https://registry.npmjs.org/@wagmi/core/-/core-2.22.1.tgz", "integrity": "sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==", "license": "MIT", + "peer": true, "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", @@ -31362,6 +31359,7 @@ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "license": "MIT", + "peer": true, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -31429,7 +31427,6 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "license": "MIT", - "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -31474,7 +31471,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.103.0.tgz", "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -31538,7 +31534,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -31552,7 +31547,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -31775,6 +31769,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -31927,6 +31922,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From f99e545d8a4baacf2f22df2abf057bad0c5ea299 Mon Sep 17 00:00:00 2001 From: Simo Date: Fri, 23 Jan 2026 08:38:41 +0100 Subject: [PATCH 03/14] wip Signed-off-by: Simo --- components/home/HomePageContent.tsx | 2 ++ components/home/HomePageTextSection.tsx | 29 +++++++++++++++++++++++++ package.json | 6 ++--- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 components/home/HomePageTextSection.tsx diff --git a/components/home/HomePageContent.tsx b/components/home/HomePageContent.tsx index 76d46f3a08..4ce82571ba 100644 --- a/components/home/HomePageContent.tsx +++ b/components/home/HomePageContent.tsx @@ -5,12 +5,14 @@ import { NowMintingSection } from "./now-minting"; import { NextMintLeadingSection } from "./next-mint-leading"; import { BoostedSection } from "./boosted"; import { ExploreWavesSection } from "./explore-waves"; +import HomePageTextSection from "./HomePageTextSection"; export default function HomePageContent() { return (
+
diff --git a/components/home/HomePageTextSection.tsx b/components/home/HomePageTextSection.tsx new file mode 100644 index 0000000000..1d1a2fc031 --- /dev/null +++ b/components/home/HomePageTextSection.tsx @@ -0,0 +1,29 @@ +export default function HomePageTextSection() { + return ( +
+
+
+
+
+
+
+
+

+ 6529 is a network society: a decentralized, permissionless global + network that funds, builds, and coordinates public-goods work + across art, science, culture, and technology. +

+

+ We're extending what Bitcoin and Ethereum proved for money and + code to human coordination itself, so any activity can be + organized permissionlessly. +

+

+ The long-term goal is nation-scale positive impact. +

+
+
+
+
+ ); +} diff --git a/package.json b/package.json index 54a26bb372..ea23bf70eb 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "prebuild": "npm run build:env-schema && npm run generate", "postbuild": "next-sitemap --config next-sitemap.config.ts", "start": "next start -p 3001", - "test": "jest --silent --verbose=false --coverageReporters=none", - "test-json": "jest --silent --json --outputFile=test-results/jest-results.json --forceExit ; npm run test-extract-failed-names", - "test-json-changed": "jest --silent --json --outputFile=test-results/jest-results.json --changedSince=main --coverage=false --forceExit ; npm run test-extract-failed-names", + "test": "cross-env NODE_ENV=test jest --silent --verbose=false --coverageReporters=none", + "test-json": "cross-env NODE_ENV=test jest --silent --json --outputFile=test-results/jest-results.json --forceExit ; npm run test-extract-failed-names", + "test-json-changed": "cross-env NODE_ENV=test jest --silent --json --outputFile=test-results/jest-results.json --changedSince=main --coverage=false --forceExit ; npm run test-extract-failed-names", "test-extract-failed-names": "node test-results/list-failed-tests.cjs", "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", From 11e8c386cf5625143b4675dcd5f6db222f975ec5 Mon Sep 17 00:00:00 2001 From: ragnep Date: Fri, 23 Jan 2026 16:19:08 +0200 Subject: [PATCH 04/14] wip Signed-off-by: ragnep --- components/home/HomePageContent.tsx | 3 +- components/home/HomePageTextSection.tsx | 46 +++-- components/home/boosted/BoostedSection.tsx | 16 +- .../home/explore-waves/ExploreWaveCard.tsx | 10 +- .../explore-waves/ExploreWaveCardSkeleton.tsx | 2 +- .../explore-waves/ExploreWavesSection.tsx | 2 +- components/home/hero/HeroHeader.tsx | 2 +- .../home/next-mint-leading/LeadingCard.tsx | 13 +- .../home/next-mint-leading/NextMintCard.tsx | 13 +- .../NextMintLeadingSection.tsx | 13 +- .../home/now-minting/NowMintingSection.tsx | 6 +- .../home/now-minting/NowMintingStatsItem.tsx | 4 +- components/the-memes/ArtistProfileHandle.tsx | 6 +- package-lock.json | 186 +++++++++--------- 14 files changed, 168 insertions(+), 154 deletions(-) diff --git a/components/home/HomePageContent.tsx b/components/home/HomePageContent.tsx index f1ec0e9b19..3f1368cc8d 100644 --- a/components/home/HomePageContent.tsx +++ b/components/home/HomePageContent.tsx @@ -12,8 +12,9 @@ export default function HomePageContent() {
+ - +
diff --git a/components/home/HomePageTextSection.tsx b/components/home/HomePageTextSection.tsx index 1d1a2fc031..1daeb9cd65 100644 --- a/components/home/HomePageTextSection.tsx +++ b/components/home/HomePageTextSection.tsx @@ -1,27 +1,37 @@ export default function HomePageTextSection() { return ( -
-
-
-
-
-
-
-
-

- 6529 is a network society: a decentralized, permissionless global - network that funds, builds, and coordinates public-goods work - across art, science, culture, and technology. -

-

- We're extending what Bitcoin and Ethereum proved for money and - code to human coordination itself, so any activity can be - organized permissionlessly. +

+
+
+
+
+

+ 6529 is a network society: +

+
+
+

+ a decentralized, permissionless global network that funds, builds, + and coordinates public-goods work across art, science, culture, + and technology.

-

+

The long-term goal is nation-scale positive impact.

+
+
+
+
+
+

+ We're extending what Bitcoin and Ethereum proved for money and + code to human coordination itself, so any activity can be + organized permissionlessly. +

+
+
+
diff --git a/components/home/boosted/BoostedSection.tsx b/components/home/boosted/BoostedSection.tsx index d4d8b02204..b99cc53cc8 100644 --- a/components/home/boosted/BoostedSection.tsx +++ b/components/home/boosted/BoostedSection.tsx @@ -38,8 +38,10 @@ export function BoostedSection() { if (isLoading) { return ( -
-
+
+
+
+
Loading...
@@ -53,15 +55,17 @@ export function BoostedSection() { } return ( -
-
+
+
+
+
- + Boosted Drops
-

+

Community-boosted right now

diff --git a/components/home/explore-waves/ExploreWaveCard.tsx b/components/home/explore-waves/ExploreWaveCard.tsx index 2cf35c5716..6c3bef0a0a 100644 --- a/components/home/explore-waves/ExploreWaveCard.tsx +++ b/components/home/explore-waves/ExploreWaveCard.tsx @@ -8,7 +8,7 @@ import { getScaledImageUri, ImageScale } from "@/helpers/image.helpers"; import { getWaveRoute } from "@/helpers/navigation.helpers"; import Image from "next/image"; import Link from "next/link"; -import { ChatBubbleLeftIcon } from "@heroicons/react/24/outline"; +import { ChatBubbleBottomCenterIcon } from "@heroicons/react/24/outline"; import { extractDropPreview, useWaveLatestDrop } from "./useWaveLatestDrop"; interface ExploreWaveCardProps { @@ -52,7 +52,7 @@ export function ExploreWaveCard({ wave }: ExploreWaveCardProps) { >
{wave.picture && ( @@ -89,9 +89,9 @@ export function ExploreWaveCard({ wave }: ExploreWaveCardProps) { )} {hasDrops && ( -
-
- +
+