diff --git a/docs/react-keyring.md b/docs/react-keyring.md index 5501f25cc..e9191e3f7 100644 --- a/docs/react-keyring.md +++ b/docs/react-keyring.md @@ -32,15 +32,15 @@ Must be used inside of a [`KeyringProvider`](#keyringprovider). #### `Authenticator.Form` -A `form` element designed to work with the [`Authenticator`](#authenticator) component. Any passed props will be passed along to the `form` element. +A `form` element designed to be used inside of an [`Authenticator`](#authenticator) component. Any passed props will be passed along to the `form` element. #### `Authenticator.Email` -An email `input` element designed to work with [`Authenticator.Form`](#authenticatorform). Any passed props will be passed along to the `input` component. +An email `input` element designed to be used inside of an [`Authenticator.Form`](#authenticatorform). Any passed props will be passed along to the `input` component. #### `Authenticator.CancelButton` -A `button` element that will cancel space registration, designed to work with [`Authenticator.Form`](#authenticatorform). Any passed props will be passed along to the `button` element. +A `button` element that will cancel space registration, designed to be used inside of an [`Authenticator.Form`](#authenticatorform). Any passed props will be passed along to the `button` element. ### `KeyringProvider` diff --git a/docs/react-uploader.md b/docs/react-uploader.md index bd774f93e..90e093b81 100644 --- a/docs/react-uploader.md +++ b/docs/react-uploader.md @@ -28,11 +28,13 @@ Top-level component of the headless Uploader. Designed to be used with [`Uploader.Form`](#uploaderform) and [`Uploader.Input`](#uploaderinput) to easily create a custom component for uploading files to web3.storage. +Must be used inside of an [`UploaderProvider`](#uploaderprovider). + #### `Uploader.Form` Form component for the headless Uploader. -Renders a `form` element designed to work with [`Uploader`](#uploader) that will send files from an [`Uploader.Input`](#uploaderinput) component to the web3.storage service when the form is submitted. +Renders a `form` element designed to be used inside of an [`Uploader`](#uploader) that will send files from an [`Uploader.Input`](#uploaderinput) component to the web3.storage service when the form is submitted. Any passed props will be passed along to the `input` element. @@ -40,7 +42,7 @@ Any passed props will be passed along to the `input` element. Input component for the headless Uploader. -Renders a file `input` element designed to work with [`Uploader`](#uploader). When used inside of an [`Uploader.Form`](#uploaderform), files added to the input will be uploaded when the form is submitted. +Renders a file `input` element designed to be used inside of an [`Uploader`](#uploader). When used inside of an [`Uploader.Form`](#uploaderform), files added to the input will be uploaded when the form is submitted. ### `UploaderProvider` diff --git a/docs/react-uploads-list.md b/docs/react-uploads-list.md index c86f2614b..a5bcc1683 100644 --- a/docs/react-uploads-list.md +++ b/docs/react-uploads-list.md @@ -28,11 +28,13 @@ Top-level component of the headless UploadsList. Designed to be used with [`UploadsList.NextButton`](#uploadslistnextbutton), [`UploadsList.ReloadButton`](#uploadslistreloadbutton), etc to easily create a custom component for listing uploads in a web3.storage space. +Must be used inside of an [`UploadsListProvider`](#uploadslistprovider). + #### `UploadsList.NextButton` Button that loads the next page of results in an UploadsList. -Renders a `button` element designed to work with [`UploadsList`](#uploadslist). When pressed, will request the next page of uploads from the service. +Renders a `button` element designed to be used inside of an [`UploadsList`](#uploadslist). When pressed, will request the next page of uploads from the service. Any passed props will be passed along to the `button` element. @@ -40,7 +42,7 @@ Any passed props will be passed along to the `button` element. Button that reloads an UploadsList. -Renders a `button` element designed to work with [`UploadsList`](#uploadslist). When pressed, will reload list data from the service. +Renders a `button` element designed to be used inside of an [`UploadsList`](#uploadslist). When pressed, will reload list data from the service. Any passed props will be passed along to the `button` element. diff --git a/examples/react/w3console/package.json b/examples/react/w3console/package.json index 9d62701ab..5d2a9804e 100644 --- a/examples/react/w3console/package.json +++ b/examples/react/w3console/package.json @@ -14,11 +14,9 @@ "@heroicons/react": "^2.0.17", "@ipld/car": "^5.1.0", "@ipld/dag-ucan": "^3.2.0", - "@w3ui/keyring-core": "workspace:^", "@w3ui/react-keyring": "workspace:^", "@w3ui/react-uploader": "workspace:^", "@w3ui/react-uploads-list": "workspace:^", - "@w3ui/uploader-core": "workspace:^", "blueimp-md5": "^2.19.0", "preact": "^10.11.3", "react-router-dom": "^6.9.0" diff --git a/examples/react/w3console/src/components/Authenticator.tsx b/examples/react/w3console/src/components/Authenticator.tsx index aca4a7ca6..b1d231646 100644 --- a/examples/react/w3console/src/components/Authenticator.tsx +++ b/examples/react/w3console/src/components/Authenticator.tsx @@ -3,6 +3,7 @@ import { useAuthenticator } from '@w3ui/react-keyring' import { serviceName, tosUrl, Logo } from '../brand' +import Loader from './Loader' export function AuthenticationForm (): JSX.Element { const [{ submitted }] = useAuthenticator() @@ -10,7 +11,7 @@ export function AuthenticationForm (): JSX.Element {
- +
@@ -43,7 +44,7 @@ export function AuthenticationSubmitted (): JSX.Element {
- +

Verify your email address!

@@ -62,7 +63,7 @@ export function AuthenticationEnsurer ({ }: { children: JSX.Element | JSX.Element[] }): JSX.Element { - const [{ submitted, account }] = useAuthenticator() + const [{ submitted, account, agent }] = useAuthenticator() const authenticated = !!account if (authenticated) { return <>{children} @@ -70,7 +71,10 @@ export function AuthenticationEnsurer ({ if (submitted) { return } - return + if (agent) { + return + } + return } diff --git a/examples/react/w3console/src/components/Loader.tsx b/examples/react/w3console/src/components/Loader.tsx index 4e0218cf6..d12bd9830 100644 --- a/examples/react/w3console/src/components/Loader.tsx +++ b/examples/react/w3console/src/components/Loader.tsx @@ -1,5 +1,5 @@ import { ArrowPathIcon } from '@heroicons/react/20/solid' -export default ({ className = '' }: { className?: 'string' }) => ( +export default ({ className = '' }: { className?: string }) => ( ) diff --git a/examples/react/w3console/src/components/SpaceEnsurer.tsx b/examples/react/w3console/src/components/SpaceEnsurer.tsx new file mode 100644 index 000000000..b6a51a4d2 --- /dev/null +++ b/examples/react/w3console/src/components/SpaceEnsurer.tsx @@ -0,0 +1,27 @@ +import { useKeyring } from '@w3ui/react-keyring'; +import { SpaceCreatorForm } from './SpaceCreator'; + +export function SpaceEnsurer ({ + children +}: { + children: JSX.Element | JSX.Element[]; +}): JSX.Element | JSX.Element[]{ + const [{ spaces, account }] = useKeyring(); + if (spaces && spaces.length > 0) { + return children; + } + return ( +

+
+

Welcome {account}!

+

+ To get started with w3up you'll need to create a space. +

+

+ Give it a name and hit create! +

+ +
+
+ ); +} diff --git a/examples/react/w3console/src/components/SpaceFinder.tsx b/examples/react/w3console/src/components/SpaceFinder.tsx index ee4c81e51..f7d8b4782 100644 --- a/examples/react/w3console/src/components/SpaceFinder.tsx +++ b/examples/react/w3console/src/components/SpaceFinder.tsx @@ -1,4 +1,4 @@ -import type { Space } from '@w3ui/keyring-core' +import type { Space } from '@w3ui/react-keyring' import React, { Fragment, useState } from 'react' import { Combobox, Transition } from '@headlessui/react' diff --git a/examples/react/w3console/src/components/SpaceRegistrar.tsx b/examples/react/w3console/src/components/SpaceRegistrar.tsx new file mode 100644 index 000000000..0de68da09 --- /dev/null +++ b/examples/react/w3console/src/components/SpaceRegistrar.tsx @@ -0,0 +1,41 @@ +import { useState } from 'react'; +import { useKeyring } from '@w3ui/react-keyring'; +import Loader from './Loader'; + +export function SpaceRegistrar (): JSX.Element { + const [{ account }, { registerSpace }] = useKeyring(); + const [submitted, setSubmitted] = useState(false); + async function onSubmit (e: React.MouseEvent): Promise { + e.preventDefault(); + if (account) { + setSubmitted(true); + try { + await registerSpace(account, { provider: import.meta.env.VITE_W3UP_PROVIDER }); + } catch (err) { + console.log(err); + throw new Error('failed to register', { cause: err }); + } finally { + setSubmitted(false); + } + } else { + throw new Error('cannot register space, no account found, have you authorized your email?'); + } + } + return ( +
+
+

This space is not yet registered.

+

+ Click the button below to register this space and start uploading. +

+
+
+ {submitted ? ( + + ) : ( + + )} +
+
+ ); +} diff --git a/examples/react/w3console/src/components/SpaceSection.tsx b/examples/react/w3console/src/components/SpaceSection.tsx new file mode 100644 index 000000000..5d37d5ecd --- /dev/null +++ b/examples/react/w3console/src/components/SpaceSection.tsx @@ -0,0 +1,79 @@ +import { useEffect } from 'react'; +import { useKeyring } from '@w3ui/react-keyring'; +import { useUploadsList } from '@w3ui/react-uploads-list'; +import { ShareIcon } from '@heroicons/react/20/solid'; +import md5 from 'blueimp-md5'; +import { SpaceShare } from '../share'; +import { Uploader } from './Uploader'; +import { UploadsList } from './UploadsList'; +import { SpaceRegistrar } from './SpaceRegistrar'; + +interface SpaceSectionProps { + viewSpace: (did: string) => void; + setShare: (share: boolean) => void; + share: boolean; +} +export function SpaceSection (props: SpaceSectionProps): JSX.Element { + const { viewSpace, share, setShare } = props; + const [{ space }] = useKeyring(); + const [, { reload }] = useUploadsList(); + // reload the uploads list when the space changes + // TODO: this currently does a network request - we'd like to just reset + // to the latest state we have and revalidate in the background (SWR) + // but it's not clear how all that state should work yet - perhaps + // we need some sort of state management primitive in the uploads list? + useEffect(() => { + void reload(); + }, [space]); + const registered = Boolean(space?.registered()); + return ( +
+
+ {space !== undefined && ( +
+ +
+

+ {space.name() ?? 'Untitled'} +

+ +
+ +
+ )} +
+
+ {share && } + {registered && !share && ( + <> + { + void reload(); + }} /> +
+ +
+ + )} + {(space && !registered) && !share && } + {!space && ( +
+

Select a space from the dropdown on the left to get started.

+
+ )} +
+
+ ); +} diff --git a/examples/react/w3console/src/components/Uploader.tsx b/examples/react/w3console/src/components/Uploader.tsx index 898fd1659..0ce6fbbc4 100644 --- a/examples/react/w3console/src/components/Uploader.tsx +++ b/examples/react/w3console/src/components/Uploader.tsx @@ -1,8 +1,10 @@ -import type { OnUploadComplete } from '@w3ui/react-uploader' +import type { + OnUploadComplete, + CARMetadata, + CID +} from '@w3ui/react-uploader' -import { Link, Version } from 'multiformats' import { CloudArrowUpIcon } from '@heroicons/react/24/outline' -import { CARMetadata } from '@w3ui/uploader-core' import { Status, Uploader as UploaderCore, @@ -38,7 +40,7 @@ export const Errored = ({ error }: { error: any }): JSX.Element => ( interface DoneProps { file?: File - dataCID?: Link + dataCID?: CID storedDAGShards?: CARMetadata[] } diff --git a/examples/react/w3console/src/components/W3API.tsx b/examples/react/w3console/src/components/W3API.tsx index ae3ece772..eb302b1b7 100644 --- a/examples/react/w3console/src/components/W3API.tsx +++ b/examples/react/w3console/src/components/W3API.tsx @@ -1,5 +1,4 @@ -import React, { useMemo } from 'react' -import { ServiceConfig } from '@w3ui/uploader-core' +import { useMemo } from 'react' import { useUploader, UploaderContextValue, @@ -22,9 +21,6 @@ export interface W3APIContextValue { uploader: UploaderContextValue uploadsList: UploadsListContextValue } -export interface UploaderProviderProps extends ServiceConfig { - children?: JSX.Element -} export interface W3APIProviderProps { children: JSX.Element | JSX.Element[] diff --git a/examples/react/w3console/src/pages/SpaceSelector.tsx b/examples/react/w3console/src/pages/SpaceSelector.tsx new file mode 100644 index 000000000..b37a301ed --- /dev/null +++ b/examples/react/w3console/src/pages/SpaceSelector.tsx @@ -0,0 +1,19 @@ +import type { Space } from '@w3ui/react-keyring'; +import { SpaceFinder } from '../components/SpaceFinder'; + +export function SpaceSelector (props: any): JSX.Element { + const { selected, setSelected, spaces } = props; + return ( +
+

+ Spaces +

+ { + void setSelected(space.did()); + }} /> +
+ ); +} diff --git a/examples/react/w3console/src/pages/index.tsx b/examples/react/w3console/src/pages/index.tsx index 8b9d2d33d..4f70eddb1 100644 --- a/examples/react/w3console/src/pages/index.tsx +++ b/examples/react/w3console/src/pages/index.tsx @@ -1,177 +1,13 @@ -import type { ChangeEvent } from 'react' -import type { Space } from '@w3ui/keyring-core' -import { useEffect, useState } from 'react' +import { useState } from 'react' import { DIDKey } from '@ucanto/interface' import { useKeyring } from '@w3ui/react-keyring' -import { useUploadsList } from '@w3ui/react-uploads-list' -import { ShareIcon } from '@heroicons/react/20/solid' -import md5 from 'blueimp-md5' -import { SpaceShare } from '../share' -import { Uploader } from '../components/Uploader' -import { UploadsList } from '../components/UploadsList' -import { SpaceFinder } from '../components/SpaceFinder' -import { SpaceCreatorForm } from '../components/SpaceCreator' import { AuthenticationEnsurer } from '../components/Authenticator' import { DefaultLayout } from '../components/Layout' -import Loader from '../components/Loader' - -function SpaceRegistrar (): JSX.Element { - const [{ account }, { registerSpace }] = useKeyring() - const [submitted, setSubmitted] = useState(false) - async function onSubmit (e: React.MouseEvent): Promise { - e.preventDefault() - if (account) { - setSubmitted(true) - try { - await registerSpace(account, { provider: import.meta.env.VITE_W3UP_PROVIDER }) - } catch (err) { - console.log(err) - throw new Error('failed to register', { cause: err }) - } finally { - setSubmitted(false) - } - } else { - throw new Error('cannot register space, no account found, have you authorized your email?') - } - } - return ( -
-
-

This space is not yet registered.

-

- Click the button below to register this space and start uploading. -

-
-
- {submitted ? ( - - ) : ( - - )} -
-
- ) -} - -interface SpaceSectionProps { - viewSpace: (did: string) => void - setShare: (share: boolean) => void - share: boolean -} - -function SpaceSection (props: SpaceSectionProps): JSX.Element { - const { viewSpace, share, setShare } = props - const [{ space }] = useKeyring() - const [, { reload }] = useUploadsList() - // reload the uploads list when the space changes - // TODO: this currently does a network request - we'd like to just reset - // to the latest state we have and revalidate in the background (SWR) - // but it's not clear how all that state should work yet - perhaps - // we need some sort of state management primitive in the uploads list? - useEffect(() => { - void reload() - }, [space]) - const registered = Boolean(space?.registered()) - return ( -
-
- {space !== undefined && ( -
- -
-

- {space.name() ?? 'Untitled'} -

- -
- -
- )} -
-
- {share && } - {registered && !share && ( - <> - { - void reload() - }} - /> -
- -
- - )} - {(space && !registered) && !share && } - {!space && ( -
-

Select a space from the dropdown on the left to get started.

-
- )} -
-
- ) -} - -function SpaceSelector (props: any): JSX.Element { - const { selected, setSelected, spaces } = props - return ( -
-

- Spaces -

- { - void setSelected(space.did()) - }} - /> -
- ) -} - - -export function SpaceEnsurer ({ - children -}: { - children: JSX.Element | JSX.Element[] -}): JSX.Element { - const [{ spaces, account }] = useKeyring() - if (spaces && spaces.length > 0) { - return <>{children} - } - return ( -
-
-

Welcome {account}!

-

- To get started with w3up you'll need to create a space. -

-

- Give it a name and hit create! -

- -
-
- ) -} - +import { SpaceEnsurer } from '../components/SpaceEnsurer' +import { SpaceSection } from '../components/SpaceSection' +import { SpaceSelector } from './SpaceSelector' export default function Home (): JSX.Element { const [share, setShare] = useState(false) diff --git a/packages/react-keyring/src/index.ts b/packages/react-keyring/src/index.ts index 52a2aafdd..d64a34f83 100644 --- a/packages/react-keyring/src/index.ts +++ b/packages/react-keyring/src/index.ts @@ -1,2 +1,3 @@ +export type { Space } from '@w3ui/keyring-core' export * from './providers/Keyring' export * from './Authenticator' diff --git a/packages/react-uploader/package.json b/packages/react-uploader/package.json index 0e83276c4..ccaa213a8 100644 --- a/packages/react-uploader/package.json +++ b/packages/react-uploader/package.json @@ -33,8 +33,7 @@ "@w3ui/react-keyring": "workspace:^", "@w3ui/uploader-core": "workspace:^", "@web3-storage/capabilities": "^4.0.0", - "ariakit-react-utils": "0.17.0-next.27", - "multiformats": "^11.0.1" + "ariakit-react-utils": "0.17.0-next.27" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" diff --git a/packages/react-uploader/src/Uploader.tsx b/packages/react-uploader/src/Uploader.tsx index a06f74298..bb0138e5a 100644 --- a/packages/react-uploader/src/Uploader.tsx +++ b/packages/react-uploader/src/Uploader.tsx @@ -1,5 +1,11 @@ import type { As, Component, Props, Options } from 'ariakit-react-utils' import type { ChangeEvent } from 'react' +import type { + CID, + CARMetadata, + UploaderContextState, + UploaderContextActions +} from '@w3ui/uploader-core' import React, { useContext, @@ -10,12 +16,6 @@ import React, { Fragment } from 'react' import { createComponent, createElement } from 'ariakit-react-utils' -import { Link, Version } from 'multiformats' -import { - CARMetadata, - UploaderContextState, - UploaderContextActions -} from '@w3ui/uploader-core' import { useUploader } from './providers/Uploader' export enum Status { @@ -46,7 +46,7 @@ export type UploaderComponentContextState = UploaderContextState & { /** * The CID of a successful upload */ - dataCID?: Link + dataCID?: CID /** * Shards of a DAG uploaded to web3.storage */ @@ -86,7 +86,7 @@ const UploaderComponentContext = createContext([ interface OnUploadCompleteProps { file?: File - dataCID?: Link + dataCID?: CID } export type OnUploadComplete = (props: OnUploadCompleteProps) => void @@ -94,9 +94,7 @@ export type OnUploadComplete = (props: OnUploadCompleteProps) => void export type UploaderRootOptions = Options & { onUploadComplete?: OnUploadComplete } -export type UploaderRootProps = Props< -UploaderRootOptions -> +export type UploaderRootProps = Props> /** * Top level component of the headless Uploader. @@ -110,7 +108,7 @@ export const UploaderRoot: Component = createComponent( const [uploaderState, uploaderActions] = useUploader() const [file, setFile] = useState() const [dataCID, setDataCID] = - useState>() + useState() const [status, setStatus] = useState(Status.Idle) const [error, setError] = useState() diff --git a/packages/react-uploader/src/index.ts b/packages/react-uploader/src/index.ts index 365fbbc02..172c9f8a3 100644 --- a/packages/react-uploader/src/index.ts +++ b/packages/react-uploader/src/index.ts @@ -1,4 +1,4 @@ -export type { Service, CARMetadata } from '@w3ui/uploader-core' +export type { Service, CARMetadata, CID } from '@w3ui/uploader-core' export { uploadFile, uploadDirectory } from '@w3ui/uploader-core' export * from './providers/Uploader' export * from './Uploader' diff --git a/packages/solid-keyring/src/index.ts b/packages/solid-keyring/src/index.ts index 533234ac5..ed3ff4f86 100644 --- a/packages/solid-keyring/src/index.ts +++ b/packages/solid-keyring/src/index.ts @@ -1 +1,2 @@ +export type { Space } from '@w3ui/keyring-core' export * from './providers/Keyring' diff --git a/packages/solid-uploader/src/index.ts b/packages/solid-uploader/src/index.ts index 3e5dc9727..7013d8736 100644 --- a/packages/solid-uploader/src/index.ts +++ b/packages/solid-uploader/src/index.ts @@ -1,3 +1,3 @@ -export type { Service, CARMetadata } from '@w3ui/uploader-core' +export type { Service, CARMetadata, CID } from '@w3ui/uploader-core' export { uploadFile, uploadDirectory } from '@w3ui/uploader-core' export * from './providers/Uploader' diff --git a/packages/uploader-core/src/index.ts b/packages/uploader-core/src/index.ts index 6845b247f..168b25f72 100644 --- a/packages/uploader-core/src/index.ts +++ b/packages/uploader-core/src/index.ts @@ -6,6 +6,7 @@ export { uploadFile, uploadDirectory } from '@web3-storage/upload-client' export type { CARMetadata, Service } +export type CID = Link export interface UploaderContextState { storedDAGShards: CARMetadata[] } @@ -19,11 +20,11 @@ export interface UploaderContextActions { /** * Upload a single file to the current space. */ - uploadFile: (file: Blob) => Promise> + uploadFile: (file: Blob) => Promise /** * Upload a directory of files to the current space. */ uploadDirectory: ( files: File[] - ) => Promise> + ) => Promise } diff --git a/packages/vue-keyring/src/index.ts b/packages/vue-keyring/src/index.ts index 533234ac5..ed3ff4f86 100644 --- a/packages/vue-keyring/src/index.ts +++ b/packages/vue-keyring/src/index.ts @@ -1 +1,2 @@ +export type { Space } from '@w3ui/keyring-core' export * from './providers/Keyring' diff --git a/packages/vue-uploader/src/index.ts b/packages/vue-uploader/src/index.ts index 19f63d3ae..451a17d82 100644 --- a/packages/vue-uploader/src/index.ts +++ b/packages/vue-uploader/src/index.ts @@ -1,4 +1,4 @@ export { uploadFile, uploadDirectory } from '@w3ui/uploader-core' -export type { Service, CARMetadata } from '@w3ui/uploader-core' +export type { Service, CARMetadata, CID } from '@w3ui/uploader-core' export * from './providers/Uploader' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccd56ccf2..611ca5ebf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,11 +242,9 @@ importers: '@types/blueimp-md5': ^2.18.0 '@ucanto/core': ^5.2.0 '@ucanto/interface': ^6.2.0 - '@w3ui/keyring-core': workspace:^ '@w3ui/react-keyring': workspace:^ '@w3ui/react-uploader': workspace:^ '@w3ui/react-uploads-list': workspace:^ - '@w3ui/uploader-core': workspace:^ autoprefixer: ^10.4.13 blueimp-md5: ^2.19.0 postcss: ^8.4.21 @@ -260,11 +258,9 @@ importers: '@heroicons/react': 2.0.17 '@ipld/car': 5.1.0 '@ipld/dag-ucan': 3.2.0 - '@w3ui/keyring-core': link:../../../packages/keyring-core '@w3ui/react-keyring': link:../../../packages/react-keyring '@w3ui/react-uploader': link:../../../packages/react-uploader '@w3ui/react-uploads-list': link:../../../packages/react-uploads-list - '@w3ui/uploader-core': link:../../../packages/uploader-core blueimp-md5: 2.19.0 preact: 10.11.3 react-router-dom: 6.9.0 @@ -515,13 +511,11 @@ importers: '@w3ui/uploader-core': workspace:^ '@web3-storage/capabilities': ^4.0.0 ariakit-react-utils: 0.17.0-next.27 - multiformats: ^11.0.1 dependencies: '@w3ui/react-keyring': link:../react-keyring '@w3ui/uploader-core': link:../uploader-core '@web3-storage/capabilities': 4.0.0 ariakit-react-utils: 0.17.0-next.27 - multiformats: 11.0.1 devDependencies: '@testing-library/react': 13.4.0 '@testing-library/user-event': 14.4.3 @@ -3326,7 +3320,7 @@ packages: dependencies: '@ipld/dag-cbor': 9.0.0 cborg: 1.10.0 - multiformats: 11.0.1 + multiformats: 11.0.2 varint: 6.0.0 dev: false @@ -3351,7 +3345,7 @@ packages: engines: {node: '>=16.0.0', npm: '>=7.0.0'} dependencies: cborg: 1.10.1 - multiformats: 11.0.1 + multiformats: 11.0.2 /@ipld/dag-pb/4.0.2: resolution: {integrity: sha512-me9oEPb7UNPWSplUFCXyxnQE3/WlsjOljqO2RZN44XOmGkBY0/WVklbXorVE1eiv0Rt3p6dBS2x36Rq8A0Am8A==} @@ -3365,7 +3359,7 @@ packages: dependencies: '@ipld/dag-cbor': 9.0.0 '@ipld/dag-json': 10.0.0 - multiformats: 11.0.1 + multiformats: 11.0.2 /@ipld/unixfs/2.1.1: resolution: {integrity: sha512-g3gr/3XvfQs4x2VFjlICae09ul5fbWCKRInN6Vgeot2+GH0h/krr3PqZCIo4dy4Ou2mQOsIddxUvG8UZ4p9SbQ==}