diff --git a/packages/react-hooks/package.json b/packages/react-hooks/package.json index 46945b30..6645fac6 100644 --- a/packages/react-hooks/package.json +++ b/packages/react-hooks/package.json @@ -25,17 +25,16 @@ "test": "jest" }, "dependencies": { - "@aries-framework/question-answer": "^0.4.0", - "@types/node-fetch": "^2", "rxjs": "^7.2.0" }, "devDependencies": { - "@aries-framework/core": "0.4.0", - "react": "^18.0.0", + "@aries-framework/core": "^0.4.2", + "@aries-framework/question-answer": "^0.4.2", "@types/react": "^18.2.14" }, "peerDependencies": { - "@aries-framework/core": "^0.4.0", + "@aries-framework/question-answer": "^0.4.2", + "@aries-framework/core": "^0.4.2", "react": ">=17.0.0 <19.0.0" } } diff --git a/packages/react-hooks/src/AgentProvider.tsx b/packages/react-hooks/src/AgentProvider.tsx index cf68883b..03a77883 100644 --- a/packages/react-hooks/src/AgentProvider.tsx +++ b/packages/react-hooks/src/AgentProvider.tsx @@ -7,7 +7,9 @@ import { createContext, useState, useContext } from 'react' import BasicMessageProvider from './BasicMessageProvider' import ConnectionProvider from './ConnectionProvider' +import CredentialFormatDataProvider from './CredentialFormatDataProvider' import CredentialProvider from './CredentialProvider' +import ProofFormatDataProvider from './ProofFormatDataProvider' import ProofProvider from './ProofProvider' import QuestionAnswerProvider from './QuestionAnswerProvider' import { useIsModuleRegistered } from './recordUtils' @@ -43,9 +45,17 @@ const AgentProvider: React.FC> = ({ agent, children }) - - {isQaRegistered ? {children} : children} - + + + + {isQaRegistered ? ( + {children} + ) : ( + children + )} + + + diff --git a/packages/react-hooks/src/BasicMessageProvider.tsx b/packages/react-hooks/src/BasicMessageProvider.tsx index 7ee8e52e..4a5f2e75 100644 --- a/packages/react-hooks/src/BasicMessageProvider.tsx +++ b/packages/react-hooks/src/BasicMessageProvider.tsx @@ -47,10 +47,8 @@ const BasicMessageProvider: React.FC> = ({ agent, child }) const setInitialState = async () => { - if (agent) { - const records = await agent.basicMessages.findAllByQuery({}) - setState({ records, loading: false }) - } + const records = await agent.basicMessages.findAllByQuery({}) + setState({ records, loading: false }) } useEffect(() => { @@ -58,24 +56,24 @@ const BasicMessageProvider: React.FC> = ({ agent, child }, [agent]) useEffect(() => { - if (!state.loading) { - const basicMessageAdded$ = recordsAddedByType(agent, BasicMessageRecord).subscribe((record) => - setState(addRecord(record, state)) - ) - - const basicMessageUpdated$ = recordsUpdatedByType(agent, BasicMessageRecord).subscribe((record) => - setState(updateRecord(record, state)) - ) - - const basicMessageRemoved$ = recordsRemovedByType(agent, BasicMessageRecord).subscribe((record) => - setState(removeRecord(record, state)) - ) - - return () => { - basicMessageAdded$?.unsubscribe() - basicMessageUpdated$?.unsubscribe() - basicMessageRemoved$?.unsubscribe() - } + if (state.loading) return + + const basicMessageAdded$ = recordsAddedByType(agent, BasicMessageRecord).subscribe((record) => + setState(addRecord(record, state)) + ) + + const basicMessageUpdated$ = recordsUpdatedByType(agent, BasicMessageRecord).subscribe((record) => + setState(updateRecord(record, state)) + ) + + const basicMessageRemoved$ = recordsRemovedByType(agent, BasicMessageRecord).subscribe((record) => + setState(removeRecord(record, state)) + ) + + return () => { + basicMessageAdded$?.unsubscribe() + basicMessageUpdated$?.unsubscribe() + basicMessageRemoved$?.unsubscribe() } }, [state, agent]) diff --git a/packages/react-hooks/src/ConnectionProvider.tsx b/packages/react-hooks/src/ConnectionProvider.tsx index d696eaad..6444961f 100644 --- a/packages/react-hooks/src/ConnectionProvider.tsx +++ b/packages/react-hooks/src/ConnectionProvider.tsx @@ -72,10 +72,8 @@ const ConnectionProvider: React.FC> = ({ agent, childre }) const setInitialState = async () => { - if (agent) { - const records = await agent.connections.getAll() - setState({ records, loading: false }) - } + const records = await agent.connections.getAll() + setState({ records, loading: false }) } useEffect(() => { @@ -83,24 +81,24 @@ const ConnectionProvider: React.FC> = ({ agent, childre }, [agent]) useEffect(() => { - if (!state.loading) { - const connectionAdded$ = recordsAddedByType(agent, ConnectionRecord).subscribe((record) => - setState(addRecord(record, state)) - ) - - const connectionUpdated$ = recordsUpdatedByType(agent, ConnectionRecord).subscribe((record) => - setState(updateRecord(record, state)) - ) - - const connectionRemoved$ = recordsRemovedByType(agent, ConnectionRecord).subscribe((record) => - setState(removeRecord(record, state)) - ) - - return () => { - connectionAdded$.unsubscribe() - connectionUpdated$.unsubscribe() - connectionRemoved$.unsubscribe() - } + if (state.loading) return + + const connectionAdded$ = recordsAddedByType(agent, ConnectionRecord).subscribe((record) => + setState(addRecord(record, state)) + ) + + const connectionUpdated$ = recordsUpdatedByType(agent, ConnectionRecord).subscribe((record) => + setState(updateRecord(record, state)) + ) + + const connectionRemoved$ = recordsRemovedByType(agent, ConnectionRecord).subscribe((record) => + setState(removeRecord(record, state)) + ) + + return () => { + connectionAdded$.unsubscribe() + connectionUpdated$.unsubscribe() + connectionRemoved$.unsubscribe() } }, [state, agent]) diff --git a/packages/react-hooks/src/CredentialFormatDataProvider.tsx b/packages/react-hooks/src/CredentialFormatDataProvider.tsx new file mode 100644 index 00000000..a33fa4b2 --- /dev/null +++ b/packages/react-hooks/src/CredentialFormatDataProvider.tsx @@ -0,0 +1,134 @@ +import type { Agent } from '@aries-framework/core' +import type { Awaited } from '@aries-framework/core/build/types' +import type { PropsWithChildren } from 'react' + +import { CredentialExchangeRecord } from '@aries-framework/core' +import React, { useState, createContext, useContext, useEffect } from 'react' + +import { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from './recordUtils' + +type FormatReturn = Awaited> + +export type CredentialFormatData = FormatReturn & { + id: string +} + +type FormattedDataState = { + formattedData: Array + loading: boolean +} + +const addRecord = (record: CredentialFormatData, state: FormattedDataState): FormattedDataState => { + const newRecordsState = [...state.formattedData] + newRecordsState.unshift(record) + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const updateRecord = (record: CredentialFormatData, state: FormattedDataState): FormattedDataState => { + const newRecordsState = [...state.formattedData] + const index = newRecordsState.findIndex((r) => r.id === record.id) + + if (index > -1) { + newRecordsState[index] = record + } + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const removeRecord = (recordId: string, state: FormattedDataState): FormattedDataState => { + const newRecordsState = state.formattedData.filter((r) => r.id !== recordId) + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const CredentialFormatDataContext = createContext(undefined) + +export const useCredentialsFormatData = () => { + const credentialFormatDataContext = useContext(CredentialFormatDataContext) + + if (!credentialFormatDataContext) { + throw new Error('useCredentialFormatData must be used within a CredentialFormatDataContextProvider') + } + + return credentialFormatDataContext +} + +export const useCredentialFormatDataById = (id: string): CredentialFormatData | undefined => { + const { formattedData } = useCredentialsFormatData() + return formattedData.find((c) => c.id === id) +} + +interface Props { + agent: Agent +} + +const CredentialFormatDataProvider: React.FC> = ({ agent, children }) => { + const [state, setState] = useState<{ + formattedData: Array + loading: boolean + }>({ + formattedData: [], + loading: true, + }) + + const fetchCredentialInformation = async (agent: Agent, record: CredentialExchangeRecord) => { + const formatData = await agent.credentials.getFormatData(record.id) + + return { ...formatData, id: record.id } + } + + const setInitialState = async () => { + const records = await agent.credentials.getAll() + const formattedData: Array = [] + for (const record of records) { + formattedData.push(await fetchCredentialInformation(agent, record)) + } + setState({ formattedData, loading: false }) + } + + useEffect(() => { + void setInitialState() + }, [agent]) + + useEffect(() => { + if (state.loading) return + + const credentialAdded$ = recordsAddedByType(agent, CredentialExchangeRecord).subscribe( + async (record: CredentialExchangeRecord) => { + const formatData = await fetchCredentialInformation(agent, record) + setState(addRecord(formatData, state)) + } + ) + + const credentialUpdate$ = recordsUpdatedByType(agent, CredentialExchangeRecord).subscribe( + async (record: CredentialExchangeRecord) => { + const formatData = await fetchCredentialInformation(agent, record) + setState(updateRecord(formatData, state)) + } + ) + + const credentialRemove$ = recordsRemovedByType(agent, CredentialExchangeRecord).subscribe((record) => + setState(removeRecord(record.id, state)) + ) + + return () => { + credentialAdded$.unsubscribe() + credentialUpdate$.unsubscribe() + credentialRemove$.unsubscribe() + } + }, [state, agent]) + + return {children} +} + +export default CredentialFormatDataProvider diff --git a/packages/react-hooks/src/CredentialProvider.tsx b/packages/react-hooks/src/CredentialProvider.tsx index 362a7225..b43c3a1a 100644 --- a/packages/react-hooks/src/CredentialProvider.tsx +++ b/packages/react-hooks/src/CredentialProvider.tsx @@ -44,10 +44,7 @@ export const useCredentialByState = (state: CredentialState | CredentialState[]) const { records: credentials } = useCredentials() const filteredCredentials = useMemo( - () => - credentials.filter((r: CredentialExchangeRecord) => { - if (states.includes(r.state)) return r - }), + () => credentials.filter((r: CredentialExchangeRecord) => states.includes(r.state)), [credentials] ) return filteredCredentials @@ -59,12 +56,10 @@ export const useCredentialNotInState = (state: CredentialState | CredentialState const { records: credentials } = useCredentials() const filteredCredentials = useMemo( - () => - credentials.filter((r: CredentialExchangeRecord) => { - if (!states.includes(r.state)) return r - }), + () => credentials.filter((r: CredentialExchangeRecord) => !states.includes(r.state)), [credentials] ) + return filteredCredentials } @@ -79,10 +74,8 @@ const CredentialProvider: React.FC> = ({ agent, childre }) const setInitialState = async () => { - if (agent) { - const records = await agent.credentials.getAll() - setState({ records, loading: false }) - } + const records = await agent.credentials.getAll() + setState({ records, loading: false }) } useEffect(() => { @@ -90,24 +83,24 @@ const CredentialProvider: React.FC> = ({ agent, childre }, [agent]) useEffect(() => { - if (!state.loading) { - const credentialAdded$ = recordsAddedByType(agent, CredentialExchangeRecord).subscribe((record) => - setState(addRecord(record, state)) - ) - - const credentialUpdated$ = recordsUpdatedByType(agent, CredentialExchangeRecord).subscribe((record) => - setState(updateRecord(record, state)) - ) - - const credentialRemoved$ = recordsRemovedByType(agent, CredentialExchangeRecord).subscribe((record) => - setState(removeRecord(record, state)) - ) - - return () => { - credentialAdded$?.unsubscribe() - credentialUpdated$?.unsubscribe() - credentialRemoved$?.unsubscribe() - } + if (state.loading) return + + const credentialAdded$ = recordsAddedByType(agent, CredentialExchangeRecord).subscribe((record) => + setState(addRecord(record, state)) + ) + + const credentialUpdated$ = recordsUpdatedByType(agent, CredentialExchangeRecord).subscribe((record) => + setState(updateRecord(record, state)) + ) + + const credentialRemoved$ = recordsRemovedByType(agent, CredentialExchangeRecord).subscribe((record) => + setState(removeRecord(record, state)) + ) + + return () => { + credentialAdded$?.unsubscribe() + credentialUpdated$?.unsubscribe() + credentialRemoved$?.unsubscribe() } }, [state, agent]) diff --git a/packages/react-hooks/src/ExchangesProvider.tsx b/packages/react-hooks/src/ExchangesProvider.tsx index 67c2f43a..da0375ea 100644 --- a/packages/react-hooks/src/ExchangesProvider.tsx +++ b/packages/react-hooks/src/ExchangesProvider.tsx @@ -38,13 +38,11 @@ const ExchangesProvider: React.FC> = ({ agent, children }) const setInitialState = () => { - if (agent) { - const { records: basicMessages } = useBasicMessages() - const { records: proofs } = useProofs() - const { records: credentials } = useCredentials() - const records = [...basicMessages, ...proofs, ...credentials] as BaseRecord[] - setState({ records, loading: false }) - } + const { records: basicMessages } = useBasicMessages() + const { records: proofs } = useProofs() + const { records: credentials } = useCredentials() + const records = [...basicMessages, ...proofs, ...credentials] as BaseRecord[] + setState({ records, loading: false }) } useEffect(() => { diff --git a/packages/react-hooks/src/ProofFormatDataProvider.tsx b/packages/react-hooks/src/ProofFormatDataProvider.tsx new file mode 100644 index 00000000..134818e5 --- /dev/null +++ b/packages/react-hooks/src/ProofFormatDataProvider.tsx @@ -0,0 +1,124 @@ +import type { Agent } from '@aries-framework/core' +import type { Awaited } from '@aries-framework/core/build/types' +import type { PropsWithChildren } from 'react' + +import { ProofExchangeRecord } from '@aries-framework/core' +import { useState, createContext, useContext, useEffect } from 'react' +import * as React from 'react' + +import { recordsAddedByType, recordsRemovedByType, recordsUpdatedByType } from './recordUtils' + +type FormatReturn = Awaited> + +export type ProofFormatData = FormatReturn & { id: string } + +type FormattedProofDataState = { + formattedData: Array + loading: boolean +} + +const addRecord = (record: ProofFormatData, state: FormattedProofDataState): FormattedProofDataState => { + const newRecordsState = [...state.formattedData] + newRecordsState.unshift(record) + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const updateRecord = (record: ProofFormatData, state: FormattedProofDataState): FormattedProofDataState => { + const newRecordsState = [...state.formattedData] + const index = newRecordsState.findIndex((r) => r.id === record.id) + + if (index > -1) { + newRecordsState[index] = record + } + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const removeRecord = (record: ProofExchangeRecord, state: FormattedProofDataState): FormattedProofDataState => { + const newRecordsState = state.formattedData.filter((r) => r.id !== record.id) + + return { + loading: state.loading, + formattedData: newRecordsState, + } +} + +const ProofFormatDataContext = createContext(undefined) + +export const useProofsFormatData = () => { + const proofFormatDataContext = useContext(ProofFormatDataContext) + + if (!proofFormatDataContext) { + throw new Error('useProofFormatData must be used within a ProofFormatDataContextProvider') + } + + return proofFormatDataContext +} + +export const useProofFormatDataById = (id: string): ProofFormatData | undefined => { + const { formattedData } = useProofsFormatData() + return formattedData.find((c) => c.id === id) +} + +interface Props { + agent: Agent +} + +const ProofFormatDataProvider: React.FC> = ({ agent, children }) => { + const [state, setState] = useState<{ + formattedData: Array + loading: boolean + }>({ + formattedData: [], + loading: true, + }) + + const setInitialState = async () => { + const records = await agent.proofs.getAll() + const formattedData: Array = [] + for (const record of records) { + const formatData = await agent.proofs.getFormatData(record.id) + formattedData.push({ ...formatData, id: record.id }) + } + setState({ formattedData, loading: false }) + } + + useEffect(() => { + void setInitialState() + }, [agent]) + + useEffect(() => { + if (state.loading) return + + const proofAdded$ = recordsAddedByType(agent, ProofExchangeRecord).subscribe(async (record) => { + const formatData = await agent.proofs.getFormatData(record.id) + setState(addRecord({ ...formatData, id: record.id }, state)) + }) + + const proofUpdate$ = recordsUpdatedByType(agent, ProofExchangeRecord).subscribe(async (record) => { + const formatData = await agent.proofs.getFormatData(record.id) + setState(updateRecord({ ...formatData, id: record.id }, state)) + }) + + const proofRemove$ = recordsRemovedByType(agent, ProofExchangeRecord).subscribe((record) => + setState(removeRecord(record, state)) + ) + + return () => { + proofAdded$.unsubscribe() + proofUpdate$.unsubscribe() + proofRemove$.unsubscribe() + } + }, [state, agent]) + + return {children} +} + +export default ProofFormatDataProvider diff --git a/packages/react-hooks/src/ProofProvider.tsx b/packages/react-hooks/src/ProofProvider.tsx index 1085729c..d5b5c6b0 100644 --- a/packages/react-hooks/src/ProofProvider.tsx +++ b/packages/react-hooks/src/ProofProvider.tsx @@ -81,10 +81,8 @@ const ProofProvider: React.FC> = ({ agent, children }) }) const setInitialState = async () => { - if (agent) { - const records = await agent.proofs.getAll() - setState({ records, loading: false }) - } + const records = await agent.proofs.getAll() + setState({ records, loading: false }) } useEffect(() => { @@ -92,24 +90,24 @@ const ProofProvider: React.FC> = ({ agent, children }) }, [agent]) useEffect(() => { - if (!state.loading) { - const proofAdded$ = recordsAddedByType(agent, ProofExchangeRecord).subscribe((record) => - setState(addRecord(record, state)) - ) - - const proofUpdated$ = recordsUpdatedByType(agent, ProofExchangeRecord).subscribe((record) => - setState(updateRecord(record, state)) - ) - - const proofRemoved$ = recordsRemovedByType(agent, ProofExchangeRecord).subscribe((record) => - setState(removeRecord(record, state)) - ) - - return () => { - proofAdded$?.unsubscribe() - proofUpdated$?.unsubscribe() - proofRemoved$?.unsubscribe() - } + if (state.loading) return + + const proofAdded$ = recordsAddedByType(agent, ProofExchangeRecord).subscribe((record) => + setState(addRecord(record, state)) + ) + + const proofUpdated$ = recordsUpdatedByType(agent, ProofExchangeRecord).subscribe((record) => + setState(updateRecord(record, state)) + ) + + const proofRemoved$ = recordsRemovedByType(agent, ProofExchangeRecord).subscribe((record) => + setState(removeRecord(record, state)) + ) + + return () => { + proofAdded$?.unsubscribe() + proofUpdated$?.unsubscribe() + proofRemoved$?.unsubscribe() } }, [state, agent]) diff --git a/packages/react-hooks/src/index.ts b/packages/react-hooks/src/index.ts index f868b25b..ebfbe692 100644 --- a/packages/react-hooks/src/index.ts +++ b/packages/react-hooks/src/index.ts @@ -1,6 +1,10 @@ +import type { CredentialFormatData } from './CredentialFormatDataProvider' +import type { ProofFormatData } from './ProofFormatDataProvider' + import AgentProvider, { useAgent } from './AgentProvider' import { useBasicMessages, useBasicMessagesByConnectionId } from './BasicMessageProvider' import { useConnections, useConnectionById } from './ConnectionProvider' +import { useCredentialsFormatData, useCredentialFormatDataById } from './CredentialFormatDataProvider' import { useCredentials, useCredentialById, @@ -9,9 +13,12 @@ import { useCredentialsByConnectionId, } from './CredentialProvider' import { useExchanges, useExchangesByConnectionId } from './ExchangesProvider' +import { useProofsFormatData, useProofFormatDataById } from './ProofFormatDataProvider' import { useProofs, useProofById, useProofByState, useProofNotInState, useProofsByConnectionId } from './ProofProvider' import { useQuestionAnswer, useQuestionAnswerByConnectionId, useQuestionAnswerById } from './QuestionAnswerProvider' +export type { ProofFormatData, CredentialFormatData } + export { useAgent, useBasicMessages, @@ -33,6 +40,10 @@ export { useExchanges, useExchangesByConnectionId, useProofsByConnectionId, + useProofsFormatData, + useProofFormatDataById, + useCredentialFormatDataById, + useCredentialsFormatData, } export default AgentProvider diff --git a/yarn.lock b/yarn.lock index 1473c4d5..07eedfe5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -91,6 +91,39 @@ varint "^6.0.0" web-did-resolver "^2.0.21" +"@aries-framework/core@0.4.2", "@aries-framework/core@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@aries-framework/core/-/core-0.4.2.tgz#f2118c732d6aff8d6557a15de14381e8782b54a1" + integrity sha512-2qmDRkxD5vnPlcMjVTqu/Wxog9bUVU+tSr+7mgANgJ9q170FuoSuChU7WA5VCKEdmbRIM4BmvsnTlU8Y+iQ07A== + dependencies: + "@digitalcredentials/jsonld" "^5.2.1" + "@digitalcredentials/jsonld-signatures" "^9.3.1" + "@digitalcredentials/vc" "^1.1.2" + "@multiformats/base-x" "^4.0.1" + "@stablelib/ed25519" "^1.0.2" + "@stablelib/random" "^1.0.1" + "@stablelib/sha256" "^1.0.1" + "@types/node-fetch" "2.6.2" + "@types/ws" "^8.5.4" + abort-controller "^3.0.0" + big-integer "^1.6.51" + borc "^3.0.0" + buffer "^6.0.3" + class-transformer "0.5.1" + class-validator "0.14.0" + did-resolver "^4.1.0" + lru_map "^0.4.1" + luxon "^3.3.0" + make-error "^1.3.6" + object-inspect "^1.10.3" + query-string "^7.0.1" + reflect-metadata "^0.1.13" + rxjs "^7.2.0" + tsyringe "^4.8.0" + uuid "^9.0.0" + varint "^6.0.0" + web-did-resolver "^2.0.21" + "@aries-framework/indy-sdk@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@aries-framework/indy-sdk/-/indy-sdk-0.4.0.tgz#d4bb59cf010b2e9166982d4a7a0103325bde9b80" @@ -131,12 +164,12 @@ ref-napi "^3.0.3" ws "^8.13.0" -"@aries-framework/question-answer@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@aries-framework/question-answer/-/question-answer-0.4.0.tgz#f7e81f76b48a9d79710dd499b7acd0450a0a5422" - integrity sha512-r2Lwuj+RI7jVK8hQppa9qJb98L6A+QdjLfUsp5pHzia86yuSTpz5TrkXgJFvNMgkyQjagMflrCU4LSf94NFd9w== +"@aries-framework/question-answer@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@aries-framework/question-answer/-/question-answer-0.4.2.tgz#f5d29f77d1545e2823d2296cf9a8e6d2a190ed2c" + integrity sha512-rk1ODjPjOjDsjUuEJ/A8vkiW3MPpCoQk1SaVrUVKvtyPFN52oPWvzANImGHFce0E/S440yBxYIr152JlRELb0w== dependencies: - "@aries-framework/core" "0.4.0" + "@aries-framework/core" "0.4.2" class-transformer "0.5.1" class-validator "0.14.0" rxjs "^7.2.0" @@ -2102,7 +2135,15 @@ dependencies: "@types/express" "*" -"@types/node-fetch@^2", "@types/node-fetch@^2.5.10", "@types/node-fetch@^2.6.3", "@types/node-fetch@^2.6.4": +"@types/node-fetch@2.6.2": + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node-fetch@^2.5.10", "@types/node-fetch@^2.6.3", "@types/node-fetch@^2.6.4": version "2.6.4" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== @@ -8325,7 +8366,7 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tsyringe@^4.5.0, tsyringe@^4.6.0, tsyringe@^4.7.0: +tsyringe@^4.5.0, tsyringe@^4.6.0, tsyringe@^4.7.0, tsyringe@^4.8.0: version "4.8.0" resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.8.0.tgz#d599651b36793ba872870fee4f845bd484a5cac1" integrity sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==