diff --git a/packages/app/jest.config.js b/packages/app/jest.config.js index 4f0c217a..928edeee 100644 --- a/packages/app/jest.config.js +++ b/packages/app/jest.config.js @@ -3,5 +3,7 @@ module.exports = { bail: true, preset: "ts-jest", testEnvironment: "jsdom", - roots: ["./src/"], + roots: ["src"], + moduleDirectories: ["src", "node_modules"], + setupFiles: ["./src/setupTests.ts"], }; diff --git a/packages/app/src/Cache/EventInteractionCache.ts b/packages/app/src/Cache/EventInteractionCache.ts index 2ea3ac80..1a727c06 100644 --- a/packages/app/src/Cache/EventInteractionCache.ts +++ b/packages/app/src/Cache/EventInteractionCache.ts @@ -1,6 +1,6 @@ import { db, EventInteraction } from "Db"; import { LoginStore } from "Login"; -import { sha256 } from "Util"; +import { sha256 } from "SnortUtils"; import FeedCache from "./FeedCache"; class EventInteractionCache extends FeedCache { diff --git a/packages/app/src/Cache/FeedCache.ts b/packages/app/src/Cache/FeedCache.ts index 10feed3a..4a24f541 100644 --- a/packages/app/src/Cache/FeedCache.ts +++ b/packages/app/src/Cache/FeedCache.ts @@ -1,6 +1,6 @@ import { db } from "Db"; import { Table } from "dexie"; -import { unixNowMs, unwrap } from "Util"; +import { unixNowMs, unwrap } from "SnortUtils"; type HookFn = () => void; diff --git a/packages/app/src/Cache/index.ts b/packages/app/src/Cache/index.ts index cf1bd971..f147ecfa 100644 --- a/packages/app/src/Cache/index.ts +++ b/packages/app/src/Cache/index.ts @@ -1,5 +1,5 @@ import { HexKey, RawEvent, UserMetadata } from "@snort/nostr"; -import { hexToBech32, unixNowMs } from "Util"; +import { hexToBech32, unixNowMs } from "SnortUtils"; import { DmCache } from "./DMCache"; import { InteractionCache } from "./EventInteractionCache"; import { UserCache } from "./UserCache"; diff --git a/packages/app/src/Element/AvatarEditor.tsx b/packages/app/src/Element/AvatarEditor.tsx index 690fc189..b7b5776a 100644 --- a/packages/app/src/Element/AvatarEditor.tsx +++ b/packages/app/src/Element/AvatarEditor.tsx @@ -1,7 +1,7 @@ import Icon from "Icons/Icon"; import { useState } from "react"; import useFileUpload from "Upload"; -import { openFile, unwrap } from "Util"; +import { openFile, unwrap } from "SnortUtils"; interface AvatarEditorProps { picture?: string; diff --git a/packages/app/src/Element/BadgeList.tsx b/packages/app/src/Element/BadgeList.tsx index 9eec2784..83b494f1 100644 --- a/packages/app/src/Element/BadgeList.tsx +++ b/packages/app/src/Element/BadgeList.tsx @@ -9,7 +9,7 @@ import { ProxyImg } from "Element/ProxyImg"; import Icon from "Icons/Icon"; import Modal from "Element/Modal"; import Username from "Element/Username"; -import { findTag } from "Util"; +import { findTag } from "SnortUtils"; export default function BadgeList({ badges }: { badges: TaggedRawEvent[] }) { const [showModal, setShowModal] = useState(false); diff --git a/packages/app/src/Element/DM.tsx b/packages/app/src/Element/DM.tsx index dfc8911b..b893075d 100644 --- a/packages/app/src/Element/DM.tsx +++ b/packages/app/src/Element/DM.tsx @@ -8,7 +8,7 @@ import useEventPublisher from "Feed/EventPublisher"; import NoteTime from "Element/NoteTime"; import Text from "Element/Text"; import { setLastReadDm } from "Pages/MessagesPage"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import useLogin from "Hooks/useLogin"; import messages from "./messages"; diff --git a/packages/app/src/Element/DmWindow.tsx b/packages/app/src/Element/DmWindow.tsx index 79244a4a..2347e571 100644 --- a/packages/app/src/Element/DmWindow.tsx +++ b/packages/app/src/Element/DmWindow.tsx @@ -9,7 +9,7 @@ import NoteToSelf from "Element/NoteToSelf"; import { useDmCache } from "Hooks/useDmsCache"; import useLogin from "Hooks/useLogin"; import WriteDm from "Element/WriteDm"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; export default function DmWindow({ id }: { id: string }) { const pubKey = useLogin().publicKey; diff --git a/packages/app/src/Element/FollowButton.tsx b/packages/app/src/Element/FollowButton.tsx index 044f20e4..eb20789c 100644 --- a/packages/app/src/Element/FollowButton.tsx +++ b/packages/app/src/Element/FollowButton.tsx @@ -3,7 +3,7 @@ import { FormattedMessage } from "react-intl"; import { HexKey } from "@snort/nostr"; import useEventPublisher from "Feed/EventPublisher"; -import { parseId } from "Util"; +import { parseId } from "SnortUtils"; import useLogin from "Hooks/useLogin"; import AsyncButton from "Element/AsyncButton"; diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/HyperText.tsx index f7439a7c..83de733f 100644 --- a/packages/app/src/Element/HyperText.tsx +++ b/packages/app/src/Element/HyperText.tsx @@ -13,7 +13,7 @@ import { NostrNestsRegex, WavlakeRegex, } from "Const"; -import { magnetURIDecode } from "Util"; +import { magnetURIDecode } from "SnortUtils"; import SoundCloudEmbed from "Element/SoundCloudEmded"; import MixCloudEmbed from "Element/MixCloudEmbed"; import SpotifyEmbed from "Element/SpotifyEmbed"; diff --git a/packages/app/src/Element/Invoice.tsx b/packages/app/src/Element/Invoice.tsx index 2d6d1251..f8704c17 100644 --- a/packages/app/src/Element/Invoice.tsx +++ b/packages/app/src/Element/Invoice.tsx @@ -6,7 +6,7 @@ import { useMemo } from "react"; import SendSats from "Element/SendSats"; import Icon from "Icons/Icon"; import { useWallet } from "Wallet"; -import { decodeInvoice } from "Util"; +import { decodeInvoice } from "SnortUtils"; import messages from "./messages"; diff --git a/packages/app/src/Element/MagnetLink.tsx b/packages/app/src/Element/MagnetLink.tsx index 169a45cf..4dca7d5e 100644 --- a/packages/app/src/Element/MagnetLink.tsx +++ b/packages/app/src/Element/MagnetLink.tsx @@ -1,6 +1,6 @@ import { FormattedMessage } from "react-intl"; -import { Magnet } from "Util"; +import { Magnet } from "SnortUtils"; interface MagnetLinkProps { magnet: Magnet; diff --git a/packages/app/src/Element/Mention.tsx b/packages/app/src/Element/Mention.tsx index add8c869..63783f01 100644 --- a/packages/app/src/Element/Mention.tsx +++ b/packages/app/src/Element/Mention.tsx @@ -3,7 +3,7 @@ import { Link } from "react-router-dom"; import { HexKey } from "@snort/nostr"; import { useUserProfile } from "Hooks/useUserProfile"; -import { profileLink } from "Util"; +import { profileLink } from "SnortUtils"; import { getDisplayName } from "Element/ProfileImage"; export default function Mention({ pubkey, relays }: { pubkey: HexKey; relays?: Array | string }) { diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx index 8feb5428..7bc93d3e 100644 --- a/packages/app/src/Element/Nip5Service.tsx +++ b/packages/app/src/Element/Nip5Service.tsx @@ -3,7 +3,7 @@ import { useIntl, FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import { UserMetadata } from "@snort/nostr"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { formatShort } from "Number"; import { ServiceProvider, @@ -19,7 +19,7 @@ import SendSats from "Element/SendSats"; import Copy from "Element/Copy"; import { useUserProfile } from "Hooks/useUserProfile"; import useEventPublisher from "Feed/EventPublisher"; -import { debounce } from "Util"; +import { debounce } from "SnortUtils"; import useLogin from "Hooks/useLogin"; import SnortServiceProvider from "Nip05/SnortServiceProvider"; import { mapEventToProfile, UserCache } from "Cache"; diff --git a/packages/app/src/Element/NostrFileHeader.tsx b/packages/app/src/Element/NostrFileHeader.tsx index 91bb015b..277d71da 100644 --- a/packages/app/src/Element/NostrFileHeader.tsx +++ b/packages/app/src/Element/NostrFileHeader.tsx @@ -1,7 +1,7 @@ import { FormattedMessage } from "react-intl"; import { RawEvent } from "@snort/nostr"; -import { findTag, NostrLink } from "Util"; +import { findTag, NostrLink } from "SnortUtils"; import useEventFeed from "Feed/EventFeed"; import PageSpinner from "Element/PageSpinner"; import Reveal from "Element/Reveal"; diff --git a/packages/app/src/Element/NostrLink.tsx b/packages/app/src/Element/NostrLink.tsx index c4f2a077..d87abcec 100644 --- a/packages/app/src/Element/NostrLink.tsx +++ b/packages/app/src/Element/NostrLink.tsx @@ -2,7 +2,7 @@ import { Link } from "react-router-dom"; import { NostrPrefix } from "@snort/nostr"; import Mention from "Element/Mention"; -import { parseNostrLink } from "Util"; +import { parseNostrLink } from "SnortUtils"; import NoteQuote from "Element/NoteQuote"; export default function NostrLink({ link, depth }: { link: string; depth?: number }) { diff --git a/packages/app/src/Element/Note.tsx b/packages/app/src/Element/Note.tsx index 273de2ea..03f4f9d0 100644 --- a/packages/app/src/Element/Note.tsx +++ b/packages/app/src/Element/Note.tsx @@ -19,7 +19,7 @@ import { normalizeReaction, Reaction, profileLink, -} from "Util"; +} from "SnortUtils"; import NoteFooter, { Translation } from "Element/NoteFooter"; import NoteTime from "Element/NoteTime"; import Reveal from "Element/Reveal"; diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index b1e5f59d..df08f85f 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -5,7 +5,7 @@ import { encodeTLV, EventKind, NostrPrefix, TaggedRawEvent } from "@snort/nostr" import Icon from "Icons/Icon"; import useEventPublisher from "Feed/EventPublisher"; -import { openFile } from "Util"; +import { openFile } from "SnortUtils"; import Textarea from "Element/Textarea"; import Modal from "Element/Modal"; import ProfileImage from "Element/ProfileImage"; diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index 219738bb..6347f37d 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -10,7 +10,7 @@ import Spinner from "Icons/Spinner"; import { formatShort } from "Number"; import useEventPublisher from "Feed/EventPublisher"; -import { delay, normalizeReaction, unwrap } from "Util"; +import { delay, normalizeReaction, unwrap } from "SnortUtils"; import { NoteCreator } from "Element/NoteCreator"; import { ReBroadcaster } from "Element/ReBroadcaster"; import Reactions from "Element/Reactions"; diff --git a/packages/app/src/Element/NoteQuote.tsx b/packages/app/src/Element/NoteQuote.tsx index 75cdc3b9..31cca7ba 100644 --- a/packages/app/src/Element/NoteQuote.tsx +++ b/packages/app/src/Element/NoteQuote.tsx @@ -1,5 +1,5 @@ import useEventFeed from "Feed/EventFeed"; -import { NostrLink } from "Util"; +import { NostrLink } from "SnortUtils"; import Note from "Element/Note"; import PageSpinner from "Element/PageSpinner"; diff --git a/packages/app/src/Element/NoteReaction.tsx b/packages/app/src/Element/NoteReaction.tsx index a9a7132d..aee50f87 100644 --- a/packages/app/src/Element/NoteReaction.tsx +++ b/packages/app/src/Element/NoteReaction.tsx @@ -5,7 +5,7 @@ import { EventKind, RawEvent, TaggedRawEvent, NostrPrefix } from "@snort/nostr"; import Note from "Element/Note"; import ProfileImage from "Element/ProfileImage"; -import { eventLink, hexToBech32 } from "Util"; +import { eventLink, hexToBech32 } from "SnortUtils"; import NoteTime from "Element/NoteTime"; import useModeration from "Hooks/useModeration"; import { EventExt } from "System/EventExt"; diff --git a/packages/app/src/Element/NoteToSelf.tsx b/packages/app/src/Element/NoteToSelf.tsx index 348372dd..b134762a 100644 --- a/packages/app/src/Element/NoteToSelf.tsx +++ b/packages/app/src/Element/NoteToSelf.tsx @@ -1,7 +1,7 @@ import "./NoteToSelf.css"; import { Link, useNavigate } from "react-router-dom"; import { FormattedMessage } from "react-intl"; -import { profileLink } from "Util"; +import { profileLink } from "SnortUtils"; import messages from "./messages"; import Icon from "Icons/Icon"; diff --git a/packages/app/src/Element/Poll.tsx b/packages/app/src/Element/Poll.tsx index 0316c3f6..cb44e29b 100644 --- a/packages/app/src/Element/Poll.tsx +++ b/packages/app/src/Element/Poll.tsx @@ -8,7 +8,7 @@ import useEventPublisher from "Feed/EventPublisher"; import { useWallet } from "Wallet"; import { useUserProfile } from "Hooks/useUserProfile"; import { LNURL } from "LNURL"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { formatShort } from "Number"; import Spinner from "Icons/Spinner"; import SendSats from "Element/SendSats"; diff --git a/packages/app/src/Element/ProfileImage.tsx b/packages/app/src/Element/ProfileImage.tsx index ec3e017c..184e5e0a 100644 --- a/packages/app/src/Element/ProfileImage.tsx +++ b/packages/app/src/Element/ProfileImage.tsx @@ -4,7 +4,7 @@ import React, { useMemo } from "react"; import { HexKey, NostrPrefix } from "@snort/nostr"; import { useUserProfile } from "Hooks/useUserProfile"; -import { hexToBech32, profileLink } from "Util"; +import { hexToBech32, profileLink } from "SnortUtils"; import Avatar from "Element/Avatar"; import Nip05 from "Element/Nip05"; import { MetadataCache } from "Cache"; diff --git a/packages/app/src/Element/ProxyImg.tsx b/packages/app/src/Element/ProxyImg.tsx index 05c27e5f..93782da3 100644 --- a/packages/app/src/Element/ProxyImg.tsx +++ b/packages/app/src/Element/ProxyImg.tsx @@ -1,7 +1,7 @@ import useImgProxy from "Hooks/useImgProxy"; import { useEffect, useState } from "react"; import { FormattedMessage } from "react-intl"; -import { getUrlHostname } from "Util"; +import { getUrlHostname } from "SnortUtils"; interface ProxyImgProps extends React.DetailedHTMLProps, HTMLImageElement> { size?: number; diff --git a/packages/app/src/Element/PubkeyList.tsx b/packages/app/src/Element/PubkeyList.tsx index df415ab2..5ef6fa39 100644 --- a/packages/app/src/Element/PubkeyList.tsx +++ b/packages/app/src/Element/PubkeyList.tsx @@ -1,5 +1,5 @@ import { RawEvent } from "@snort/nostr"; -import { dedupe } from "Util"; +import { dedupe } from "SnortUtils"; import FollowListBase from "./FollowListBase"; export default function PubkeyList({ ev, className }: { ev: RawEvent; className?: string }) { diff --git a/packages/app/src/Element/Relay.tsx b/packages/app/src/Element/Relay.tsx index 5d9e6afc..6c4d898f 100644 --- a/packages/app/src/Element/Relay.tsx +++ b/packages/app/src/Element/Relay.tsx @@ -6,7 +6,7 @@ import { RelaySettings } from "@snort/nostr"; import useRelayState from "Feed/RelayState"; import { System } from "System"; -import { getRelayName, unixNowMs, unwrap } from "Util"; +import { getRelayName, unixNowMs, unwrap } from "SnortUtils"; import useLogin from "Hooks/useLogin"; import { setRelays } from "Login"; import Icon from "Icons/Icon"; diff --git a/packages/app/src/Element/SendSats.tsx b/packages/app/src/Element/SendSats.tsx index 60ac0949..cbb3dde2 100644 --- a/packages/app/src/Element/SendSats.tsx +++ b/packages/app/src/Element/SendSats.tsx @@ -11,7 +11,7 @@ import Modal from "Element/Modal"; import QrCode from "Element/QrCode"; import Copy from "Element/Copy"; import { LNURL, LNURLError, LNURLErrorCode, LNURLInvoice, LNURLSuccessAction } from "LNURL"; -import { chunks, debounce } from "Util"; +import { chunks, debounce } from "SnortUtils"; import { useWallet } from "Wallet"; import useLogin from "Hooks/useLogin"; import { generateRandomKey } from "Login"; diff --git a/packages/app/src/Element/SubDebug.tsx b/packages/app/src/Element/SubDebug.tsx index 0f1de9ce..db948ca6 100644 --- a/packages/app/src/Element/SubDebug.tsx +++ b/packages/app/src/Element/SubDebug.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import useRelayState from "Feed/RelayState"; import Tabs, { Tab } from "Element/Tabs"; import { System } from "System"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import useSystemState from "Hooks/useSystemState"; import { RawReqFilter } from "@snort/nostr"; import { useCopy } from "useCopy"; diff --git a/packages/app/src/Element/SuggestedProfiles.tsx b/packages/app/src/Element/SuggestedProfiles.tsx index 319befe7..5449260d 100644 --- a/packages/app/src/Element/SuggestedProfiles.tsx +++ b/packages/app/src/Element/SuggestedProfiles.tsx @@ -7,7 +7,7 @@ import PageSpinner from "Element/PageSpinner"; import NostrBandApi from "External/NostrBand"; import SemisolDevApi from "External/SemisolDev"; import useLogin from "Hooks/useLogin"; -import { hexToBech32 } from "Util"; +import { hexToBech32 } from "SnortUtils"; enum Provider { NostrBand = 1, diff --git a/packages/app/src/Element/Text.tsx b/packages/app/src/Element/Text.tsx index 68017aad..22ae3cf7 100644 --- a/packages/app/src/Element/Text.tsx +++ b/packages/app/src/Element/Text.tsx @@ -4,7 +4,7 @@ import { Link, useLocation } from "react-router-dom"; import { HexKey, NostrPrefix } from "@snort/nostr"; import { MentionRegex, InvoiceRegex, HashtagRegex, CashuRegex } from "Const"; -import { eventLink, hexToBech32, splitByUrl, validateNostrLink } from "Util"; +import { eventLink, hexToBech32, splitByUrl, validateNostrLink } from "SnortUtils"; import Invoice from "Element/Invoice"; import Hashtag from "Element/Hashtag"; import Mention from "Element/Mention"; diff --git a/packages/app/src/Element/Textarea.tsx b/packages/app/src/Element/Textarea.tsx index fff173bb..ed22224a 100644 --- a/packages/app/src/Element/Textarea.tsx +++ b/packages/app/src/Element/Textarea.tsx @@ -8,7 +8,7 @@ import { NostrPrefix } from "@snort/nostr"; import Avatar from "Element/Avatar"; import Nip05 from "Element/Nip05"; -import { hexToBech32 } from "Util"; +import { hexToBech32 } from "SnortUtils"; import { MetadataCache } from "Cache"; import { UserCache } from "Cache/UserCache"; diff --git a/packages/app/src/Element/Thread.tsx b/packages/app/src/Element/Thread.tsx index 8e650e31..8013d027 100644 --- a/packages/app/src/Element/Thread.tsx +++ b/packages/app/src/Element/Thread.tsx @@ -5,7 +5,7 @@ import { useNavigate, useLocation, Link, useParams } from "react-router-dom"; import { TaggedRawEvent, u256, EventKind, NostrPrefix } from "@snort/nostr"; import { EventExt, Thread as ThreadInfo } from "System/EventExt"; -import { eventLink, unwrap, getReactions, parseNostrLink, getAllReactions, findTag } from "Util"; +import { eventLink, unwrap, getReactions, parseNostrLink, getAllReactions, findTag } from "SnortUtils"; import BackButton from "Element/BackButton"; import Note from "Element/Note"; import NoteGhost from "Element/NoteGhost"; diff --git a/packages/app/src/Element/Timeline.tsx b/packages/app/src/Element/Timeline.tsx index 8fb9644f..039fed06 100644 --- a/packages/app/src/Element/Timeline.tsx +++ b/packages/app/src/Element/Timeline.tsx @@ -5,7 +5,7 @@ import { useInView } from "react-intersection-observer"; import { TaggedRawEvent, EventKind, u256 } from "@snort/nostr"; import Icon from "Icons/Icon"; -import { dedupeByPubkey, findTag, tagFilterOfTextRepost } from "Util"; +import { dedupeByPubkey, findTag, tagFilterOfTextRepost } from "SnortUtils"; import ProfileImage from "Element/ProfileImage"; import useTimelineFeed, { TimelineFeed, TimelineSubject } from "Feed/TimelineFeed"; import LoadMore from "Element/LoadMore"; diff --git a/packages/app/src/Element/Username.tsx b/packages/app/src/Element/Username.tsx index 989890f9..76b5078f 100644 --- a/packages/app/src/Element/Username.tsx +++ b/packages/app/src/Element/Username.tsx @@ -4,7 +4,7 @@ import { useNavigate, Link } from "react-router-dom"; import { HexKey } from "@snort/nostr"; import { useUserProfile } from "Hooks/useUserProfile"; -import { profileLink } from "Util"; +import { profileLink } from "SnortUtils"; export default function Username({ pubkey, onLinkVisit }: { pubkey: HexKey; onLinkVisit(): void }) { const user = useUserProfile(pubkey); diff --git a/packages/app/src/Element/WriteDm.tsx b/packages/app/src/Element/WriteDm.tsx index eb9a25ea..37228edb 100644 --- a/packages/app/src/Element/WriteDm.tsx +++ b/packages/app/src/Element/WriteDm.tsx @@ -4,7 +4,7 @@ import Icon from "Icons/Icon"; import Spinner from "Icons/Spinner"; import { useState } from "react"; import useFileUpload from "Upload"; -import { openFile } from "Util"; +import { openFile } from "SnortUtils"; import Textarea from "./Textarea"; export default function WriteDm({ chatPubKey }: { chatPubKey: string }) { diff --git a/packages/app/src/Element/Zap.tsx b/packages/app/src/Element/Zap.tsx index 106e7727..4916ccaf 100644 --- a/packages/app/src/Element/Zap.tsx +++ b/packages/app/src/Element/Zap.tsx @@ -3,11 +3,11 @@ import { useMemo } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import { HexKey, TaggedRawEvent } from "@snort/nostr"; -import { decodeInvoice, InvoiceDetails, sha256, unwrap } from "Util"; +import { decodeInvoice, InvoiceDetails, sha256, unwrap } from "SnortUtils"; import { formatShort } from "Number"; import Text from "Element/Text"; import ProfileImage from "Element/ProfileImage"; -import { findTag } from "Util"; +import { findTag } from "SnortUtils"; import { UserCache } from "Cache/UserCache"; import useLogin from "Hooks/useLogin"; diff --git a/packages/app/src/Feed/BadgesFeed.ts b/packages/app/src/Feed/BadgesFeed.ts index a9e55c7a..194150ac 100644 --- a/packages/app/src/Feed/BadgesFeed.ts +++ b/packages/app/src/Feed/BadgesFeed.ts @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { EventKind, HexKey, Lists } from "@snort/nostr"; -import { unwrap, findTag, chunks } from "Util"; +import { unwrap, findTag, chunks } from "SnortUtils"; import { RequestBuilder } from "System"; import { FlatNoteStore, ReplaceableNoteStore } from "System/NoteCollection"; import useRequestBuilder from "Hooks/useRequestBuilder"; diff --git a/packages/app/src/Feed/EventFeed.ts b/packages/app/src/Feed/EventFeed.ts index 359dbee8..fca62014 100644 --- a/packages/app/src/Feed/EventFeed.ts +++ b/packages/app/src/Feed/EventFeed.ts @@ -3,7 +3,7 @@ import { NostrPrefix } from "@snort/nostr"; import useRequestBuilder from "Hooks/useRequestBuilder"; import { RequestBuilder, ReplaceableNoteStore } from "System"; -import { NostrLink, unwrap } from "Util"; +import { NostrLink, unwrap } from "SnortUtils"; export default function useEventFeed(link: NostrLink) { const sub = useMemo(() => { diff --git a/packages/app/src/Feed/LoginFeed.ts b/packages/app/src/Feed/LoginFeed.ts index 8f0be3c7..fab34810 100644 --- a/packages/app/src/Feed/LoginFeed.ts +++ b/packages/app/src/Feed/LoginFeed.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo } from "react"; import { TaggedRawEvent, Lists, EventKind } from "@snort/nostr"; -import { bech32ToHex, getNewest, getNewestEventTagsByKey, unwrap } from "Util"; +import { bech32ToHex, getNewest, getNewestEventTagsByKey, unwrap } from "SnortUtils"; import { makeNotification, sendNotification } from "Notifications"; import useEventPublisher from "Feed/EventPublisher"; import { getMutedKeys } from "Feed/MuteList"; diff --git a/packages/app/src/Feed/MuteList.ts b/packages/app/src/Feed/MuteList.ts index 4d551448..d7ac989e 100644 --- a/packages/app/src/Feed/MuteList.ts +++ b/packages/app/src/Feed/MuteList.ts @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { HexKey, TaggedRawEvent, Lists, EventKind } from "@snort/nostr"; -import { getNewest } from "Util"; +import { getNewest } from "SnortUtils"; import { ParameterizedReplaceableNoteStore, RequestBuilder } from "System"; import useRequestBuilder from "Hooks/useRequestBuilder"; import useLogin from "Hooks/useLogin"; diff --git a/packages/app/src/Feed/RelaysFeedFollows.tsx b/packages/app/src/Feed/RelaysFeedFollows.tsx index cf5ea5c5..90bfb0f3 100644 --- a/packages/app/src/Feed/RelaysFeedFollows.tsx +++ b/packages/app/src/Feed/RelaysFeedFollows.tsx @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { HexKey, FullRelaySettings, TaggedRawEvent, RelaySettings, EventKind } from "@snort/nostr"; -import { sanitizeRelayUrl } from "Util"; +import { sanitizeRelayUrl } from "SnortUtils"; import { PubkeyReplaceableNoteStore, RequestBuilder } from "System"; import useRequestBuilder from "Hooks/useRequestBuilder"; diff --git a/packages/app/src/Feed/ThreadFeed.ts b/packages/app/src/Feed/ThreadFeed.ts index 84df5db7..9d36cbe3 100644 --- a/packages/app/src/Feed/ThreadFeed.ts +++ b/packages/app/src/Feed/ThreadFeed.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState } from "react"; import { u256, EventKind } from "@snort/nostr"; -import { appendDedupe, NostrLink } from "Util"; +import { appendDedupe, NostrLink } from "SnortUtils"; import { FlatNoteStore, RequestBuilder } from "System"; import useRequestBuilder from "Hooks/useRequestBuilder"; import useLogin from "Hooks/useLogin"; diff --git a/packages/app/src/Feed/TimelineFeed.ts b/packages/app/src/Feed/TimelineFeed.ts index da814655..f4edf359 100644 --- a/packages/app/src/Feed/TimelineFeed.ts +++ b/packages/app/src/Feed/TimelineFeed.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { EventKind, u256 } from "@snort/nostr"; -import { unixNow, unwrap, tagFilterOfTextRepost } from "Util"; +import { unixNow, unwrap, tagFilterOfTextRepost } from "SnortUtils"; import { FlatNoteStore, RequestBuilder } from "System"; import useRequestBuilder from "Hooks/useRequestBuilder"; import useTimelineWindow from "Hooks/useTimelineWindow"; diff --git a/packages/app/src/Hooks/useImgProxy.ts b/packages/app/src/Hooks/useImgProxy.ts index 3cf5d4bf..de44acf6 100644 --- a/packages/app/src/Hooks/useImgProxy.ts +++ b/packages/app/src/Hooks/useImgProxy.ts @@ -1,6 +1,6 @@ import * as utils from "@noble/curves/abstract/utils"; import * as base64 from "@protobufjs/base64"; -import { hmacSha256, unwrap } from "Util"; +import { hmacSha256, unwrap } from "SnortUtils"; import useLogin from "Hooks/useLogin"; export interface ImgProxySettings { diff --git a/packages/app/src/Hooks/useInteractionCache.tsx b/packages/app/src/Hooks/useInteractionCache.tsx index d2aa74fe..999331e2 100644 --- a/packages/app/src/Hooks/useInteractionCache.tsx +++ b/packages/app/src/Hooks/useInteractionCache.tsx @@ -3,7 +3,7 @@ import { HexKey, u256 } from "@snort/nostr"; import { InteractionCache } from "Cache/EventInteractionCache"; import { EventInteraction } from "Db"; -import { sha256, unwrap } from "Util"; +import { sha256, unwrap } from "SnortUtils"; export function useInteractionCache(pubkey?: HexKey, event?: u256) { const id = event && pubkey ? sha256(event + pubkey) : undefined; diff --git a/packages/app/src/Hooks/useLoginHandler.tsx b/packages/app/src/Hooks/useLoginHandler.tsx index 94865c5c..aa7a3b8f 100644 --- a/packages/app/src/Hooks/useLoginHandler.tsx +++ b/packages/app/src/Hooks/useLoginHandler.tsx @@ -4,7 +4,7 @@ import { EmailRegex, MnemonicRegex } from "Const"; import { LoginStore } from "Login"; import { generateBip39Entropy, entropyToPrivateKey } from "nip6"; import { getNip05PubKey } from "Pages/LoginPage"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; export default function useLoginHandler() { const { formatMessage } = useIntl(); diff --git a/packages/app/src/Hooks/useModeration.tsx b/packages/app/src/Hooks/useModeration.tsx index ce20ad48..f4532240 100644 --- a/packages/app/src/Hooks/useModeration.tsx +++ b/packages/app/src/Hooks/useModeration.tsx @@ -2,7 +2,7 @@ import { HexKey } from "@snort/nostr"; import useEventPublisher from "Feed/EventPublisher"; import useLogin from "Hooks/useLogin"; import { setBlocked, setMuted } from "Login"; -import { appendDedupe } from "Util"; +import { appendDedupe } from "SnortUtils"; export default function useModeration() { const login = useLogin(); diff --git a/packages/app/src/Hooks/useRequestBuilder.tsx b/packages/app/src/Hooks/useRequestBuilder.tsx index a1bba65a..cf8ae450 100644 --- a/packages/app/src/Hooks/useRequestBuilder.tsx +++ b/packages/app/src/Hooks/useRequestBuilder.tsx @@ -1,7 +1,7 @@ import { useSyncExternalStore } from "react"; import { RequestBuilder, System } from "System"; import { EmptySnapshot, NoteStore, StoreSnapshot } from "System/NoteCollection"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; const useRequestBuilder = >( type: { new (): TStore }, diff --git a/packages/app/src/LNURL.ts b/packages/app/src/LNURL.ts index 2f80f692..1c3c3e01 100644 --- a/packages/app/src/LNURL.ts +++ b/packages/app/src/LNURL.ts @@ -1,6 +1,6 @@ import { HexKey, RawEvent } from "@snort/nostr"; import { EmailRegex } from "Const"; -import { bech32ToText, unwrap } from "Util"; +import { bech32ToText, unwrap } from "SnortUtils"; const PayServiceTag = "payRequest"; diff --git a/packages/app/src/Login/Functions.ts b/packages/app/src/Login/Functions.ts index 9be5e0a7..112b3fbd 100644 --- a/packages/app/src/Login/Functions.ts +++ b/packages/app/src/Login/Functions.ts @@ -5,7 +5,7 @@ import * as utils from "@noble/curves/abstract/utils"; import { DefaultRelays, SnortPubKey } from "Const"; import { LoginStore, UserPreferences, LoginSession } from "Login"; import { generateBip39Entropy, entropyToPrivateKey } from "nip6"; -import { bech32ToHex, dedupeById, randomSample, sanitizeRelayUrl, unixNowMs, unwrap } from "Util"; +import { bech32ToHex, dedupeById, randomSample, sanitizeRelayUrl, unixNowMs, unwrap } from "SnortUtils"; import { SubscriptionEvent } from "Subscription"; import { EventPublisher } from "System/EventPublisher"; diff --git a/packages/app/src/Login/MultiAccountStore.ts b/packages/app/src/Login/MultiAccountStore.ts index 916833a4..a7c5d5be 100644 --- a/packages/app/src/Login/MultiAccountStore.ts +++ b/packages/app/src/Login/MultiAccountStore.ts @@ -6,7 +6,7 @@ import { HexKey, RelaySettings } from "@snort/nostr"; import { DefaultRelays } from "Const"; import ExternalStore from "ExternalStore"; import { LoginSession } from "Login"; -import { deepClone, sanitizeRelayUrl, unwrap } from "Util"; +import { deepClone, sanitizeRelayUrl, unwrap } from "SnortUtils"; import { DefaultPreferences, UserPreferences } from "./Preferences"; const AccountStoreKey = "sessions"; diff --git a/packages/app/src/Nip05/Verifier.ts b/packages/app/src/Nip05/Verifier.ts index 5d02204f..51b23920 100644 --- a/packages/app/src/Nip05/Verifier.ts +++ b/packages/app/src/Nip05/Verifier.ts @@ -1,5 +1,5 @@ import DnsOverHttpResolver from "dns-over-http-resolver"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; const resolver = new DnsOverHttpResolver(); interface NostrJson { diff --git a/packages/app/src/Notifications.ts b/packages/app/src/Notifications.ts index 5dc28164..01a6b746 100644 --- a/packages/app/src/Notifications.ts +++ b/packages/app/src/Notifications.ts @@ -5,7 +5,7 @@ import { EventKind } from "@snort/nostr"; import { MetadataCache } from "Cache"; import { getDisplayName } from "Element/ProfileImage"; import { MentionRegex } from "Const"; -import { tagFilterOfTextRepost, unwrap } from "Util"; +import { tagFilterOfTextRepost, unwrap } from "SnortUtils"; import { UserCache } from "Cache/UserCache"; import { LoginSession } from "Login"; diff --git a/packages/app/src/Pages/ChatPage.tsx b/packages/app/src/Pages/ChatPage.tsx index 9c15b003..d1f3e691 100644 --- a/packages/app/src/Pages/ChatPage.tsx +++ b/packages/app/src/Pages/ChatPage.tsx @@ -1,6 +1,6 @@ import DmWindow from "Element/DmWindow"; import { useParams } from "react-router-dom"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; import "./ChatPage.css"; diff --git a/packages/app/src/Pages/DonatePage.tsx b/packages/app/src/Pages/DonatePage.tsx index 57be4a64..f5334df3 100644 --- a/packages/app/src/Pages/DonatePage.tsx +++ b/packages/app/src/Pages/DonatePage.tsx @@ -5,7 +5,7 @@ import { HexKey } from "@snort/nostr"; import { ApiHost, KieranPubKey, SnortPubKey } from "Const"; import ProfilePreview from "Element/ProfilePreview"; import ZapButton from "Element/ZapButton"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; import SnortApi, { RevenueSplit, RevenueToday } from "SnortApi"; const Developers = [ diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 415299a8..f57d9c51 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -23,7 +23,7 @@ import { mapPlanName } from "./subscribe"; import useLogin from "Hooks/useLogin"; import Avatar from "Element/Avatar"; import { useUserProfile } from "Hooks/useUserProfile"; -import { profileLink } from "Util"; +import { profileLink } from "SnortUtils"; import { getCurrentSubscription } from "Subscription"; import Toaster from "Toaster"; diff --git a/packages/app/src/Pages/LoginPage.tsx b/packages/app/src/Pages/LoginPage.tsx index 89165021..3f64c537 100644 --- a/packages/app/src/Pages/LoginPage.tsx +++ b/packages/app/src/Pages/LoginPage.tsx @@ -5,7 +5,7 @@ import { useNavigate } from "react-router-dom"; import { useIntl, FormattedMessage } from "react-intl"; import { HexKey } from "@snort/nostr"; -import { bech32ToHex, unwrap } from "Util"; +import { bech32ToHex, unwrap } from "SnortUtils"; import ZapButton from "Element/ZapButton"; import useImgProxy from "Hooks/useImgProxy"; import Icon from "Icons/Icon"; diff --git a/packages/app/src/Pages/MessagesPage.tsx b/packages/app/src/Pages/MessagesPage.tsx index 30fed4e7..15ca8d5f 100644 --- a/packages/app/src/Pages/MessagesPage.tsx +++ b/packages/app/src/Pages/MessagesPage.tsx @@ -5,7 +5,7 @@ import { HexKey, RawEvent, NostrPrefix } from "@snort/nostr"; import UnreadCount from "Element/UnreadCount"; import ProfileImage, { getDisplayName } from "Element/ProfileImage"; -import { dedupe, hexToBech32, unwrap } from "Util"; +import { dedupe, hexToBech32, unwrap } from "SnortUtils"; import NoteToSelf from "Element/NoteToSelf"; import useModeration from "Hooks/useModeration"; import { useDmCache } from "Hooks/useDmsCache"; diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index 195f0867..7c977ab6 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -4,7 +4,7 @@ import { FormattedMessage } from "react-intl"; import { useNavigate, useParams } from "react-router-dom"; import Spinner from "Icons/Spinner"; -import { parseNostrLink, profileLink } from "Util"; +import { parseNostrLink, profileLink } from "SnortUtils"; import { getNip05PubKey } from "Pages/LoginPage"; import { System } from "System"; diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications.tsx index 9cf9907c..c5a83077 100644 --- a/packages/app/src/Pages/Notifications.tsx +++ b/packages/app/src/Pages/Notifications.tsx @@ -4,7 +4,7 @@ import Timeline from "Element/Timeline"; import { TaskList } from "Tasks/TaskList"; import useLogin from "Hooks/useLogin"; import { markNotificationsRead } from "Login"; -import { unixNow } from "Util"; +import { unixNow } from "SnortUtils"; export default function NotificationsPage() { const login = useLogin(); diff --git a/packages/app/src/Pages/ProfilePage.tsx b/packages/app/src/Pages/ProfilePage.tsx index 1db6305c..c58fc6b7 100644 --- a/packages/app/src/Pages/ProfilePage.tsx +++ b/packages/app/src/Pages/ProfilePage.tsx @@ -4,7 +4,7 @@ import { useIntl, FormattedMessage } from "react-intl"; import { useNavigate, useParams } from "react-router-dom"; import { encodeTLV, EventKind, HexKey, NostrPrefix } from "@snort/nostr"; -import { parseNostrLink, getReactions, unwrap } from "Util"; +import { parseNostrLink, getReactions, unwrap } from "SnortUtils"; import { formatShort } from "Number"; import Note from "Element/Note"; import Bookmarks from "Element/Bookmarks"; @@ -23,7 +23,7 @@ import useModeration from "Hooks/useModeration"; import useZapsFeed from "Feed/ZapsFeed"; import { default as ZapElement } from "Element/Zap"; import FollowButton from "Element/FollowButton"; -import { parseId, hexToBech32 } from "Util"; +import { parseId, hexToBech32 } from "SnortUtils"; import Avatar from "Element/Avatar"; import Timeline from "Element/Timeline"; import Text from "Element/Text"; diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 0ac7cc2e..2ca863b8 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -7,7 +7,7 @@ import Tabs, { Tab } from "Element/Tabs"; import Timeline from "Element/Timeline"; import { System } from "System"; import { TimelineSubject } from "Feed/TimelineFeed"; -import { debounce, getRelayName, sha256, unixNow, unwrap } from "Util"; +import { debounce, getRelayName, sha256, unixNow, unwrap } from "SnortUtils"; import useLogin from "Hooks/useLogin"; import Discover from "Pages/Discover"; diff --git a/packages/app/src/Pages/SearchPage.tsx b/packages/app/src/Pages/SearchPage.tsx index 09ef2e2b..7e18cd66 100644 --- a/packages/app/src/Pages/SearchPage.tsx +++ b/packages/app/src/Pages/SearchPage.tsx @@ -3,7 +3,7 @@ import { useParams } from "react-router-dom"; import Timeline from "Element/Timeline"; import { Tab, TabElement } from "Element/Tabs"; import { useEffect, useState } from "react"; -import { debounce } from "Util"; +import { debounce } from "SnortUtils"; import { router } from "index"; import { SearchRelays } from "Const"; import { System } from "System"; diff --git a/packages/app/src/Pages/WalletPage.tsx b/packages/app/src/Pages/WalletPage.tsx index e0861694..e6ca2f92 100644 --- a/packages/app/src/Pages/WalletPage.tsx +++ b/packages/app/src/Pages/WalletPage.tsx @@ -7,7 +7,7 @@ import { FormattedMessage, FormattedNumber, useIntl } from "react-intl"; import NoteTime from "Element/NoteTime"; import { WalletInvoice, Sats, WalletInfo, WalletInvoiceState, useWallet, LNWallet, Wallets } from "Wallet"; import AsyncButton from "Element/AsyncButton"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { WebLNWallet } from "Wallet/WebLN"; import Icon from "Icons/Icon"; diff --git a/packages/app/src/Pages/ZapPool.tsx b/packages/app/src/Pages/ZapPool.tsx index 27935a8a..ca753c0d 100644 --- a/packages/app/src/Pages/ZapPool.tsx +++ b/packages/app/src/Pages/ZapPool.tsx @@ -8,7 +8,7 @@ import ProfilePreview from "Element/ProfilePreview"; import useLogin from "Hooks/useLogin"; import { System } from "System"; import { UploaderServices } from "Upload"; -import { bech32ToHex, getRelayName, unwrap } from "Util"; +import { bech32ToHex, getRelayName, unwrap } from "SnortUtils"; import { ZapPoolController, ZapPoolRecipient, ZapPoolRecipientType } from "ZapPoolController"; import { useUserProfile } from "Hooks/useUserProfile"; import AsyncButton from "Element/AsyncButton"; diff --git a/packages/app/src/Pages/new/ImportFollows.tsx b/packages/app/src/Pages/new/ImportFollows.tsx index f00fb0b2..3a1654c5 100644 --- a/packages/app/src/Pages/new/ImportFollows.tsx +++ b/packages/app/src/Pages/new/ImportFollows.tsx @@ -6,7 +6,7 @@ import { ApiHost } from "Const"; import Logo from "Element/Logo"; import AsyncButton from "Element/AsyncButton"; import FollowListBase from "Element/FollowListBase"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; import SnortApi from "SnortApi"; import useLogin from "Hooks/useLogin"; diff --git a/packages/app/src/Pages/new/NewUserFlow.tsx b/packages/app/src/Pages/new/NewUserFlow.tsx index 528f9da5..07ad76c7 100644 --- a/packages/app/src/Pages/new/NewUserFlow.tsx +++ b/packages/app/src/Pages/new/NewUserFlow.tsx @@ -4,7 +4,7 @@ import { useNavigate } from "react-router-dom"; import Logo from "Element/Logo"; import { CollapsedSection } from "Element/Collapsed"; import Copy from "Element/Copy"; -import { hexToBech32 } from "Util"; +import { hexToBech32 } from "SnortUtils"; import { hexToMnemonic } from "nip6"; import useLogin from "Hooks/useLogin"; import { PROFILE } from "."; diff --git a/packages/app/src/Pages/settings/Index.tsx b/packages/app/src/Pages/settings/Index.tsx index 7c929d41..202a96c3 100644 --- a/packages/app/src/Pages/settings/Index.tsx +++ b/packages/app/src/Pages/settings/Index.tsx @@ -4,7 +4,7 @@ import { useNavigate } from "react-router-dom"; import Icon from "Icons/Icon"; import { LoginStore, logout } from "Login"; import useLogin from "Hooks/useLogin"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { getCurrentSubscription } from "Subscription"; import { CollapsedSection } from "Element/Collapsed"; diff --git a/packages/app/src/Pages/settings/Keys.tsx b/packages/app/src/Pages/settings/Keys.tsx index e5220cf1..6882fdde 100644 --- a/packages/app/src/Pages/settings/Keys.tsx +++ b/packages/app/src/Pages/settings/Keys.tsx @@ -5,7 +5,7 @@ import { encodeTLV, NostrPrefix } from "@snort/nostr"; import Copy from "Element/Copy"; import useLogin from "Hooks/useLogin"; import { hexToMnemonic } from "nip6"; -import { hexToBech32 } from "Util"; +import { hexToBech32 } from "SnortUtils"; export default function ExportKeys() { const { publicKey, privateKey, generatedEntropy } = useLogin(); diff --git a/packages/app/src/Pages/settings/Preferences.tsx b/packages/app/src/Pages/settings/Preferences.tsx index 51be7be8..03b337ea 100644 --- a/packages/app/src/Pages/settings/Preferences.tsx +++ b/packages/app/src/Pages/settings/Preferences.tsx @@ -5,7 +5,7 @@ import { useEffect, useState } from "react"; import useLogin from "Hooks/useLogin"; import { DefaultPreferences, updatePreferences, UserPreferences } from "Login"; import { DefaultImgProxy } from "Const"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import messages from "./messages"; diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx index 87eaa9b8..5ce684e4 100644 --- a/packages/app/src/Pages/settings/Profile.tsx +++ b/packages/app/src/Pages/settings/Profile.tsx @@ -6,7 +6,7 @@ import { useNavigate } from "react-router-dom"; import useEventPublisher from "Feed/EventPublisher"; import { useUserProfile } from "Hooks/useUserProfile"; -import { openFile } from "Util"; +import { openFile } from "SnortUtils"; import useFileUpload from "Upload"; import AsyncButton from "Element/AsyncButton"; import { mapEventToProfile, UserCache } from "Cache"; diff --git a/packages/app/src/Pages/settings/RelayInfo.tsx b/packages/app/src/Pages/settings/RelayInfo.tsx index ac51b073..a02cca5d 100644 --- a/packages/app/src/Pages/settings/RelayInfo.tsx +++ b/packages/app/src/Pages/settings/RelayInfo.tsx @@ -2,7 +2,7 @@ import { FormattedMessage } from "react-intl"; import ProfilePreview from "Element/ProfilePreview"; import useRelayState from "Feed/RelayState"; import { useNavigate, useParams } from "react-router-dom"; -import { parseId, unwrap } from "Util"; +import { parseId, unwrap } from "SnortUtils"; import { System } from "System"; import { removeRelay } from "Login"; import useLogin from "Hooks/useLogin"; diff --git a/packages/app/src/Pages/settings/Relays.tsx b/packages/app/src/Pages/settings/Relays.tsx index 7cb7572e..f2f42435 100644 --- a/packages/app/src/Pages/settings/Relays.tsx +++ b/packages/app/src/Pages/settings/Relays.tsx @@ -1,7 +1,7 @@ import { useMemo, useState } from "react"; import { FormattedMessage } from "react-intl"; -import { randomSample, unixNowMs } from "Util"; +import { randomSample, unixNowMs } from "SnortUtils"; import Relay from "Element/Relay"; import useEventPublisher from "Feed/EventPublisher"; import { System } from "System"; diff --git a/packages/app/src/Pages/settings/wallet/Cashu.tsx b/packages/app/src/Pages/settings/wallet/Cashu.tsx index 02e4b728..3c41d72c 100644 --- a/packages/app/src/Pages/settings/wallet/Cashu.tsx +++ b/packages/app/src/Pages/settings/wallet/Cashu.tsx @@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import { v4 as uuid } from "uuid"; import AsyncButton from "Element/AsyncButton"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { WalletConfig, WalletKind, Wallets } from "Wallet"; import { useNavigate } from "react-router-dom"; diff --git a/packages/app/src/Pages/settings/wallet/LNC.tsx b/packages/app/src/Pages/settings/wallet/LNC.tsx index 85763c84..206d02a5 100644 --- a/packages/app/src/Pages/settings/wallet/LNC.tsx +++ b/packages/app/src/Pages/settings/wallet/LNC.tsx @@ -5,7 +5,7 @@ import { v4 as uuid } from "uuid"; import AsyncButton from "Element/AsyncButton"; import { LNWallet, WalletInfo, WalletKind, Wallets } from "Wallet"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; const ConnectLNC = () => { const { formatMessage } = useIntl(); diff --git a/packages/app/src/Pages/settings/wallet/LNDHub.tsx b/packages/app/src/Pages/settings/wallet/LNDHub.tsx index 869b1271..85ddc0fe 100644 --- a/packages/app/src/Pages/settings/wallet/LNDHub.tsx +++ b/packages/app/src/Pages/settings/wallet/LNDHub.tsx @@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import { v4 as uuid } from "uuid"; import AsyncButton from "Element/AsyncButton"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import LNDHubWallet from "Wallet/LNDHub"; import { WalletConfig, WalletKind, Wallets } from "Wallet"; import { useNavigate } from "react-router-dom"; diff --git a/packages/app/src/Pages/settings/wallet/NWC.tsx b/packages/app/src/Pages/settings/wallet/NWC.tsx index 84116fda..bd5e1feb 100644 --- a/packages/app/src/Pages/settings/wallet/NWC.tsx +++ b/packages/app/src/Pages/settings/wallet/NWC.tsx @@ -3,7 +3,7 @@ import { FormattedMessage, useIntl } from "react-intl"; import { v4 as uuid } from "uuid"; import AsyncButton from "Element/AsyncButton"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { WalletConfig, WalletKind, Wallets } from "Wallet"; import { Link, useNavigate } from "react-router-dom"; import { NostrConnectWallet } from "Wallet/NostrWalletConnect"; diff --git a/packages/app/src/Util.test.ts b/packages/app/src/SnortUtils/Utils.test.ts similarity index 69% rename from packages/app/src/Util.test.ts rename to packages/app/src/SnortUtils/Utils.test.ts index ef537689..83f10ff1 100644 --- a/packages/app/src/Util.test.ts +++ b/packages/app/src/SnortUtils/Utils.test.ts @@ -1,4 +1,6 @@ -import { splitByUrl, magnetURIDecode, getRelayName, validateNostrLink } from "./Util"; +import { NostrPrefix } from "@snort/nostr"; +import { parseNostrLink, tryParseNostrLink } from "."; +import { splitByUrl, magnetURIDecode, getRelayName } from "."; import { describe, expect } from "@jest/globals"; describe("splitByUrl", () => { @@ -92,19 +94,46 @@ describe("getRelayName", () => { }); }); -describe("validateNostrLink", () => { - test.each([ - "nostr:npub10elfcs4fr0l0r8af98jlmgdh9c8tcxjvz9qkw038js35mp4dma8qzvjptg", - "web+nostr:npub10elfcs4fr0l0r8af98jlmgdh9c8tcxjvz9qkw038js35mp4dma8qzvjptg", - "nostr:note15449edq4qa5wzgqvh8td0q0dp6hwtes4pknsrm7eygeenhlj99xsq94wu9", - "nostr:nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p", - "nostr:nevent1qqs226juks2sw68pyqxtn4khs8ksath9uc2smfcpalvjyvuemlezjngrd87dq", - "nostr:naddr1qqzkjurnw4ksz9thwden5te0wfjkccte9ehx7um5wghx7un8qgs2d90kkcq3nk2jry62dyf50k0h36rhpdtd594my40w9pkal876jxgrqsqqqa28pccpzu", - ])("should return true for valid nostr links", la => { - expect(validateNostrLink(la)).toBe(true); +describe("tryParseNostrLink", () => { + it("is a valid nostr link", () => { + expect(parseNostrLink("nostr:npub10elfcs4fr0l0r8af98jlmgdh9c8tcxjvz9qkw038js35mp4dma8qzvjptg")).toMatchObject({ + id: "7e7e9c42a91bfef19fa929e5fda1b72e0ebc1a4c1141673e2794234d86addf4e", + type: NostrPrefix.PublicKey, + }); + expect(parseNostrLink("web+nostr:npub10elfcs4fr0l0r8af98jlmgdh9c8tcxjvz9qkw038js35mp4dma8qzvjptg")).toMatchObject({ + id: "7e7e9c42a91bfef19fa929e5fda1b72e0ebc1a4c1141673e2794234d86addf4e", + type: NostrPrefix.PublicKey, + }); + expect(parseNostrLink("nostr:note15449edq4qa5wzgqvh8td0q0dp6hwtes4pknsrm7eygeenhlj99xsq94wu9")).toMatchObject({ + id: "a56a5cb4150768e1200cb9d6d781ed0eaee5e6150da701efd9223399dff2294d", + type: NostrPrefix.Note, + }); + expect( + parseNostrLink( + "nostr:nprofile1qqsrhuxx8l9ex335q7he0f09aej04zpazpl0ne2cgukyawd24mayt8gpp4mhxue69uhhytnc9e3k7mgpz4mhxue69uhkg6nzv9ejuumpv34kytnrdaksjlyr9p" + ) + ).toMatchObject({ + id: "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d", + type: NostrPrefix.Profile, + relays: ["wss://r.x.com", "wss://djbas.sadkb.com"], + }); + expect(parseNostrLink("nostr:nevent1qqs226juks2sw68pyqxtn4khs8ksath9uc2smfcpalvjyvuemlezjngrd87dq")).toMatchObject({ + id: "a56a5cb4150768e1200cb9d6d781ed0eaee5e6150da701efd9223399dff2294d", + type: NostrPrefix.Event, + }); + expect( + parseNostrLink( + "nostr:naddr1qqzkjurnw4ksz9thwden5te0wfjkccte9ehx7um5wghx7un8qgs2d90kkcq3nk2jry62dyf50k0h36rhpdtd594my40w9pkal876jxgrqsqqqa28pccpzu" + ) + ).toMatchObject({ + id: "ipsum", + type: NostrPrefix.Address, + relays: ["wss://relay.nostr.org"], + author: "a695f6b60119d9521934a691347d9f78e8770b56da16bb255ee286ddf9fda919", + kind: 30023, + }); }); - test.each(["nostr:npub", "web+nostr:npub", "nostr:nevent1xxx"])("should return false for invalid nostr links", lb => { - expect(validateNostrLink(lb)).toBe(false); + expect(tryParseNostrLink(lb)).toBeUndefined(); }); }); diff --git a/packages/app/src/Util.ts b/packages/app/src/SnortUtils/index.ts similarity index 96% rename from packages/app/src/Util.ts rename to packages/app/src/SnortUtils/index.ts index fb0acc55..7147666f 100644 --- a/packages/app/src/Util.ts +++ b/packages/app/src/SnortUtils/index.ts @@ -18,6 +18,7 @@ import { RawEvent, } from "@snort/nostr"; import { MetadataCache } from "Cache"; +import NostrLink from "Element/NostrLink"; export const sha256 = (str: string | Uint8Array): u256 => { return utils.bytesToHex(hash(str)); @@ -530,7 +531,15 @@ export function validateNostrLink(link: string): boolean { } } -export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLink | undefined { +export function tryParseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLink | undefined { + try { + return parseNostrLink(link, prefixHint); + } catch { + return undefined; + } +} + +export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLink { const entity = link.startsWith("web+nostr:") || link.startsWith("nostr:") ? link.split(":")[1] : link; const isPrefix = (prefix: NostrPrefix) => { @@ -539,6 +548,7 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin if (isPrefix(NostrPrefix.PublicKey)) { const id = bech32ToHex(entity); + if (id.length !== 64) throw new Error("Invalid nostr link, must contain 32 byte id"); return { type: NostrPrefix.PublicKey, id: id, @@ -546,6 +556,7 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin }; } else if (isPrefix(NostrPrefix.Note)) { const id = bech32ToHex(entity); + if (id.length !== 64) throw new Error("Invalid nostr link, must contain 32 byte id"); return { type: NostrPrefix.Note, id: id, @@ -563,6 +574,7 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin return entity; // return original }; if (isPrefix(NostrPrefix.Profile)) { + if (id.length !== 64) throw new Error("Invalid nostr link, must contain 32 byte id"); return { type: NostrPrefix.Profile, id, @@ -572,6 +584,7 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin encode, }; } else if (isPrefix(NostrPrefix.Event)) { + if (id.length !== 64) throw new Error("Invalid nostr link, must contain 32 byte id"); return { type: NostrPrefix.Event, id, @@ -596,9 +609,8 @@ export function parseNostrLink(link: string, prefixHint?: NostrPrefix): NostrLin id: link, encode: () => hexToBech32(prefixHint, link), }; - } else { - throw new Error("Invalid nostr link"); } + throw new Error("Invalid nostr link"); } export function sanitizeRelayUrl(url: string) { diff --git a/packages/app/src/Subscription/index.ts b/packages/app/src/Subscription/index.ts index e1faf8aa..6486f2b6 100644 --- a/packages/app/src/Subscription/index.ts +++ b/packages/app/src/Subscription/index.ts @@ -1,4 +1,4 @@ -import { unixNow } from "Util"; +import { unixNow } from "SnortUtils"; export enum SubscriptionType { Supporter = 0, diff --git a/packages/app/src/System/EventBuilder.ts b/packages/app/src/System/EventBuilder.ts index b2168432..0c353d77 100644 --- a/packages/app/src/System/EventBuilder.ts +++ b/packages/app/src/System/EventBuilder.ts @@ -1,6 +1,6 @@ import { EventKind, HexKey, NostrPrefix, RawEvent } from "@snort/nostr"; import { HashtagRegex } from "Const"; -import { getPublicKey, parseNostrLink, unixNow } from "Util"; +import { getPublicKey, parseNostrLink, unixNow } from "SnortUtils"; import { EventExt } from "./EventExt"; export class EventBuilder { diff --git a/packages/app/src/System/EventExt.ts b/packages/app/src/System/EventExt.ts index 934ff32b..305e34db 100644 --- a/packages/app/src/System/EventExt.ts +++ b/packages/app/src/System/EventExt.ts @@ -2,7 +2,7 @@ import * as secp from "@noble/curves/secp256k1"; import * as utils from "@noble/curves/abstract/utils"; import { EventKind, HexKey, RawEvent, Tag } from "@snort/nostr"; import base64 from "@protobufjs/base64"; -import { sha256, unixNow } from "Util"; +import { sha256, unixNow } from "SnortUtils"; export interface Thread { root?: Tag; diff --git a/packages/app/src/System/EventPublisher.ts b/packages/app/src/System/EventPublisher.ts index ac58686b..68e556dc 100644 --- a/packages/app/src/System/EventPublisher.ts +++ b/packages/app/src/System/EventPublisher.ts @@ -14,7 +14,7 @@ import { import { DefaultRelays } from "Const"; import { System } from "System"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { EventBuilder } from "./EventBuilder"; import { EventExt } from "./EventExt"; import { barrierQueue, processWorkQueue, WorkQueueItem } from "WorkQueue"; diff --git a/packages/app/src/System/GossipModel.ts b/packages/app/src/System/GossipModel.ts index 3b2ae236..596473c8 100644 --- a/packages/app/src/System/GossipModel.ts +++ b/packages/app/src/System/GossipModel.ts @@ -1,6 +1,6 @@ import { RawReqFilter } from "@snort/nostr"; import { UserRelays } from "Cache/UserRelayCache"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; const PickNRelays = 2; diff --git a/packages/app/src/System/NoteCollection.ts b/packages/app/src/System/NoteCollection.ts index 3363869b..cbae06a2 100644 --- a/packages/app/src/System/NoteCollection.ts +++ b/packages/app/src/System/NoteCollection.ts @@ -1,5 +1,5 @@ import { TaggedRawEvent, u256 } from "@snort/nostr"; -import { findTag } from "Util"; +import { findTag } from "SnortUtils"; export interface StoreSnapshot { data: TSnapshot | undefined; diff --git a/packages/app/src/System/ProfileCache.ts b/packages/app/src/System/ProfileCache.ts index fe96a8e4..12bc12b0 100644 --- a/packages/app/src/System/ProfileCache.ts +++ b/packages/app/src/System/ProfileCache.ts @@ -3,7 +3,7 @@ import { ProfileCacheExpire } from "Const"; import { mapEventToProfile, MetadataCache } from "Cache"; import { UserCache } from "Cache/UserCache"; import { PubkeyReplaceableNoteStore, RequestBuilder, System } from "System"; -import { unixNowMs } from "Util"; +import { unixNowMs } from "SnortUtils"; class ProfileLoaderService { /** diff --git a/packages/app/src/System/Query.ts b/packages/app/src/System/Query.ts index a0a2313d..36178492 100644 --- a/packages/app/src/System/Query.ts +++ b/packages/app/src/System/Query.ts @@ -1,6 +1,6 @@ import { v4 as uuid } from "uuid"; import { Connection, RawReqFilter, Nips } from "@snort/nostr"; -import { unixNowMs, unwrap } from "Util"; +import { unixNowMs, unwrap } from "SnortUtils"; import { NoteStore } from "./NoteCollection"; /** * Tracing for relay query status diff --git a/packages/app/src/System/RequestBuilder.ts b/packages/app/src/System/RequestBuilder.ts index 63a66f2d..5d3deb5d 100644 --- a/packages/app/src/System/RequestBuilder.ts +++ b/packages/app/src/System/RequestBuilder.ts @@ -1,5 +1,5 @@ import { RawReqFilter, u256, HexKey, EventKind } from "@snort/nostr"; -import { appendDedupe } from "Util"; +import { appendDedupe } from "SnortUtils"; /** * Which strategy is used when building REQ filters diff --git a/packages/app/src/System/index.ts b/packages/app/src/System/index.ts index ffeba073..02112fb1 100644 --- a/packages/app/src/System/index.ts +++ b/packages/app/src/System/index.ts @@ -1,6 +1,6 @@ import { AuthHandler, TaggedRawEvent, RelaySettings, Connection, RawReqFilter, RawEvent } from "@snort/nostr"; -import { sanitizeRelayUrl, unixNowMs, unwrap } from "Util"; +import { sanitizeRelayUrl, unixNowMs, unwrap } from "SnortUtils"; import { RequestBuilder } from "./RequestBuilder"; import { EventBuilder } from "./EventBuilder"; import { diff --git a/packages/app/src/Toaster.tsx b/packages/app/src/Toaster.tsx index 29a41379..e00f2ac6 100644 --- a/packages/app/src/Toaster.tsx +++ b/packages/app/src/Toaster.tsx @@ -2,7 +2,7 @@ import { ReactNode, useSyncExternalStore } from "react"; import { v4 as uuid } from "uuid"; import ExternalStore from "ExternalStore"; import Icon from "Icons/Icon"; -import { unixNow } from "Util"; +import { unixNow } from "SnortUtils"; import "./Toaster.css"; diff --git a/packages/app/src/Upload/VoidCat.ts b/packages/app/src/Upload/VoidCat.ts index 9dc7dfd6..60a46952 100644 --- a/packages/app/src/Upload/VoidCat.ts +++ b/packages/app/src/Upload/VoidCat.ts @@ -4,7 +4,7 @@ import { VoidApi } from "@void-cat/api"; import { FileExtensionRegex, VoidCatHost } from "Const"; import { EventPublisher } from "System/EventPublisher"; import { UploadResult } from "Upload"; -import { magnetURIDecode } from "Util"; +import { magnetURIDecode } from "SnortUtils"; /** * Upload file to void.cat diff --git a/packages/app/src/Upload/index.ts b/packages/app/src/Upload/index.ts index 9f286009..623f0ad4 100644 --- a/packages/app/src/Upload/index.ts +++ b/packages/app/src/Upload/index.ts @@ -5,7 +5,7 @@ import NostrBuild from "Upload/NostrBuild"; import VoidCat from "Upload/VoidCat"; import NostrImg from "Upload/NostrImg"; import { KieranPubKey } from "Const"; -import { bech32ToHex } from "Util"; +import { bech32ToHex } from "SnortUtils"; export interface UploadResult { url?: string; diff --git a/packages/app/src/Wallet/LNCWallet.ts b/packages/app/src/Wallet/LNCWallet.ts index fe8d8e37..fa861c44 100644 --- a/packages/app/src/Wallet/LNCWallet.ts +++ b/packages/app/src/Wallet/LNCWallet.ts @@ -1,5 +1,5 @@ import LNC from "@lightninglabs/lnc-web"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import { InvoiceRequest, LNWallet, diff --git a/packages/app/src/Wallet/index.ts b/packages/app/src/Wallet/index.ts index b00c67d9..aa93597d 100644 --- a/packages/app/src/Wallet/index.ts +++ b/packages/app/src/Wallet/index.ts @@ -1,7 +1,7 @@ import { useEffect, useSyncExternalStore } from "react"; import ExternalStore from "ExternalStore"; -import { decodeInvoice, unwrap } from "Util"; +import { decodeInvoice, unwrap } from "SnortUtils"; import LNDHubWallet from "./LNDHub"; import { NostrConnectWallet } from "./NostrWalletConnect"; import { setupWebLNWalletConfig, WebLNWallet } from "./WebLN"; @@ -135,7 +135,7 @@ export class WalletStore extends ExternalStore { this.#instance = new Map(); this.load(false); setupWebLNWalletConfig(this); - this.snapshotState(); + this.notifyChange(); } list() { diff --git a/packages/app/src/ZapPoolController.ts b/packages/app/src/ZapPoolController.ts index 052d0872..41148b7d 100644 --- a/packages/app/src/ZapPoolController.ts +++ b/packages/app/src/ZapPoolController.ts @@ -3,7 +3,7 @@ import { getDisplayName } from "Element/ProfileImage"; import ExternalStore from "ExternalStore"; import { LNURL } from "LNURL"; import { Toastore } from "Toaster"; -import { unixNow } from "Util"; +import { unixNow } from "SnortUtils"; import { LNWallet, WalletInvoiceState, Wallets } from "Wallet"; export enum ZapPoolRecipientType { diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index e3b5e458..82fa17a3 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -9,7 +9,7 @@ import { createBrowserRouter, RouterProvider } from "react-router-dom"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; import { IntlProvider } from "IntlProvider"; -import { unwrap } from "Util"; +import { unwrap } from "SnortUtils"; import Store from "State/Store"; import Layout from "Pages/Layout"; import LoginPage from "Pages/LoginPage"; diff --git a/packages/app/src/setupTests.js b/packages/app/src/setupTests.ts similarity index 59% rename from packages/app/src/setupTests.js rename to packages/app/src/setupTests.ts index 0b5fd4d5..4930f245 100644 --- a/packages/app/src/setupTests.js +++ b/packages/app/src/setupTests.ts @@ -1,4 +1,3 @@ -// @ts-expect-error - we have a folder called util so TS gets confused import { TextEncoder, TextDecoder } from "util"; Object.assign(global, { TextDecoder, TextEncoder });