refactor: upgrade snort libs

This commit is contained in:
Kieran 2024-01-15 12:22:19 +00:00
parent 0eb9c56442
commit 5c1a143a7d
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
20 changed files with 97 additions and 198 deletions

View File

@ -13,11 +13,11 @@
"@radix-ui/react-toggle": "^1.0.3",
"@react-hook/resize-observer": "^1.2.6",
"@scure/base": "^1.1.3",
"@snort/shared": "^1.0.10",
"@snort/system": "^1.1.8",
"@snort/system-react": "^1.1.8",
"@snort/shared": "^1.0.11",
"@snort/system": "^1.2.0",
"@snort/system-react": "^1.2.0",
"@snort/system-wasm": "^1.0.1",
"@snort/system-web": "^1.0.2",
"@snort/system-web": "^1.0.4",
"@szhsin/react-menu": "^4.0.2",
"@types/webscopeio__react-textarea-autocomplete": "^4.7.2",
"@void-cat/api": "^1.0.7",

View File

@ -7,8 +7,8 @@ import { Goal } from "./goal";
import { Note } from "./note";
import { EmojiPack } from "./emoji-pack";
import { Badge } from "./badge";
import { useEvent } from "@/hooks/event";
import { EMOJI_PACK, GOAL } from "@/const";
import { useEventFeed } from "@snort/system-react";
interface EventProps {
link: NostrLink;
@ -71,6 +71,6 @@ export function NostrEvent({ ev }: { ev: NostrEventType }) {
}
export function Event({ link }: EventProps) {
const event = useEvent(link);
const event = useEventFeed(link);
return event ? <NostrEvent ev={event} /> : null;
}

View File

@ -11,8 +11,8 @@ import type { NostrLink } from "@snort/system";
import { Mention } from "./mention";
import { EventIcon, NostrEvent } from "./Event";
import { ExternalLink } from "./external-link";
import { useEvent } from "@/hooks/event";
import AsyncButton from "./async-button";
import { useEventFeed } from "@snort/system-react";
interface MediaURLProps {
url: URL;
@ -43,7 +43,7 @@ export function MediaURL({ url, children }: MediaURLProps) {
}
export function CollapsibleEvent({ link }: { link: NostrLink }) {
const event = useEvent(link);
const event = useEventFeed(link);
const [open, setOpen] = useState(false);
const author = event?.pubkey || link.author;

View File

@ -1,7 +1,7 @@
import "./live-chat.css";
import { FormattedMessage } from "react-intl";
import { EventKind, NostrEvent, NostrLink, ParsedZap, TaggedNostrEvent } from "@snort/system";
import { useEventReactions, useUserProfile } from "@snort/system-react";
import { EventKind, NostrEvent, NostrLink, NostrPrefix, ParsedZap, TaggedNostrEvent } from "@snort/system";
import { useEventFeed, useEventReactions, useUserProfile } from "@snort/system-react";
import { unixNow, unwrap } from "@snort/shared";
import { useEffect, useMemo } from "react";
@ -18,7 +18,6 @@ import { useLiveChatFeed } from "@/hooks/live-chat";
import { useMutedPubkeys } from "@/hooks/lists";
import { useBadges } from "@/hooks/badges";
import { useLogin } from "@/hooks/login";
import { useAddress, useEvent } from "@/hooks/event";
import { formatSats } from "@/number";
import { LIVE_STREAM_CHAT, LIVE_STREAM_CLIP, LIVE_STREAM_RAID, WEEK } from "@/const";
import { findTag, getHost, getTagValues, uniqBy } from "@/utils";
@ -34,7 +33,7 @@ function BadgeAward({ ev }: { ev: NostrEvent }) {
const badge = findTag(ev, "a") ?? "";
const [k, pubkey, d] = badge.split(":");
const awardees = getTagValues(ev.tags, "p");
const event = useAddress(Number(k), pubkey, d);
const event = useEventFeed(new NostrLink(NostrPrefix.Address, d, Number(k), pubkey));
return (
<div className="badge-award">
{event && <Badge ev={event} />}
@ -229,7 +228,7 @@ export function ChatRaid({ link, ev }: { link: NostrLink; ev: TaggedNostrEvent }
const to = ev.tags.find(a => a[0] === "a" && a[3] === "mention");
const isRaiding = link.toEventTag()?.at(1) === from?.at(1);
const otherLink = NostrLink.fromTag(unwrap(isRaiding ? to : from));
const otherEvent = useEvent(otherLink);
const otherEvent = useEventFeed(otherLink);
const otherProfile = useUserProfile(getHost(otherEvent));
useEffect(() => {

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { EventKind, NoteCollection, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { EventKind, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { findTag, getTagValues, toAddress } from "@/utils";
@ -19,7 +19,7 @@ export function useBadges(
return rb;
}, [pubkey, since]);
const { data: badgeEvents } = useRequestBuilder(NoteCollection, rb);
const badgeEvents = useRequestBuilder(rb);
const rawBadges = useMemo(() => {
if (badgeEvents) {
@ -41,8 +41,8 @@ export function useBadges(
return rb;
}, [rawBadges]);
const acceptedStream = useRequestBuilder(NoteCollection, acceptedSub);
const acceptedEvents = acceptedStream.data ?? [];
const acceptedStream = useRequestBuilder(acceptedSub);
const acceptedEvents = acceptedStream ?? [];
const badges = useMemo(() => {
return rawBadges.map(e => {

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { NoteCollection, ReplaceableNoteStore, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { CARD, USER_CARDS } from "@/const";
@ -33,7 +33,7 @@ export function useUserCards(pubkey: string, userCards: Array<string[]>, leaveOp
return rb;
}, [pubkey, related]);
const { data } = useRequestBuilder(NoteCollection, subRelated);
const data = useRequestBuilder(subRelated);
const cards = useMemo(() => {
return related
@ -62,12 +62,12 @@ export function useCards(pubkey?: string, leaveOpen = false): TaggedNostrEvent[]
return b;
}, [pubkey, leaveOpen]);
const { data: userCards } = useRequestBuilder(ReplaceableNoteStore, sub);
const userCards = useRequestBuilder(sub);
const related = useMemo(() => {
// filtering to only show CARD kinds for now, but in the future we could link and render anything
if (userCards) {
return userCards.tags.filter(t => t.at(0) === "a" && t.at(1)?.startsWith(`${CARD}:`));
if (userCards.length > 0) {
return userCards[0].tags.filter(t => t.at(0) === "a" && t.at(1)?.startsWith(`${CARD}:`));
}
return [];
}, [userCards]);
@ -90,7 +90,7 @@ export function useCards(pubkey?: string, leaveOpen = false): TaggedNostrEvent[]
return rb;
}, [pubkey, related]);
const { data } = useRequestBuilder(NoteCollection, subRelated);
const data = useRequestBuilder(subRelated);
const cardEvents = data ?? [];
const cards = useMemo(() => {

View File

@ -1,6 +1,6 @@
import { unwrap } from "@snort/shared";
import { NostrEvent, NostrLink, NostrPrefix, NoteCollection, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { NostrEvent, NostrLink, NostrPrefix, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { useRequestBuilderAdvanced } from "@snort/system-react";
import { useMemo } from "react";
import { LIVE_STREAM } from "@/const";
@ -27,16 +27,16 @@ export function useCurrentStreamFeed(link: NostrLink, leaveOpen = false, evPrelo
return b;
}, [link.id, leaveOpen]);
const q = useRequestBuilder(NoteCollection, sub);
const q = useRequestBuilderAdvanced(sub);
if (evPreload) {
q.add(evPreload as TaggedNostrEvent);
q?.feed.add([evPreload as TaggedNostrEvent]);
}
return useMemo(() => {
const hosting = q.data?.filter(
const hosting = q?.snapshot?.filter(
a => a.pubkey === author || a.tags.some(b => b[0] === "p" && b[1] === author && b[3] === "host")
);
return [...(hosting ?? [])].sort((a, b) => (b.created_at > a.created_at ? 1 : -1)).at(0);
}, [q.data]);
}, [q]);
}

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { NostrEvent, NoteCollection, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { NostrEvent, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { findTag, uniqBy } from "@/utils";
import { EMOJI_PACK, USER_EMOJIS } from "@/const";
@ -55,7 +55,7 @@ export function useUserEmojiPacks(pubkey?: string, userEmoji?: Tags) {
return rb;
}, [pubkey, related]);
const { data: relatedData } = useRequestBuilder(NoteCollection, subRelated);
const relatedData = useRequestBuilder(subRelated);
const emojiPacks = useMemo(() => {
return relatedData ?? [];
@ -79,8 +79,8 @@ export default function useEmoji(pubkey?: string) {
return rb;
}, [pubkey]);
const { data: userEmoji } = useRequestBuilder(ReplaceableNoteStore, sub);
const userEmoji = useRequestBuilder(sub);
const emojis = useUserEmojiPacks(pubkey, userEmoji?.tags ?? []);
const emojis = useUserEmojiPacks(pubkey, userEmoji?.at(0)?.tags ?? []);
return emojis;
}

View File

@ -1,32 +0,0 @@
import { useMemo } from "react";
import { NostrLink, NostrPrefix, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
export default function useEventFeed(link: NostrLink, leaveOpen = false) {
const sub = useMemo(() => {
const b = new RequestBuilder(`event:${link.id.slice(0, 12)}`);
b.withOptions({
leaveOpen,
});
if (link.type === NostrPrefix.Address) {
const f = b.withFilter().tag("d", [link.id]);
if (link.author) {
f.authors([link.author]);
}
if (link.kind) {
f.kinds([link.kind]);
}
} else {
const f = b.withFilter().ids([link.id]);
if (link.relays) {
link.relays.slice(0, 2).forEach(r => f.relay(r));
}
if (link.author) {
f.authors([link.author]);
}
}
return b;
}, [link, leaveOpen]);
return useRequestBuilder(ReplaceableNoteStore, sub);
}

View File

@ -1,44 +0,0 @@
import { useMemo } from "react";
import { type NostrLink, NostrPrefix, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
export function useAddress(kind: number, pubkey: string, identifier: string) {
const sub = useMemo(() => {
const b = new RequestBuilder(`event:${kind}:${identifier}`);
b.withFilter().kinds([kind]).authors([pubkey]).tag("d", [identifier]);
return b;
}, [kind, pubkey, identifier]);
const { data } = useRequestBuilder(ReplaceableNoteStore, sub);
return data;
}
export function useEvent(link: NostrLink) {
const sub = useMemo(() => {
const b = new RequestBuilder(`event:${link.id.slice(0, 12)}`);
if (link.type === NostrPrefix.Address) {
const f = b.withFilter().tag("d", [link.id]);
if (link.author) {
f.authors([link.author]);
}
if (link.kind) {
f.kinds([link.kind]);
}
} else {
const f = b.withFilter().ids([link.id]);
if (link.relays) {
link.relays.slice(0, 2).forEach(r => f.relay(r));
}
if (link.author) {
f.authors([link.author]);
}
}
return b;
}, [link]);
const { data } = useRequestBuilder(ReplaceableNoteStore, sub);
return data;
}

View File

@ -1,5 +1,5 @@
import { useMemo } from "react";
import { FlatNoteStore, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { GOAL } from "@/const";
@ -11,9 +11,8 @@ export function useZapGoal(id?: string) {
return b;
}, [id]);
const { data } = useRequestBuilder(ReplaceableNoteStore, sub);
return data;
const data = useRequestBuilder(sub);
return data.at(0);
}
export function useGoals(pubkey?: string, leaveOpen = false) {
@ -25,7 +24,6 @@ export function useGoals(pubkey?: string, leaveOpen = false) {
return b;
}, [pubkey, leaveOpen]);
const { data } = useRequestBuilder(FlatNoteStore, sub);
const data = useRequestBuilder(sub);
return data;
}

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { MUTED } from "@/const";
@ -15,9 +15,9 @@ export function useMutedPubkeys(host?: string, leaveOpen = false) {
return rb;
}, [host]);
const { data: muted } = useRequestBuilder(ReplaceableNoteStore, mutedSub);
const muted = useRequestBuilder(mutedSub);
const mutedPubkeys = useMemo(() => {
return new Set(getTagValues(muted?.tags ?? [], "p"));
return new Set(getTagValues(muted?.at(0)?.tags ?? [], "p"));
}, [muted]);
return mutedPubkeys;

View File

@ -1,4 +1,4 @@
import { NostrLink, NoteCollection, RequestBuilder } from "@snort/system";
import { NostrLink, RequestBuilder } from "@snort/system";
import { useReactions, useRequestBuilder } from "@snort/system-react";
import { unixNow } from "@snort/shared";
import { useMemo } from "react";
@ -17,13 +17,13 @@ export function useLiveChatFeed(link?: NostrLink, eZaps?: Array<string>, limit =
return rb;
}, [link?.id, since, eZaps]);
const feed = useRequestBuilder(NoteCollection, sub);
const feed = useRequestBuilder(sub);
const messages = useMemo(() => {
return (feed.data ?? []).filter(
return (feed ?? []).filter(
ev => ev.kind === LIVE_STREAM_CHAT || ev.kind === LIVE_STREAM_RAID || ev.kind === LIVE_STREAM_CLIP
);
}, [feed.data]);
}, [feed]);
const reactions = useReactions(
`live:${link?.id}:${link?.author}:reactions`,
@ -31,5 +31,5 @@ export function useLiveChatFeed(link?: NostrLink, eZaps?: Array<string>, limit =
undefined,
true
);
return { messages, reactions: reactions.data ?? [] };
return { messages, reactions: reactions ?? [] };
}

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { NostrEvent, NoteCollection, RequestBuilder } from "@snort/system";
import { NostrEvent, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { unixNow } from "@snort/shared";
@ -53,17 +53,17 @@ export function useStreamsFeed(tag?: string) {
return bStart > aStart ? 1 : -1;
}
const feed = useRequestBuilder(NoteCollection, rb);
const feed = useRequestBuilder(rb);
const feedSorted = useMemo(() => {
if (feed.data) {
if (feed) {
if (__XXX) {
return [...feed.data].filter(
return [...feed].filter(
a =>
findTag(a, "content-warning") !== undefined &&
(!import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === getHost(a))
);
} else {
return [...feed.data].filter(
return [...feed].filter(
a =>
findTag(a, "content-warning") === undefined &&
(!import.meta.env.VITE_SINGLE_PUBLISHER || import.meta.env.VITE_SINGLE_PUBLISHER === getHost(a))
@ -71,7 +71,7 @@ export function useStreamsFeed(tag?: string) {
}
}
return [];
}, [feed.data]);
}, [feed]);
const live = feedSorted.filter(a => findTag(a, "status") === StreamState.Live).sort(sortStarts);
const planned = feedSorted.filter(a => findTag(a, "status") === StreamState.Planned).sort(sortStarts);

View File

@ -1,6 +1,6 @@
import { useEffect, useMemo, useState, useSyncExternalStore } from "react";
import { EventKind, NoteCollection, RequestBuilder } from "@snort/system";
import { EventKind, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { useUserEmojiPacks } from "@/hooks/emoji";
@ -42,7 +42,7 @@ export function useLoginEvents(pubkey?: string, leaveOpen = false) {
return b;
}, [pubkey, leaveOpen]);
const { data } = useRequestBuilder(NoteCollection, sub);
const data = useRequestBuilder(sub);
useEffect(() => {
if (!data) {

View File

@ -1,5 +1,5 @@
import { useMemo } from "react";
import { NostrLink, NoteCollection, RequestBuilder } from "@snort/system";
import { NostrLink, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { LIVE_STREAM } from "@/const";
import { useZaps } from "./zaps";
@ -19,11 +19,11 @@ export function useProfile(link: NostrLink, leaveOpen = false) {
return b;
}, [link, leaveOpen]);
const streams = useRequestBuilder(NoteCollection, sub);
const streams = useRequestBuilder(sub);
const zaps = useZaps(link);
const sortedStreams = useMemo(() => {
const sorted = [...(streams.data ?? [])].sort((a, b) => b.created_at - a.created_at);
const sorted = [...(streams ?? [])].sort((a, b) => b.created_at - a.created_at);
return sorted;
}, [streams]);

View File

@ -1,5 +1,5 @@
import { bech32ToHex } from "@snort/shared";
import { EventKind, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { EventKind, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
import { useMemo } from "react";
@ -20,11 +20,11 @@ export function useRates(symbol: string, leaveOpen = true) {
return rb;
}, [symbol]);
const data = useRequestBuilder(ReplaceableNoteStore, sub);
const data = useRequestBuilder(sub);
const tag = data?.data?.tags.find(a => a[0] === "d" && a[1] === symbol);
const tag = data?.at(0)?.tags.find(a => a[0] === "d" && a[1] === symbol);
return {
time: data.data?.created_at,
time: data?.at(0)?.created_at,
ask: Number(tag?.[2]),
bid: Number(tag?.[3]),
low: Number(tag?.[4]),

View File

@ -1,6 +1,6 @@
import { useMemo } from "react";
import { EventKind, ReplaceableNoteStore, RequestBuilder } from "@snort/system";
import { EventKind, RequestBuilder } from "@snort/system";
import { useRequestBuilder } from "@snort/system-react";
type StatusTag = "general" | "music";
@ -17,6 +17,6 @@ export function useStatus(tag: StatusTag, author?: string, leaveOpen = true) {
return b;
}, [author]);
const { data } = useRequestBuilder(ReplaceableNoteStore, sub);
return data;
const data = useRequestBuilder(sub);
return data.at(0);
}

View File

@ -13,7 +13,7 @@ export function useZaps(link?: NostrLink, leaveOpen = false) {
return null;
}, [link, leaveOpen]);
const { data: zaps } = useRequestBuilder(NoteCollection, sub);
const zaps = useRequestBuilder(sub);
return (
[...(zaps ?? [])]

View File

@ -2877,40 +2877,28 @@ __metadata:
languageName: node
linkType: hard
"@snort/shared@npm:^1.0.10":
version: 1.0.10
resolution: "@snort/shared@npm:1.0.10"
"@snort/shared@npm:^1.0.11":
version: 1.0.11
resolution: "@snort/shared@npm:1.0.11"
dependencies:
"@noble/curves": ^1.2.0
"@noble/hashes": ^1.3.2
"@scure/base": ^1.1.2
debug: ^4.3.4
eventemitter3: ^5.0.1
light-bolt11-decoder: ^3.0.0
checksum: a9d6f3bebfa8266b5323f12bd1ebaf1fd3db316ff6b02524425b876a9902f1d763116c8c8f47259cfc2fd9aee19974333849ee08c3ec038122d3a5d385292fb8
checksum: 4a5441c9a1b2636283a9d39533821fcf4606dbbfbb39329aa814e6512282adf48768e761553e906f0c9c62c3862a0cb48b05a5a84cc871562a2d1120c7a902ac
languageName: node
linkType: hard
"@snort/shared@npm:^1.0.9":
version: 1.0.9
resolution: "@snort/shared@npm:1.0.9"
"@snort/system-react@npm:^1.2.0":
version: 1.2.0
resolution: "@snort/system-react@npm:1.2.0"
dependencies:
"@noble/curves": ^1.2.0
"@noble/hashes": ^1.3.2
"@scure/base": ^1.1.2
debug: ^4.3.4
light-bolt11-decoder: ^3.0.0
checksum: cb1c918f614486d46ab0c41f3a14644c8dcc34d7bd02bd1ca7473003119b08eacfba9a3b46f72f197261fb9af85d3717d638e21a09b914ab9bec262fe32219c4
languageName: node
linkType: hard
"@snort/system-react@npm:^1.1.8":
version: 1.1.8
resolution: "@snort/system-react@npm:1.1.8"
dependencies:
"@snort/shared": ^1.0.10
"@snort/system": ^1.1.8
"@snort/shared": ^1.0.11
"@snort/system": ^1.2.0
react: ^18.2.0
checksum: dfe30788f3c8c24bd7d9bc50f60b924ffc679b2438f172e11e56f8a00942f7bd1add1aa9adcebddba43498a92d7a49a69a5dc566b6fac16575a553ba2923275f
checksum: 4a4444cfe6f91e92b814c11ebc26061e46bb771c2458919ec2c886671d7a3c9e920bc98b43831c40411869950d4e5d4633f7b5d51291347220ca12dd4f98fe6b
languageName: node
linkType: hard
@ -2921,50 +2909,33 @@ __metadata:
languageName: node
linkType: hard
"@snort/system-web@npm:^1.0.2":
version: 1.0.2
resolution: "@snort/system-web@npm:1.0.2"
"@snort/system-web@npm:^1.0.4":
version: 1.0.4
resolution: "@snort/system-web@npm:1.0.4"
dependencies:
"@snort/shared": ^1.0.9
"@snort/system": ^1.1.1
"@snort/shared": ^1.0.11
"@snort/system": ^1.2.0
dexie: ^3.2.4
checksum: 1beed3de3256bb94a952034bdb0739272dfba0a48c985f8f4f9d7730b409182b4abea0e00ba9b519d30729e18b9db0d0752d99281238d1789f47c3c076154339
checksum: ee705a586009cdc35c167aaeb4e505afac4d4c5f8eb80ae3b8519e631a7e9cfae828a7e00cc589eeff509bb5bd5e9398888763e03e26e1ce888393d3f5daf11b
languageName: node
linkType: hard
"@snort/system@npm:^1.1.1":
version: 1.1.1
resolution: "@snort/system@npm:1.1.1"
"@snort/system@npm:^1.2.0":
version: 1.2.0
resolution: "@snort/system@npm:1.2.0"
dependencies:
"@noble/curves": ^1.2.0
"@noble/hashes": ^1.3.2
"@scure/base": ^1.1.2
"@snort/shared": ^1.0.9
"@snort/shared": ^1.0.11
"@stablelib/xchacha20": ^1.0.1
debug: ^4.3.4
eventemitter3: ^5.0.1
isomorphic-ws: ^5.0.0
lokijs: ^1.5.12
uuid: ^9.0.0
ws: ^8.14.0
checksum: 8c6d2b4061084245fbfa83e698949aba2e47dc23ca38af3d1ac0b2166dae4a397ea432a36f24891f2ff3d88aab7734818f13d013ae9615eb6bbdad0dddd82101
languageName: node
linkType: hard
"@snort/system@npm:^1.1.8":
version: 1.1.8
resolution: "@snort/system@npm:1.1.8"
dependencies:
"@noble/curves": ^1.2.0
"@noble/hashes": ^1.3.2
"@scure/base": ^1.1.2
"@snort/shared": ^1.0.10
"@stablelib/xchacha20": ^1.0.1
debug: ^4.3.4
eventemitter3: ^5.0.1
isomorphic-ws: ^5.0.0
uuid: ^9.0.0
ws: ^8.14.0
checksum: f27685c55cde1b409b763a553c0cbadf972fefc449d22ea045d004da3658000c65587cef2983ba03f45df50f1eec58d9858256a7a809275a625635267b77b482
checksum: f5fb8a89f3d35db87c0c9a9e6cc49081d3c93c5092c51a6105ca020ff6679ae24b688d59c66482124e81eb839313ad5d723087eac948cad76f460a7f34876213
languageName: node
linkType: hard
@ -6157,6 +6128,13 @@ __metadata:
languageName: node
linkType: hard
"lokijs@npm:^1.5.12":
version: 1.5.12
resolution: "lokijs@npm:1.5.12"
checksum: 5cd45facb890048e83977de1451a7b70e1f9e4cfe41c40d2212dfc160df7919b821072f95b10d692f6932c1080193e0715e8fe18dee332f04da4fda0f08984b6
languageName: node
linkType: hard
"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0":
version: 1.4.0
resolution: "loose-envify@npm:1.4.0"
@ -7813,11 +7791,11 @@ __metadata:
"@radix-ui/react-toggle": ^1.0.3
"@react-hook/resize-observer": ^1.2.6
"@scure/base": ^1.1.3
"@snort/shared": ^1.0.10
"@snort/system": ^1.1.8
"@snort/system-react": ^1.1.8
"@snort/shared": ^1.0.11
"@snort/system": ^1.2.0
"@snort/system-react": ^1.2.0
"@snort/system-wasm": ^1.0.1
"@snort/system-web": ^1.0.2
"@snort/system-web": ^1.0.4
"@szhsin/react-menu": ^4.0.2
"@testing-library/dom": ^9.3.1
"@types/lodash": ^4.14.195