diff --git a/.vscode/settings.json b/.vscode/settings.json index 6d7091d..0abbc74 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,6 @@ "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "always" - } + }, + "cSpell.words": ["Dexie"] } diff --git a/app/app/collection/[id]/page.tsx b/app/app/collection/[id]/page.tsx new file mode 100644 index 0000000..1585d3e --- /dev/null +++ b/app/app/collection/[id]/page.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { useAppState } from "@/hooks/useAppState"; +import { redirect } from "next/navigation"; +import { CollectionImageCard } from "@/components/collection/collection-image-card"; + +type ViewProps = { + params: { + id: string; + }; +}; + +export default function View({ params }: ViewProps) { + const collection = useAppState( + (state) => state.collections.published[params.id] + ); + if (!collection) redirect("/"); + + return ( +
+
+

{collection?.name}

+ {collection?.items.map((item, idx) => ( + + ))} +
+
+ ); +} diff --git a/app/app/create/page.tsx b/app/app/create/page.tsx index d4c461b..c85b153 100644 --- a/app/app/create/page.tsx +++ b/app/app/create/page.tsx @@ -25,7 +25,7 @@ export default function Create() { }, [create, destroy, activeDraft]); const collection = useMemo(() => { - if (activeDraft) return drafts[activeDraft]; + if (activeDraft && drafts[activeDraft]) return drafts[activeDraft]; create("New Collection"); return { id: "", items: [] }; }, [activeDraft, create, drafts]); @@ -62,7 +62,7 @@ export default function Create() { return (
-
+

New Collection

{collection.items.map((data, index) => ( @@ -93,7 +93,7 @@ export default function Create() { />
-
+
); } diff --git a/app/app/fonts/GeistMonoVF.woff b/app/app/fonts/GeistMonoVF.woff deleted file mode 100644 index f2ae185..0000000 Binary files a/app/app/fonts/GeistMonoVF.woff and /dev/null differ diff --git a/app/app/fonts/GeistVF.woff b/app/app/fonts/GeistVF.woff deleted file mode 100644 index 1b62daa..0000000 Binary files a/app/app/fonts/GeistVF.woff and /dev/null differ diff --git a/app/app/layout.tsx b/app/app/layout.tsx index 5e3bb16..5b66b78 100644 --- a/app/app/layout.tsx +++ b/app/app/layout.tsx @@ -1,25 +1,15 @@ import type { Metadata } from "next"; -import localFont from "next/font/local"; -import "./globals.css"; import { ThemeProvider } from "@/components/theme-provider"; import { Header } from "@/components/header"; import { AnchorWalletProvider } from "@/components/anchor-wallet-provider"; import { QueryProvider } from "@/components/query-provider"; -const geistSans = localFont({ - src: "./fonts/GeistVF.woff", - variable: "--font-geist-sans", - weight: "100 900", -}); -const geistMono = localFont({ - src: "./fonts/GeistMonoVF.woff", - variable: "--font-geist-mono", - weight: "100 900", -}); +import "./globals.css"; +import AppStateConsumer from "@/hooks/useAppState"; export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Content Ledger", + description: "A decentralized content ledger", }; export default function RootLayout({ @@ -29,26 +19,26 @@ export default function RootLayout({ }>) { return ( - + - - -
-
-
{children}
-
- 2024 © Content Ledger -
-
-
-
+ + + +
+
+
{children}
+ +
+
+
+
diff --git a/app/app/page.tsx b/app/app/page.tsx index 334dd5b..545cc31 100644 --- a/app/app/page.tsx +++ b/app/app/page.tsx @@ -1,52 +1,31 @@ -import Image from "next/image"; +"use client"; + +import { useAppState } from "@/hooks/useAppState"; export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - app/page.tsx - - . -
  2. -
  3. Save and see your changes instantly.
  4. -
+ const collections = useAppState((state) => state.collections.published); -
- - Vercel logomark - Deploy now - - - Read our docs - + return ( +
+
+

Collections

+
+ {Object.values(collections) + .filter((c) => c !== undefined) + .map((collection) => ( +
+
+
+

{collection.name}

+

+ {collection.items.length} items +

+
+
+ ))}
diff --git a/app/components/avatar-sns.tsx b/app/components/avatar-sns.tsx new file mode 100644 index 0000000..7727159 --- /dev/null +++ b/app/components/avatar-sns.tsx @@ -0,0 +1,24 @@ +import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar"; +import { PersonIcon } from "@radix-ui/react-icons"; +import { useConnection } from "@solana/wallet-adapter-react"; +import { usePrimaryDomain, useProfilePic } from "@bonfida/sns-react"; +import { PublicKey } from "@solana/web3.js"; + +export type AvatarSNSProps = { + publicKey: PublicKey; +}; + +export function AvatarSNS({ publicKey }: AvatarSNSProps) { + const { connection } = useConnection(); + const { domain } = usePrimaryDomain(connection, publicKey); + const { profileUrl } = useProfilePic(connection, domain); + + return ( + + + + + + + ); +} diff --git a/app/components/collection/collection-image-card.tsx b/app/components/collection/collection-image-card.tsx new file mode 100644 index 0000000..c118659 --- /dev/null +++ b/app/components/collection/collection-image-card.tsx @@ -0,0 +1,26 @@ +import { AspectRatio } from "@radix-ui/react-aspect-ratio"; +import { ImageWithFallback } from "../image-with-fallback"; +import { Collection } from "@/hooks/useCreateCollectionQuery"; +import { ImageIcon } from "@radix-ui/react-icons"; + +export type CollectionImageCardProps = { + item: Collection; +}; + +export function CollectionImageCard({ item }: CollectionImageCardProps) { + return ( +
+ + +
+ +
+
+
+
+

Collection Name

+

3 items

+
+
+ ); +} diff --git a/app/components/header.tsx b/app/components/header.tsx index 0cc2152..32485bf 100644 --- a/app/components/header.tsx +++ b/app/components/header.tsx @@ -1,3 +1,5 @@ +"use client"; + import { NavigationMenu, NavigationMenuItem, diff --git a/app/components/wallet-connection.tsx b/app/components/wallet-connection.tsx index 56c94eb..297b02e 100644 --- a/app/components/wallet-connection.tsx +++ b/app/components/wallet-connection.tsx @@ -17,6 +17,8 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { WalletName } from "@solana/wallet-adapter-base"; +import { AvatarSNS } from "./avatar-sns"; +import { usePrimaryDomain } from "@bonfida/sns-react"; //handle wallet balance fixed to 2 decimal numbers without rounding export function toFixed(num: number, fixed: number): string { @@ -27,6 +29,7 @@ export function toFixed(num: number, fixed: number): string { export function WalletConnection() { const { connection } = useConnection(); const { select, wallets, publicKey, disconnect, connecting } = useWallet(); + const { domain } = usePrimaryDomain(connection, publicKey); const [open, setOpen] = useState(false); const [balance, setBalance] = useState(null); @@ -88,11 +91,12 @@ export function WalletConnection() { - + Disconnect diff --git a/app/hooks/useAppState.ts b/app/hooks/useAppState.tsx similarity index 69% rename from app/hooks/useAppState.ts rename to app/hooks/useAppState.tsx index c287306..face7ae 100644 --- a/app/hooks/useAppState.ts +++ b/app/hooks/useAppState.tsx @@ -1,6 +1,9 @@ +"use client"; + import { create } from "zustand"; import { createJSONStorage, persist, StateStorage } from "zustand/middleware"; import { get, set, del } from "idb-keyval"; // can use anything: IndexedDB, Ionic Storage, etc. +import { useEffect } from "react"; type Collection = { id: string; @@ -20,10 +23,10 @@ type Collection = { type AppState = { collections: { published: { - [id: string]: Collection; + [id: string]: Collection | undefined; }; drafts: { - [id: string]: Collection; + [id: string]: Collection | undefined; }; activeDraft: string | null; }; @@ -37,6 +40,21 @@ type AppState = { }; }; +const storage: StateStorage = { + getItem: async (name: string): Promise => { + if (typeof indexedDB === "undefined") throw Error("indexedDB unavailable"); + return (await get(name)) || null; + }, + setItem: async (name: string, value: string): Promise => { + if (typeof indexedDB === "undefined") throw Error("indexedDB unavailable"); + await set(name, value); + }, + removeItem: async (name: string): Promise => { + if (typeof indexedDB === "undefined") throw Error("indexedDB unavailable"); + await del(name); + }, +}; + export const useAppState = create( persist>( (set) => ({ @@ -77,10 +95,18 @@ export const useAppState = create( ...state.collections, drafts: { ...state.collections.drafts, - [id]: { - ...state.collections.drafts[id], - items: [...state.collections.drafts[id].items, item], - }, + [id]: state.collections.drafts[id] + ? { + ...state.collections.drafts[id], + items: [...state.collections.drafts[id].items, item], + } + : { + id, + name: "", + createdAt: new Date().toISOString(), + items: [item], + meta: [], + }, }, }, })); @@ -91,14 +117,23 @@ export const useAppState = create( ...state.collections, drafts: { ...state.collections.drafts, - [id]: { - ...state.collections.drafts[id], - items: [ - ...state.collections.drafts[id].items.map((data, i) => - i === idx ? { ...data, ...item } : data - ), - ], - }, + [id]: state.collections.drafts[id] + ? { + ...state.collections.drafts[id], + items: [ + ...state.collections.drafts[id].items.map( + (data, i) => + i === idx ? { ...data, ...item } : data + ), + ], + } + : { + id, + name: "", + createdAt: new Date().toISOString(), + items: [item], + meta: [], + }, }, }, })); @@ -111,12 +146,14 @@ export const useAppState = create( ...state, collections: { ...state.collections, + /* published: Object.keys(state.collections.published) .filter((d) => d !== id) .reduce((acc, d) => { acc[d] = state.collections.published[d]; return acc; }, {} as AppState["collections"]["published"]), + */ drafts: Object.keys(state.collections.drafts) .filter((d) => d !== id) .reduce((acc, d) => { @@ -134,8 +171,9 @@ export const useAppState = create( publish: (id, meta) => { set((state) => { const draft = state.collections.drafts[id]; + if (!draft) return state; draft.items = draft.items.slice(0, meta.length); - draft.meta = { ...meta }; + draft.meta = [...meta]; return { ...state, collections: { @@ -159,25 +197,25 @@ export const useAppState = create( }), { name: "app-state", - storage: createJSONStorage(() => storage), + storage: createJSONStorage(() => { + if (typeof indexedDB === "undefined") + throw new Error("indexedDB unavailable"); + return storage; + }), partialize: (state) => ({ collections: state.collections, }), + skipHydration: true, } ) ); -const storage: StateStorage = { - getItem: async (name: string): Promise => { - if (typeof indexedDB === "undefined") return null; - return (await get(name)) || null; - }, - setItem: async (name: string, value: string): Promise => { - if (typeof indexedDB === "undefined") return; - await set(name, value); - }, - removeItem: async (name: string): Promise => { - if (typeof indexedDB === "undefined") return; - await del(name); - }, -}; +export default function AppStateConsumer({ + children, +}: React.PropsWithChildren) { + useEffect(() => { + useAppState.persist.rehydrate(); + }, []); + + return <>{children}; +} diff --git a/app/package.json b/app/package.json index bdc7666..edc918a 100644 --- a/app/package.json +++ b/app/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@akord/akord-js": "^5.13.0", + "@bonfida/sns-react": "^3.1.1", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-aspect-ratio": "^1.1.0", "@radix-ui/react-avatar": "^1.1.0", diff --git a/yarn.lock b/yarn.lock index 5d1cd45..0927c4f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -318,6 +318,38 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@bonfida/sns-react@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@bonfida/sns-react/-/sns-react-3.1.1.tgz#e22eb5e40d1bcf5af405b0618cccf1a6eb0969af" + integrity sha512-StkwkUsPAi6nOPgfoPHCSM2pMTECJZKJTCU0KQUh7eR1TzFqHLsbv/87UcRaKpbZSHQsYI/aVnG3IlNVk+zqwA== + dependencies: + "@bonfida/spl-name-service" "2.3.6" + +"@bonfida/sns-records@0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@bonfida/sns-records/-/sns-records-0.0.1.tgz#e178dece0aeeb1670c57703568ae3e1218e7e5fe" + integrity sha512-i28w9+BMFufhhpmLQCNx1CKKXTsEn+5RT18VFpPqdGO3sqaYlnUWC1m3wDpOvlzGk498dljgRpRo5wmcsnuEMg== + dependencies: + borsh "1.0.0" + bs58 "5.0.0" + buffer "^6.0.3" + +"@bonfida/spl-name-service@2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@bonfida/spl-name-service/-/spl-name-service-2.3.6.tgz#a25e5fbd0c337d5cb10230a5a0abce1f97cb321c" + integrity sha512-3i19tNeoU1pQMxHRrMCYa9/xF/mVFGu9O8Gk8moAJKh/pDxkI9bGVFrJUBO8PutvXGwrznKQu3RU75fMAs/vsg== + dependencies: + "@bonfida/sns-records" "0.0.1" + "@noble/curves" "^1.3.0" + "@scure/base" "^1.1.5" + "@solana/buffer-layout" "^4.0.1" + "@solana/spl-token" "0.3.9" + borsh "2.0.0" + buffer "^6.0.3" + graphemesplit "^2.4.4" + ipaddr.js "^2.1.0" + punycode "^2.3.1" + "@coral-xyz/anchor-errors@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" @@ -800,7 +832,7 @@ dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@^1.1.0", "@noble/curves@^1.4.2": +"@noble/curves@^1.1.0", "@noble/curves@^1.3.0", "@noble/curves@^1.4.2": version "1.6.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== @@ -1378,7 +1410,7 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA== -"@scure/base@~1.1.0", "@scure/base@~1.1.6": +"@scure/base@^1.1.5", "@scure/base@~1.1.0", "@scure/base@~1.1.6": version "1.1.8" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.8.tgz#8f23646c352f020c83bca750a82789e246d42b50" integrity sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg== @@ -1465,13 +1497,32 @@ optionalDependencies: "@react-native-async-storage/async-storage" "^1.17.7" -"@solana/buffer-layout@^4.0.1": +"@solana/buffer-layout-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/web3.js" "^1.32.0" + bigint-buffer "^1.1.5" + bignumber.js "^9.0.1" + +"@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== dependencies: buffer "~6.0.3" +"@solana/spl-token@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.3.9.tgz#477e703c3638ffb17dd29b82a203c21c3e465851" + integrity sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + buffer "^6.0.3" + "@solana/wallet-adapter-alpha@^0.1.10": version "0.1.10" resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-alpha/-/wallet-adapter-alpha-0.1.10.tgz#497ac17634dac4de17eba643768df9b30a13129a" @@ -1897,7 +1948,7 @@ "@solana/wallet-standard-core" "^1.1.1" "@solana/wallet-standard-wallet-adapter" "^1.1.2" -"@solana/web3.js@^1.36.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.95.0", "@solana/web3.js@^1.95.3": +"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.63.1", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.95.0", "@solana/web3.js@^1.95.3": version "1.95.3" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.3.tgz#70b5f4d76823f56b5af6403da51125fffeb65ff3" integrity sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og== @@ -3331,6 +3382,16 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +borsh@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-1.0.0.tgz#b564c8cc8f7a91e3772b9aef9e07f62b84213c1f" + integrity sha512-fSVWzzemnyfF89EPwlUNsrS5swF5CrtiN4e+h0/lLf4dz2he4L3ndM20PS9wj7ICSkXJe/TQUHdaPTq15b1mNQ== + +borsh@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-2.0.0.tgz#042a9f109565caac3c6a21297cd8c0ae8db3149d" + integrity sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg== + borsh@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" @@ -3432,6 +3493,13 @@ browserify-sign@^4.0.0: readable-stream "^2.3.8" safe-buffer "^5.2.1" +bs58@5.0.0, bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -3439,13 +3507,6 @@ bs58@^4.0.0, bs58@^4.0.1: dependencies: base-x "^3.0.2" -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - bs58check@2.1.2, bs58check@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" @@ -5009,6 +5070,14 @@ graphemer@^1.4.0: resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphemesplit@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/graphemesplit/-/graphemesplit-2.4.4.tgz#6d325c61e928efdaec2189f54a9b87babf89b75a" + integrity sha512-lKrpp1mk1NH26USxC/Asw4OHbhSQf5XfrWZ+CDv/dFVvd1j17kFgMotdJvOesmHkbFX9P9sBfpH8VogxOWLg8w== + dependencies: + js-base64 "^3.6.0" + unicode-trie "^2.0.0" + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -5210,6 +5279,11 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + iron-webcrypto@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz#aa60ff2aa10550630f4c0b11fd2442becdb35a6f" @@ -5547,7 +5621,7 @@ jiti@^1.21.0: resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== -js-base64@^3.7.5: +js-base64@^3.6.0, js-base64@^3.7.5: version "3.7.7" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== @@ -6340,6 +6414,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== + pako@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -6636,7 +6715,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -7625,6 +7704,11 @@ thread-stream@^0.15.1: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-inflate@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + tiny-secp256k1@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c" @@ -7867,6 +7951,14 @@ unfetch@^4.2.0: resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== +unicode-trie@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-2.0.0.tgz#8fd8845696e2e14a8b67d78fa9e0dd2cad62fec8" + integrity sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ== + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + unidragger@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/unidragger/-/unidragger-3.0.1.tgz#72b2e63f2571ca6e95a884b139dfec764e08c7f3"